上一篇讨论了托盘图标的添加,程序退出后虽然系统会自动删除托盘图标,但这种工作最好在程序中完成,以保证程序所有的动作都在我们的代码控制之内.
>>>托盘图标的添加和消息响应
3.删除托盘图标
NOTIFYICONDATA nid;
nid.cbSize = sizeof nid;
nid.hWnd = GetSafeHwnd();
nid.uID = IDR_MAINFRAME;
nid.uFlags = NIF_MESSAGE | NIF_ICON;
Shell_NotifyIcon(NIM_DELETE,&nid);
这些代码与前一篇内容是相关的,理论上讲只要nid.hWnd、nid.uID与添加托盘图标时这两个成员变量的数值对应相等,删除图标就能成功
但事实上,由于我们删除图标时,程序正在退出,往往窗口已经销毁,不管是用GetSafeHwnd还是直接引用m_hWnd都得不到我们添加图标时所用的nid.hWnd的值了,所以上面的代码放在析构函数中最后调用总是失败的。
所以最佳的办法,还是将
NOTIFYICONDATA nid;
这个变量改写成成员变量
NOTIFYICONDATA m_nid;
这样要换图标或者删除图标,都很方便,不用重新定义临时的NOTIFYICON重新赋值。
照这种操作,在删除时,可以直接写这一句就行了:
Shell_NotifyIcon(NIM_DELETE,&m_nid);