说,我创建了我的图标:
//'ghIcon' of type HICON
ghIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, nCx, nCy, 0);
然后将其设置为显示在系统托盘上:
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = hMyWnd;
nid.uID = TRAY_ICON_ID1;
nid.uFlags = NIF_ICON;
nid.uCallbackMessage = TRAY_NOTIFICATION_ID1;
nid.hIcon = ghIcon;
Shell_NotifyIcon(NIM_ADD, &nid);
然后在某些时候我想用一个新图标替换它:
if(ghIcon)
{
//Delete old icon first
DestroyIcon(ghIcon);
}
//Load new icon
ghIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, nCx, nCy, 0);
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = hMyWnd;
nid.uID = TRAY_ICON_ID1;
nid.uFlags = NIF_ICON;
nid.hIcon = ghIcon;
Shell_NotifyIcon(NIM_MODIFY, &nid);
我的问题是,我可以在系统托盘中选中之前删除之前的图标,就像我上面显示的那样吗?或者,我是否需要先将其更改为其他内容,然后在其上调用DestroyIcon
?
PS。我的实际例子显然不像我上面所说的那么简单。我对这个概念很好奇。
答案 0 :(得分:4)
系统托盘未保留您提供的HICON
。它是一个私人副本。因此,您可以随时销毁您身边的图标。你不必保留它,你可以在调用Shell_NotifyIcon()
之前加载它,然后在Shell_NotifyIcon()
退出后立即销毁它。
nid.hIcon = LoadImage(...);
Shell_NotifyIcon(NIM_ADD, &nid);
DestroyIcon(nid.hIcon);
nid.hIcon = LoadImage(...);
Shell_NotifyIcon(NIM_MODIFY, &nid);
DestroyIcon(nid.hIcon);