【发布时间】:2017-07-17 12:51:32
【问题描述】:
我试图让我的应用程序的用户设置他们自己的自定义图标,但是通过 LoadImage 函数加载图标文件并通过 WM_SETICON 消息设置它似乎并不能解决问题。 Windows 资源管理器中的图标不会更新,每次运行程序时任务栏和左上角的图标都会重置(用户必须重新设置它们)。当我使用资源时,这些问题都没有发生,但是我在编译程序后无法更改 .rc 文件,是吗?我究竟做错了什么?我有一个菜单函数,它调用 GetOpenFileName 来获取图标文件,然后通过 LoadImage 加载它并通过 SendMessage 设置。
这是我的代码(我跳过了检查函数的返回值以缩短代码)
void DoFileIcon(HWND hwnd)
{
OPENFILENAME ofn;
char szFileName[MAX_PATH] = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "Icons (*.ico)\0*.ico\0All files (*.*)\0*.*\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = "ico";
if(GetOpenFileName(&ofn))
{
HICON hIcon, hIconSm;
hIcon = LoadImage(NULL, szFileName, IMAGE_ICON, 32, 32,
LR_LOADFROMFILE);
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
hIconSm = LoadImage(NULL, szFileName, IMAGE_ICON, 16, 16,
LR_LOADFROMFILE);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
}
}
【问题讨论】:
-
UpdateResource() 等人可以通过重写内部资源来做到这一点,创建应用程序的快捷方式并通过 IShellLink 修改它可能更明智:stackoverflow.com/questions/35665476/…
-
@AlexK。击败我的 IShellLink 建议。