Я пытаюсь выяснить, почему я не могу загрузить изображение с ресурса.
Изображения работают, когда lpszName является именем файла, а при смене ресурса — нет.
Изображения создаются одинаково (можно поменять, та же проблема)
Изображения находятся внутри файлов Resource и Resource.rc.
Код:
LRESULT CALLBACK WndProc(HWND hWinMain, UINT message, WPARAM wParam, LPARAM lParam)
{
DWORD
lastError;
static HDC
hdcFromResource,
hdcFromFilename;
HBITMAP
hFromResource,
hFromResourcePrevious,
hFromFilename,
hFromFilenamePrevious;
HDC
hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE:
hdc = GetDC(hWinMain);
hdcFromFilename = CreateCompatibleDC(hdc);
hdcFromResource = CreateCompatibleDC(hdc);
ReleaseDC(hWinMain, hdc);
hFromFilename = (HBITMAP)LoadImageW(NULL, (L"filename.bmp"), IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE);
if (!hFromFilename)
{
// ERROR HANDELING
}
hFromFilenamePrevious = (HBITMAP)SelectObject(hdcFromFilename, hFromFilename);
DeleteObject(hFromFilename);
DeleteObject(hFromFilenamePrevious);
hFromResource = (HBITMAP)LoadImageW(NULL, MAKEINTRESOURCEW(IDB_RESOURCE), IMAGE_BITMAP, 100, 100, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
lastError = GetLastError();
lastError;
hFromResourcePrevious = (HBITMAP)SelectObject(hdcFromResource, hFromResource);
DeleteObject(hFromResource);
DeleteObject(hFromResourcePrevious);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWinMain, &ps);
BitBlt(hdc, 0, 0, 100, 100, hdcFromFilename, 0, 0, SRCCOPY);
BitBlt(hdc, 100, 100, 100, 100, hdcFromResource, 0, 0, SRCCOPY);
EndPaint(hWinMain, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWinMain, message, wParam, lParam);
}
if(!hFromFilename)
никогда не запускается независимо от того, загружено изображение или нет.
Ни одна из точек останова после неудачных разрывов загрузки изображения (точки останова через WM_CREATE, другие точки останова в других функциях работают как обычно)
Я не уверен, как легко прочитать GetLastError без точки останова.
resource.h
#define IDB_RESOURCE 101
Resource.rc
#define IDB_RESOURCE BITMAP DISCARDABLE "resource.bmp"
Проблема, на которую ответил Кристофер Оиклз, заключалась в том, что LR_LOADFROMFILE не нужен.
Может быть полезным для других:
LoadImage(
NULL, // NULL for load image via filename
L("directory\\filename.bmp"), // String to filename
IMAGE_BITMAP // Flag for loading bitmap
0, // 0 Should use the images actual width
0, // 0 Should use the images actual height
LR_LOADFROMFILE // Flag for loading from file
);
LoadImage(
hInstance, // hInstance to the file containing the resource
MAKEINTRESOURCE(IDB_RESOURCE), // Resource definition
IMAGE_BITMAP // Flag for loading bitmap
0, // 0 Should use the images actual width
0, // 0 Should use the images actual height
LR_CREATEDIBSECTION // Do not use LR_LOADFROMFILE if it is a resource
);
Resourcefile.h
#define IDB_RESOURCE 101 // Resource ID, and number
Resourcescript.rc
#include "Resourcefile.h"IDB_RESOURCE BITMAP "directory\\filename.bmp" // Resource ID, type, and filename
Спасибо.
Других решений пока нет …