借鉴:http://blog.csdn.net/heaven13483/article/details/9748231
http://blog.csdn.net/dszgf5717/article/details/8864458
一、自定义信息
在头文件中加入下面这句话:
#define WM_SHOWTASK (WM_USER + 1)
二、在*DLG.CPP文件中添加添加消息映射
ON_MESSAGE(WM_SHOWTASK,OnShowTask)
将此段消息放在
BEGIN_MESSAGE_MAP(CDemoDlg, CDialog)
END_MESSAGE_MAP()
中间
三、创建缩放函数ToTray()
四、创建信息处理函数OnShowTask
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
HRESULT CDemoDlg::OnShowTask(WPARAM wParam, LPARAM lParam) {
if (wParam != IDI_ICON)
return 1;
switch (lParam) {
case WM_RBUTTONUP: { //右键起来时弹出快捷菜单,这里只有一个“关闭”
LPPOINT lpoint = new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。
menu.AppendMenu(MF_STRING, WM_DESTROY, "退出"); //确定弹出式菜单的位置
SetForegroundWindow(); //此句需要置于TrackPopupMenu之前,当点击按钮外的地方,菜单消失
menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this); //资源回收
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
delete lpoint;
break;
}
case WM_LBUTTONDBLCLK: { //双击左键的处理
this->ShowWindow(SW_RESTORE);//简单的显示主窗口
SetForegroundWindow();
DeleteTray();
break;
}
default:
break;
}
return 0;
}
五、创建关闭程序函数DeleteTray
void CDemoDlg::DeleteTray() {
NOTIFYICONDATA nid;
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd = AfxGetMainWnd()->m_hWnd;
nid.uID = IDI_ICON;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_SHOWTASK; //自定义的消息名称
nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON));
strcpy(nid.szTip, "程序名称"); //信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_DELETE, &nid); //在托盘区删除图标
}
注意,如果字符串相关的地方报错,请查看一下你的字符集,配置属性->常规->字符集,默认为unicode,设置为“使用多字节字符集”,如果非要使用unicode字符集,可以将 strcpy 修改为 wcscpy,对应宽字符处理函数请看这:点我,字符串改为:_T("...")。