C++ Win32 在WM_CREATE中加载多个位图不会加载
C++ Win32 loading multiple bitmaps in WM_CREATE won't load
我正在尝试在启动应用程序时加载一些位图。我正在尝试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
中声明位图时不会出现此问题
-
GetWindowDC
返回整个窗口(包括非工作区(的 dc。您通常需要GetDC
。 -
响应
WM_PAINT
时始终使用BeginPaint/EndPaint
并返回 0。 -
CreateSolidBrush
是 GDI 资源泄漏。创建画笔或其他 GDI 对象后,必须销毁这些对象,否则资源泄漏,程序将在 10,000 次 GDI 泄漏后崩溃。 -
在绘制函数中,您有
DeleteObject(hBitmap)
这将立即销毁位图。但是您可能希望保留位图句柄,并仅在程序完成后销毁它。
建议:
bool DrawBitmap(HDC hdc, HBITMAP hBitmap, int posX, int posY, int sizeX, int sizeY)
{
HDC memdc = CreateCompatibleDC(hdc);
HGDIOBJ oldbmp = SelectObject(memdc, hBitmap);
BitBlt(hdc, posX, posY, sizeX, sizeY, memdc, 0, 0, SRCCOPY);
SelectObject(memdc, oldbmp);
DeleteDC(memdc);
return true;
}
...
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HBRUSH hbrush = CreateSolidBrush(RGB(255, 0, 0));
FillRect(hdc, &ps.rcPaint, hbrush);
DeleteObject(hbrush);
BITMAP bm1;
GetObject(bitmap1, sizeof(bm1), &bm1);
DrawBitmap(hdc, bitmap1, 0, 0, bm1.bmWidth, bm1.bmHeight);
int x = bm1.bmWidth;
int y = bm1.bmHeight;
BITMAP bm2;
GetObject(bitmap2, sizeof(bm2), &bm2);
DrawBitmap(hdc, bitmap2, x, y, bm2.bmWidth, bm2.bmHeight);
EndPaint(hwnd, &ps);
return 0;
}
case WM_DESTROY:
DeleteObject(bitmap1);
DeleteObject(bitmap2);
PostQuitMessage(0);
return 0;
相关文章:
- 如何从路径字符串加载Gdiplus::位图
- 如何从资源文件(.rc 文件)加载位图?
- 如何诊断保存和加载位向量(std::vector)的奇怪行为<bool>?
- 尝试从资源加载位图返回NULL,错误代码为1813
- 使用D3DXLOADSURFAFROMEMORY加载位图
- Assimp加载排放图
- 快板 5 如何隐藏/卸载位图
- 正在将位图加载到窗口
- c++ GDI 位图不想加载
- 无法从资源加载位图
- 如何在不使用外部库的情况下加载到 8 位C++位图图像
- 直接2D 加载和绘制位图
- 无法从内存正确加载位图
- 在SDL中对X位图加载器进行编码
- 在C++中加载位图时出现Big Endian问题
- Directx 位图无法加载
- 是否有一些方法可以使用CBitmap::FromHandle在Cimagelist上加载位图
- 使用GetDIBits加载位图
- 加载位图文件(.bmp)
- visual studio 2010 -加载位图图像到WINApi c++和显示