【发布时间】:2019-09-15 14:34:49
【问题描述】:
我正在尝试在启动应用程序时加载一些位图。我正在尝试将它们加载到WM_CREATE,但只有我加载的最后一个位图会保持加载状态。
我可以将图片加载到WM_PAINT,但有人告诉我最好将它们加载到WM_CREATE。
//before switch statement
static HBITMAP bitmap1, bitmap2;
case WM_CREATE: {
HINSTANCE hInstance = GetModuleHandle(NULL);
bitmap1 = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(IDB_BITMAP1),
IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
bitmap2 = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(IDB_BITMAP2),
IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
if (!bitmap1 || !bitmap2) MessageBox(NULL, _T("Error while loading images"), _T("Error!"), MB_ICONEXCLAMATION | MB_OK);
case WM_PAINT:{
//Draw bitmap...
}
我希望两个位图都像在 WM_PAINT 中加载时那样加载
编辑:
问题不是我想的。问题是它在我制作的填充区域后面绘制。我仍然不知道如何解决。
//Draw bitmap function
bool DrawBitmap(HBITMAP hBitmap, int posX, int posY, int sizeX, int sizeY)
{
BITMAP bmp;
HWND hWnd = FindWindow(windowClassName, NULL);
if (!hWnd) return false;
HDC hdc = GetDC(hWnd);
if (!hdc) return false;
HDC hBitmapDC = CreateCompatibleDC(hdc);
if (!hBitmapDC) return false;
GetObject(hBitmap, sizeof(bmp), &bmp);
SelectObject(hBitmapDC, hBitmap);
BitBlt(hdc, posX, posY, sizeX, sizeY, hBitmapDC, 0, 0, SRCCOPY);
DeleteObject(hBitmap);
ReleaseDC(hWnd, hBitmapDC);
ReleaseDC(hWnd, hdc);
return true;
}
//Before switch
RECT recRect;
STATIC HBITMAP bitmap1;
//case WM_CREATE:
case WM_CREATE: {
HINSTANCE hInstance = GetModuleHandle(NULL);
bitmap1 = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(IDB_BITMAP1),
IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
if (!bitmap) MessageBox(NULL, _T("Error while loading images"), _T("Error!"), MB_ICONEXCLAMATION | MB_OK);
return 0;
break;
//case WM_PAINT
case WM_PAINT:
DefWindowProc(hwnd, msg, wParam, lParam);
hdc = GetWindowDC(hwnd);
recRect = { -1, -1, 50 + 1, 30 + 1 };
FillRect(hdc, &recRect, (HBRUSH)CreateSolidBrush(RGB(30, 30, 30)));
if (DrawBitmap(bitmap1, 5, 5, 10, 10) == false) MessageBox(NULL, _T("Error while drawing images"), _T("Error!"), MB_ICONEXCLAMATION | MB_OK);
return DefWindowProc(hwnd, msg, wParam, lParam);
return 0;
break;
当我在WM_PAINT中声明位图时不会出现问题
【问题讨论】:
-
您应该在每次调用 LoadImage 时调用
GetLastError,而不仅仅是忽略可能发生的错误。见the documentation -
但是如果有错误它不应该返回NULL吗?
-
是的,如果它返回NULL,那么你需要立即调用
GetLastError获取更多信息。您在尝试诊断问题时犯了两个错误 - 1) 您未能调用 GetLastError 来获取更多信息,以及 2) 您对 LoadBitmap 进行了一次调用,而不是检查该调用的返回值,而是再次调用加载位图。如果位图为 NULL,则每次调用都需要进行错误检查和 GetLastError(),不要等到您想测试 null 返回值。 -
你知道
!bitmap1是一个空检查,对吧?所以你正在检查NULL,但你检查得太晚了。您应该在调用LoadBitmap后立即检查NULL。您的检查代码不正确。bitmap1 = LoadBitmap(); if (!bitmap1) { DWORD errorVal = GetLastError(); display_error_message_and_error_value;}那么如果bitmap1不为NULL,那么你使用相同的逻辑加载bitmap2。您不应该先加载每个位图并延迟检查——使用这种逻辑会丢失有关错误加载位图的所有信息。 -
WM_CREATE和WM_PAINT之间真的没有break;吗?