在C++ Win32 API中使用对话框窗口上的图标

8
我正在尝试创建一个带有顶部图标的对话框,如下所示。 icon dialog 我使用资源文件来加载图标,如下所示。
IDI_ICON1          ICON           ".\\usb.ico"

我已经尝试使用以下代码设置窗口图标。
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)IDI_ICON1);
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)IDI_ICON1);

hwnd代表窗口。因此,我得到了一个蓝色的圆圈,看起来就像Windows 7和Vista的加载图标。我几乎可以确定这个图标被正确地加载了,因为当我查看任务栏时,我的程序使用该图标作为代表。如果你需要我使用的对话框窗口的代码,请让我知道,我会发布它。我在Windows 7上使用mingw32 C++编译器。谢谢!

3个回答

8
使用LoadIcon函数并将图标句柄传递给WM_SETICON消息。
HICON hicon = LoadImageW(GetModuleHandleW(NULL), MAKEINTRESOURCEW(IDI_ICONMAIN), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
SendMessageW(hwnd, WM_SETICON, ICON_BIG, hicon);

1
我尝试过使用 HICON t = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON1)); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)t);,但并没有成功。我不知道我的代码离正确有多远。 - llk
3
调用LoadIcon的第一个参数应该是当前实例的句柄。通过调用GetModuleHandle(NULL)来获取它。 - K-ballo

5

我必须将LoadImageW()的返回值强制转换为HICON,以避免出现以下错误:

"无法将类型为“HANDLE”的值分配给类型为“HICON”的实体...."

这对我有用:

.... 
//hDlg is the handle to my dialog window
case WM_INITDIALOG:
    {
        HICON hIcon;

        hIcon = (HICON)LoadImageW(GetModuleHandleW(NULL),
            MAKEINTRESOURCEW(IDI_ICON1),
            IMAGE_ICON,
            GetSystemMetrics(SM_CXSMICON),
            GetSystemMetrics(SM_CYSMICON),
            0);
        if (hIcon)
        {
            SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
        }
    }
    break;

以下是结果:

这是结果:

win32对话框图标

提示:使用的图标来自:

http://www.iconsdb.com/orange-icons/stackoverflow-6-icon.html

希望有所帮助!


0

虽然已经过去三年了,但我想为此添加另一种解决方案。我曾在Visual Studio 2017上尝试过这个。

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); SendMessage(WM_SETICON, ICON_BIG, (LPARAM)m_hIcon);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接