C++ 使用WIN32 API设置没有资源的程序图标

C++ 使用WIN32 API设置没有资源的程序图标,c++,visual-studio-2010,winapi,resources,icons,C++,Visual Studio 2010,Winapi,Resources,Icons,我正在使用Visual Studio的快速版本。因此,使用函数调用MAKEINTRESOURCE是不可能的。我试图通过覆盖getAdditionalClassInfo函数来设置应用程序图标 WNDCLASSW *Robot::getAdditionalClassInfo(void) const { WNDCLASSW *wc = Window::getAdditionalClassInfo(); HANDLE hIcon = LoadImage(NULL, L"imagepath

我正在使用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;
}

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

如果您想使用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

您必须使用资源。当您有很多空闲时间来了解如何编写.rc文件时,使用Express edition是可以的。这是一个学习版。您对
LoadImage
的调用缺少类型参数(
IMAGE\u ICON
),我不知道Windows是否接受直接将PNG文件作为图标加载;您应该首先使用像Gimp这样的程序使其成为实际的图标文件(.ico)。同样,正如Hans所说,您“可以”使用Express版本生成资源,只需手动编写.rc文件(Express版本附带资源编译器,即使它没有资源编辑器)。不要深入讨论这个问题。让免费资源编辑器与Express一起使用,让您的生活变得可以忍受,或者购买商业版。包含单个图标的.rc文件并没有那么复杂。
hIcon
应该在这之后以某种方式发布吗?@MattMcNabb在不再需要之前不要发布它。在卸载窗口之前释放它会把事情搞得一团糟。因此,我必须将此句柄与窗口类一起存储,然后在窗口被破坏时调用CloseHandle?根据另一个选项是设置LR_SHARED@MattMcNabb对不起,我的错:)。