【问题标题】:Setting program icon without resources using the WIN32 API使用 WIN32 API 设置没有资源的程序图标
【发布时间】:2013-08-21 07:12:49
【问题描述】:

我正在使用 Visual Studio 的快速版本。因此,使用函数调用 MAKEINTRESOURCE 是不可能的。我正在尝试通过覆盖 getAdditionalClassInfo 函数来设置应用程序图标。

WNDCLASSW *Robot::getAdditionalClassInfo(void) const {
    WNDCLASSW *wc = Window::getAdditionalClassInfo();
    HANDLE hIcon = LoadImage(NULL, L"imagepath/image.png", 32, 32, LR_LOADFROMFILE);

    wc->hIcon = .....;
    return wc;
}

有谁知道如何在不使用资源的情况下设置此图标?

【问题讨论】:

  • 你必须使用资源。当您有大量空闲时间来弄清楚如何编写 .rc 文件时,使用 Express 版本是可以的。它是一个学习版。
  • 您对LoadImage 的调用缺少类型参数(IMAGE_ICON),我不知道Windows 是否接受直接加载PNG 文件作为图标;您应该首先使用 Gimp 之类的程序使其成为实际的图标文件 (.ico)。就像 Hans 说的,你“可以”用 Express 版本制作资源,只需要手动编写 .rc 文件(Express 版本带有资源编译器,即使它没有资源编辑器)。
  • 不要深入这个。要么通过免费的资源编辑器与 Express 一起使用来让你的生活过得愉快,要么购买商业版。
  • 包含单个图标的 .rc 文件几乎没有那么复杂。

标签: c++ visual-studio-2010 winapi resources icons


【解决方案1】:

如果您想使用 PNG 并能够更改图标,我的建议是使用 FreeImage 来加载它。然后,您可以使用 FreeImage 相当轻松地将其转换为标准 HBITMAP。

如果您可以使用实际的图标文件,则可以在创建窗口后执行以下操作:

HANDLE hIcon = LoadImage(0, _T("imagepath/image.ico"), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
if (hIcon) {
    //Change both icons to the same icon handle.
    SendMessage(hwnd, WM_SETICON, ICON_SMALL, hIcon);
    SendMessage(hwnd, WM_SETICON, ICON_BIG, hIcon);

    //This will ensure that the application icon gets changed too.
    SendMessage(GetWindow(hwnd, GW_OWNER), WM_SETICON, ICON_SMALL, hIcon);
    SendMessage(GetWindow(hwnd, GW_OWNER), WM_SETICON, ICON_BIG, hIcon);
}

您可以从getAdditionalClassInfo 中调用类似的函数并将其设置为hIcon

【讨论】:

  • 是否应该在此之后以某种方式释放hIcon
  • @MattMcNabb 在不再需要它之前不要发布它。在窗口卸载之前释放它会搞砸。
  • 所以我必须将此句柄与窗口类一起存储,然后在窗口被销毁时对其调用 CloseHandle?
  • 根据MSDN doc另一个选项是设置LR_SHARED
  • @MattMcNabb 对不起,我的错 :)。
猜你喜欢
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多