使用win32api c++绘制图标



我正试图用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;
}

最新更新