Как правильно обновить значок уведомления в трее?

Скажем, я создал свою иконку:

//'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. Мой фактический пример явно не так прост, как я показал выше. Мне просто любопытно о концепции.

2

Решение

Системный трей не хранит 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);
4

Другие решения


По вопросам рекламы [email protected]