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

标签 c++ winapi visual-c++ bitmap icons

如何在VC++中将HICON转成HBITMAP?

我知道这是一个常见问题解答,但我在 Google 上找到的所有解决方案都不起作用。我需要的是一个接受参数 HICON 并返回 HBITMAP 的函数。

即使图标是 24 位、16 位或 8 位,也尽可能转换为 32 位位图。

这是代码,我不知道哪里错了:

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;
}

最佳答案

这段代码做到了:

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

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

IDI_ICON ICON "example.ico"

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

#define IDI_ICON 4000

关于c++ - 如何在 VC++ 中将 HICON 转换为 HBITMAP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7375003/

相关文章:

c++ - 从 Vis C++ 控制台应用程序打开 OpenDialog?

c++ - Visual Studio C++ : Refactoring between member and non-member functions

c++ - 函数特化

c++ - i的值是在: int i, j = 1之后定义的;

c# - 为什么 EnumChildWindows 会跳过 child ?

c - 使用内联汇编从 C 函数获取返回的字符

c++ - Qt UIThreadWidget

c++ - 如何将 C++ 函数指针作为带有一些固定值的参数传递?

.net - Desktop App Converter 失败,出现 E_CREATING_ISOLATED_ENV_FAILED 错误 (DirectoryNotFoundException)

c++ - 为什么 windows GDI 对 `COLORREF` 使用 RGBA 格式而不是 BGRA?