网上搜的代码确实能实现最小化到托盘,但关闭程序时,托盘图标还在,原因是没删除图标,需屏幕刷屏才消失!
其实删除挺简单的,处理一下关闭窗口消息,使用NIM_DELETE就行了,具体看代码...
一,自定义一个消息WM_SHOWTASK,并关联消息映射函数OnShowTask()
#define WM_SHOWTASK (WM_USER + 1)
ON_MESSAGE(WM_SHOWTASK,OnShowTask)
LRESULT CtestDlgDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
//wParam接收的是图标的ID,lParam接收的是鼠标的动作
{
if(wParam != IDR_MAINFRAME)
return 1;
if(WM_LBUTTONDBLCLK == lParam)
{
ShowWindow(SW_SHOW); // 显示主窗口
}
return 0;
}
二,SC_MINIMIZE、SC_CLOSE消息处理,重载WM_SYSCOMMAND消息处理
if(nID == SC_MINIMIZE) // 最小化窗口
{
NOTIFYICONDATA nid;
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd = this->m_hWnd;
nid.uID = IDR_MAINFRAME;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
nid.uCallbackMessage = WM_SHOWTASK; // 自定义的消息名称
nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy_s(nid.szTip, "程序窗口标题"); // 信息提示条
Shell_NotifyIcon(NIM_ADD, &nid); // 在托盘区添加图标
ShowWindow(SW_HIDE); // 隐藏主窗口
return;
}
else(nID == SC_CLOSE) // 关闭窗口
{
NOTIFYICONDATA nd;
nd.cbSize = sizeof (NOTIFYICONDATA);
nd.hWnd = this->m_hWnd;
nd.uID = IDR_MAINFRAME;
Shell_NotifyIcon(NIM_DELETE, &nd); // 托盘图标不显示
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/LightBoat09/archive/2010/12/11/6069792.aspx