我正在尝试允许我的应用程序的用户设置自己的自定义图标,但是通过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);
}
}
答案 0 :(得分:1)
通过Windows资源管理器中的图标,我假设您指的是shell与.exe文件关联的图标。这始终被确定为文件中的第一个图标资源。除非您准备允许修改.exe文件,否则您无法更改此内容。我强烈建议您在部署后不要修改.exe文件。这可能会导致损坏,并且会对反恶意软件软件产生怀疑。
对于与主窗口关联的图标,这很简单。您已经知道如何更改它,发送WM_SETICON
消息。或者在注册窗口类时注册自定义图标。您的问题似乎只是您的程序在启动时既不会执行这些操作,而只会在您调用DoFileIcon
时执行。系统不会为您记住自定义图标,您需要编写代码来执行此操作。将信息存储在注册表或应用程序配置文件中。然后在应用程序启动时,阅读此配置,并应用自定义图标。