gpt4 book ai didi

c++ - 如何在运行时永久更改窗口图标?

转载 作者:行者123 更新时间:2023-11-28 05:04:33 25 4
gpt4 key购买 nike

我试图让我的应用程序的用户设置他们自己的自定义图标,但是通过 LoadImage 函数加载图标文件并通过 WM_SETICON 消息设置它似乎并不能解决问题。 Windows资源管理器中的图标没有更新,每次运行程序时任务栏和左上角的图标都会重置(用户必须重新设置)。我改用resources都没有出现这些问题,但是我编译程序后不能更改.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);
}
}

最佳答案

对于 Windows 资源管理器中的图标,我认为您指的是 shell 与 .exe 文件相关联的图标。这始终被确定为文件中的第一个图标资源。除非您准备好允许修改 .exe 文件,否则您将无法更改它。我强烈建议您不要在部署后修改您的 .exe 文件。这很容易导致损坏,并且对反恶意软件来说是可疑的。

至于与主窗口相关联的图标,这很简单。您已经知道如何更改它,发送 WM_SETICON 消息。或者在注册窗口类时注册自定义图标。您的问题似乎很简单,即您的程序在启动时既不执行这些操作,而是仅在您调用 DoFileIcon 时执行。系统不会为您记住自定义图标,您需要编写代码来做到这一点。将信息存储在注册表或应用程序配置文件中。然后在应用程序启动时,读取此配置,并应用自定义图标。

关于c++ - 如何在运行时永久更改窗口图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45144804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com