头文件.h 中:
public:
// 声明消息响应函数,用于程序托盘后再次显示主窗口
afx_msg LRESULT onShowTask(WPARAM wParam, LPARAM lParam);
// 实现程序托盘的函数
afx_msg void ToTray();
源文件.cpp 中:
// 自定义消息,用于程序托盘后,鼠标点击图标消息事件
#define WM_SHOWTASK (WM_USER+1001)
// 定义一个全局结构变量
NOTIFYICONDATA nid;
// 添加程序托盘后,鼠标点击图标消息事件消息映射
ON_MESSAGE(WM_SHOWTASK, onShowTask)
BEGIN_MESSAGE_MAP(CAAAAADlg, CDialog)
//{{AFX_MSG_MAP(CAAAAADlg)
ON_MESSAGE(WM_SHOWTASK, onShowTask)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
//托盘的函数
void CMyTrayProDlg:: ToTray()
{
// 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(nid.szTip, _T("我的计划任务提醒")); // 信息提示条为“我的计划任务提醒”
memset(nid.szTip, 0, sizeof(nid.szTip));
memcpy(nid.szTip, _T("我的计划任务提醒"), sizeof(_T("我的计划任务提醒")));
Shell_NotifyIcon(NIM_ADD, &nid); // 在托盘区添加图标
ShowWindow(SW_HIDE); // 隐藏主窗口
}
// 用于程序托盘后,鼠标点击图标消息事件
LRESULT CMyTrayProDlg::onShowTask(WPARAM wParam, LPARAM lParam)
{
// wParam 接收的是图标的ID,而lParam 接收的是鼠标的行为
if (IDR_MAINFRAME != wParam)
{
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, _T("关闭"));
// 确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);
// 资源回收
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
Shell_NotifyIcon(NIM_DELETE, &nid); // 在托盘区删除图标
delete lpoint;
}
break;
case WM_LBUTTONUP: // 左键点击处理
case WM_LBUTTONDBLCLK: // 双击左键处理
{
this->ShowWindow(SW_SHOW); // 简单的显示主窗口
}
break;
default:
break;
}
return 0;
}
void CMyTrayProDlg::OnOK()
{
// TODO: Add extra validation here
ToTray();
// CDialog::OnOK();
}