网上搜的代码确实能实现最小化到托盘,但关闭程序时,托盘图标还在,原因是没删除图标,需屏幕刷屏才消失!
其实删除挺简单的,处理一下关闭窗口消息,使用NIM_DELETE就行了,具体看代码...
首先建立基于对话框的MFC应用程序工程testDlg,接下来
一,自定义一个消息WM_SHOWTASK,并关联消息映射函数OnShowTask()
// 定义消息
#define WM_SHOWTASK (WM_USER + 1)
// 关联消息映射函数
// 位于BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间
ON_MESSAGE(WM_SHOWTASK,OnShowTask)
// 当然要声明和定义OnShowTask()
// 声明
LRESULT OnShowTask(WPARAM wParam, LPARAM lParam) ;
<pre name="code" class="cpp">LRESULT CtestdlgDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
//wParam接收的是图标的ID,lParam接收的是鼠标的动作
{
if(wParam != IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_LBUTTONDOWN:
this->ShowWindow(SW_SHOW); // 显示主窗口 WM_LBUTTONDBLCLK
break;
case WM_RBUTTONUP: //右键起来时弹出菜单
{
LPPOINT lpoint = new tagPOINT;
::GetCursorPos(lpoint); // 得到鼠标位置
CMenu menu;
menu.CreatePopupMenu(); // 声明一个弹出式菜单
menu.AppendMenu(MF_STRING, WM_DESTROY, "退出");//Appends a new item to the end ofthis menu
//Displays a floating pop-up menu at the specifiedlocation and tracks the selection of items on the pop-up menu
menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y,this);
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
delete lpoint;
break;
}
}
return 0;
}
二,SC_MINIMIZE、SC_CLOSE消息处理,重载WM_SYSCOMMAND消息处理
void CtestDlgDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
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;
}
elseif(nID == SC_CLOSE) // 关闭窗口
{
NOTIFYICONDATA nd;
nd.cbSize = sizeof (NOTIFYICONDATA);
nd.hWnd = this->m_hWnd;
nd.uID = IDR_MAINFRAME;
Shell_NotifyIcon(NIM_DELETE, &nd); // 托盘图标不显示
}
CDialog::OnSysCommand(nID, lParam);
}
原文:http://blog.csdn.net/lightboat09/article/details/6069792