我正试图用win32api在我的窗口上绘制一个图标。这是我加载图像的地方。
case WM_CREATE: {
HANDLE image = (HICON)LoadImage(NULL, TEXT("Button.ico"), IMAGE_ICON, 16, 16, LR_LOADFROMFILE | LR_LOADTRANSPARENT);
break;
}
这是我尝试在屏幕上绘制图标的地方。
case WM_NCPAINT: {
PAINTSTRUCT ps;
BITMAP bm;
HDC hdc = BeginPaint(ParentHwnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = SelectObject(hdcMem, image);
GetObject(image, sizeof(bm), &bm);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
EndPaint(ParentHwnd, &ps);
break;
}
出于某种原因,我在SelectObject((上得到了这个错误;
E0144 a value of type "HGDIOBJ" cannot be used to initialize an entity of type "HBITMAP"
我正在使用Visual Studio社区2019。我到处找答案。提前感谢您的帮助。
首先,不应该在WM_NCPAINT
处理程序中使用BeginPaint()
,而应该在WM_PAINT
处理程序中才使用。根据WM_NCPAINT
文档,请改用GetDCEx()
。
第二,你可能已经打开了STRICT类型检查(这是一件好事(,这就是为什么你会得到编译器错误。在STRICT
下,不能将HGDIOBJ
(又名void*
(分配给HBITMAP
(又名struct HBITMAP__*
(,因此需要显式键入SelectObject()
的返回值。但是,您正在加载一个HICON
,无法将其原样选择为HDC
,因此您必须执行以下操作之一:
- 加载BMP文件而不是ICO文件
- 将CCD_ 14数据转换为实际的CCD_
- 使用CCD_ 16或CCD_
三,在WM_CREATE
处理程序中,image
变量是该消息处理程序的本地变量,因此在WM_NCPAINT
处理程序中访问的任何image
都不是同一个变量。
试试这个:
HBITMAP image;
...
case WM_CREATE: {
HICON icon = (HICON) LoadImage(NULL, TEXT("Button.ico"), IMAGE_ICON, 16, 16, LR_LOADFROMFILE | LR_LOADTRANSPARENT);
// convert icon to image as needed...
DestroyIcon(icon);
break;
}
case WM_NCPAINT: {
BITMAP bm;
HDC hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW | DCX_INTERSECTRGN);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = (HBITMAP) SelectObject(hdcMem, image);
GetObject(image, sizeof(bm), &bm);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
ReleaseDC(hwnd, hdc);
break;
}
或者这个:
HICON image;
...
case WM_CREATE: {
image = (HICON) LoadImage(NULL, TEXT("Button.ico"), IMAGE_ICON, 16, 16, LR_LOADFROMFILE | LR_LOADTRANSPARENT);
break;
}
case WM_DESTROY: {
DestroyIcon(image);
break;
}
case WM_NCPAINT: {
HDC hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
DrawIcon(hdc, 0, 0, image);
ReleaseDC(hwnd, hdc);
break;
}