转载,原文地址:http://blog.sina.com.cn/s/blog_7bddd8530100w85n.html
今天一时想解决我们公司某个工具箱软件的托盘图标删除后不自动消失的问题,发现网上也有很多网友发这样的质疑,但都没有比较确切的回答:
通常在程序退出时调用以下代码 便可以删除托盘图标:
NOTIFYICONDATA tnd;
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = AfxGetMainWnd()-> m_hWnd;
tnd.uID = IDR_MAINFRAME;
Shell_NotifyIcon(NIM_DELETE, &tnd);
这个图标不会及时消失的真正原因其实很简单,答案就是这段代码位置放错了。
很多人将这段代码放在了CMAINFRAME框架的析构函数里了,这就是导致图标不会立即消失的元凶,相当于斩妖除魔中 仅仅消灭了妖怪的灵魂而其肉身要经过鼠标(照妖镜)一照,才会烟消云散。
那么这段代码应该放在哪里比较合适呢? 我尝试了 响应ON_CLOSE和 ON_DESTROY(),都不对,和在析构里都一样的。
之后自己定义一个消息 #define ID_SHOW_EXIT WM_USER + 110
然后事件响应,就大功告成了!希望这点小细节能帮助到更多的朋友们!
ON_COMMAND(ID_SHOW_EXIT, OnExit)
void CMainFrame::OnExit()
{
NOTIFYICONDATA tnd;
tnd.cbSize = sizeof(NOTIFYICONDATA);
tnd.hWnd = AfxGetMainWnd()-> m_hWnd;
tnd.uID = IDR_MAINFRAME;
Shell_NotifyIcon(NIM_DELETE, &tnd);
::PostQuitMessage(0);
}