(Растровое изображение) LoadImage () возвращает NULL, а GetLastError () возвращает 0 - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь нарисовать растровый файл в окне.Поэтому я использовал (HBITMAP) LoadImage (), и он возвращает NULL.Я использовал GetLastError, чтобы увидеть проблему, но она также возвращает 0.Я работаю над goorm ide (приложение для Windows).

    case WM_CREATE:
            {
                hBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), "image.bmp", IMAGE_BITMAP, 0, 0, 
                LR_DEFAULTSIZE | LR_LOADFROMFILE);
                if(hBitmap == NULL){
                    DWORD errorCode = GetLastError();
                    if(errorCode != 0){
                        LPSTR messageBuffer = nullptr;
                        FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                        NULL,
                        errorCode,
                        0,
                        (LPTSTR)&messageBuffer,
                        0,
                        NULL);
                        MessageBox(hWnd, messageBuffer, "hBitmap is NULL!" , MB_OK);
                    }else{
                        MessageBox(hWnd, "hBitmap is null but errorCode is 0", "???" , MB_OK);
                    }
                }

                BITMAP bm; 
                CHAR szBuffer[255];
                GetObject(hBitmap, sizeof(BITMAP), &bm);
                break;
            }
    case WM_PAINT:
            {
                hdc = BeginPaint(hWnd, &ps);
                MemDC=CreateCompatibleDC(hdc);
                OldBitmap=(HBITMAP)SelectObject(MemDC, hBitmap);
                bool isSuccess = BitBlt(hdc, 0,0,655,380,MemDC,0,0,SRCCOPY);
                SelectObject(MemDC,OldBitmap);
                DeleteObject(hBitmap);
                DeleteDC(MemDC);
                EndPaint(hWnd, &ps);
                break;
            }

Если я заменю «image.bmp» на «asdf.bmp» в коде, он говорит: «файла нет».поэтому я уверен, что он нашел файл, но, кажется, не работает правильно.когда я печатаю ширину и высоту растрового изображения, он показывает странное число (например, 12312321, -3453453).Я не могу найти в чем проблема.

Я тоже пробовал это: (из https://support.microsoft.com/en-us/help/158898/howto-how-to-use-loadimage-to-read-a-bmp-file)

hBitmap = (HBITMAP)LoadImage( NULL, "image.bmp", IMAGE_BITMAP, 0, 0,
               LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );

Я отправлю полный код, если вы хотите.

https://ide -run.goorm.io / рабочее пространство / onMe язык = корь и тема = -Темный #

?

1 Ответ

0 голосов
/ 30 сентября 2019

Я создаю самое простое приложение для рабочего стола Windows.

И только добавил WM_CREATE и WM_PAINT события сообщений.

Я добавил свой собственный образ BMP и могу успешно загрузить его.

Примерно так:

hBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), L"C:\\Users\\strives\\Desktop\\panda.bmp", IMAGE_BITMAP, 0, 0,
            LR_DEFAULTSIZE | LR_LOADFROMFILE);

Исходя из своего ответа в комментариях, вы пытались использовать абсолютный путь для загрузки изображения, но не рассматривали проблему.Это формат изображения, если вы только что изменили суффикс изображения JPG на .bmp, тогда ваш hBitmap вернет 0, а GetLasterror также вернет 0.

Так что все, что вам нужно сделать, этоиспользуйте правильно отформатированное изображение BMP.Если такого изображения нет, воспользуйтесь инструментом преобразования формата изображения.

Кроме того, я уже встречал похожий пост ранее, вы можете сослаться на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...