如何在VC++中将HICON转换为HBITMAP?

jon*_*ham 4 c++ winapi icons bitmap visual-c++

如何在VC++中将HICON转换为HBITMAP?

我知道这是一个FAQ,但我在Google上找到的所有解决方案都不起作用.我需要的是一个带参数HICON并返回HBITMAP的函数.

如果可能的话,最大可以转换为32位位图,即使图标是24位,16位或8位.

这是代码,我不知道它出错了:

HBITMAP icon_to_bitmap(HICON Icon_Handle) {
  HDC Screen_Handle = GetDC(NULL);
  HDC Device_Handle = CreateCompatibleDC(Screen_Handle);

  HBITMAP Bitmap_Handle = 
  CreateCompatibleBitmap(Device_Handle,GetSystemMetrics(SM_CXICON),
  GetSystemMetrics(SM_CYICON));

  HBITMAP Old_Bitmap = (HBITMAP)SelectObject(Device_Handle,Bitmap_Handle);
  DrawIcon(Device_Handle, 0,0, Icon_Handle);
  SelectObject(Device_Handle,Old_Bitmap);

  DeleteDC(Device_Handle);
  ReleaseDC(NULL,Screen_Handle);
  return Bitmap_Handle;
}
Run Code Online (Sandbox Code Playgroud)

小智 7

HDC hDC = GetDC(NULL);
HDC hMemDC = CreateCompatibleDC(hDC);
HBITMAP hMemBmp = CreateCompatibleBitmap(hDC, x, y);
HBITMAP hResultBmp = NULL;
HGDIOBJ hOrgBMP = SelectObject(hMemDC, hMemBmp);

DrawIconEx(hMemDC, 0, 0, hIcon, x, y, 0, NULL, DI_NORMAL);

hResultBmp = hMemBmp;
hMemBmp = NULL;

SelectObject(hMemDC, hOrgBMP);
DeleteDC(hMemDC);
ReleaseDC(NULL, hDC);
DestroyIcon(hIcon);
return hResultBmp;
Run Code Online (Sandbox Code Playgroud)


use*_*067 5

这段代码可以做到:

HICON hIcon = (HICON)LoadImage(instance, MAKEINTRESOURCEW(IDI_ICON), IMAGE_ICON, width, height, 0);
ICONINFO iconinfo;
GetIconInfo(hIcon, &iconinfo);
HBITMAP hBitmap = iconinfo.hbmColor;
Run Code Online (Sandbox Code Playgroud)

这是* .rc文件中的代码:

IDI_ICON ICON "example.ico"
Run Code Online (Sandbox Code Playgroud)

这是* .h文件中的代码:

#define IDI_ICON 4000
Run Code Online (Sandbox Code Playgroud)


Mig*_*uel 3

我没有现成的代码可供共享,但我认为这非常简单。您必须创建 HBITMAP,创建设备上下文,将位图选择到 DC 中(这将使位图成为该 DC 的绘图区域)。最后调用DrawIcon()函数在这个DC上绘制你的图标。之后,将位图与 DC 分离并销毁 DC。您的位图现在应该已准备就绪。

查看代码后更新:

我相信问题出在 createCompatibleBitmap 调用中。您要求提供与内存 DC 兼容的位图,但内存 DC 是从选择的 1 位/像素位图开始的。尝试请求与屏幕 DC 兼容的位图。

更新 2:您可能想看看这个问题,因为它似乎与您的问题相关。