1、背景需求:1、 MFC 对话框最小化时,只显示系统右下角托盘图标。2、双击托盘,对话框还原。3、右键点击托盘,弹出“关闭”菜单,可关闭对话框。实现步骤:1、创建 MFC 对话框程序(本例程序名为 TaskbarIcon),属性中设置“MinimizeBox”为 true。2、定义自定义消息宏。1 #define NOTIFY_SHOW WM_USER+25003、 OnSysCommand(系统消息响应函数)添加对话框最小化执行代码。01 void CTaskbarIconDlg:OnSysCommand(UINT nID, LPARAM lParam)02 03 if (SC_MINIMIZ
2、E = nID)04 05 NOTIFYICONDATA nid;06 nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); 07 nid.hWnd = this-m_hWnd; 08 nid.uID = IDR_MAINFRAME; 09 nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP ; 10 nid.uCallbackMessage = NOTIFY_SHOW;/自定义的消息名称11 nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAI
3、NFRAME); 12 wcscpy_s(nid.szTip, _T(“图标测试“);/信息提示条13 14 Shell_NotifyIcon(NIM_ADD,/在托盘区添加图标15 ShowWindow(SW_HIDE);/隐藏主窗口16 return;17 18 19 /.系统自带代码20 4、托盘自定义消息响应01 BEGIN_MESSAGE_MAP(CTaskbarIconDlg, CDialog)02 /.省略其他消息映射03 04 ON_MESSAGE(NOTIFY_SHOW, OnTrayIcon)05 /AFX_MSG_MAP06 END_MESSAGE_MAP()07 08
4、afx_msg LRESULT OnTrayIcon(WPARAM wParam, LPARAM lParam);09 10 LRESULT CTaskbarIconDlg:OnTrayIcon(WPARAM wParam, LPARAM lParam)11 12 if (wParam != IDR_MAINFRAME)13 14 return 1;15 16 17 switch(lParam)18 19 case WM_RBUTTONUP:20 21 /右键起来时弹出快捷菜单,这里只有一个“关闭”22 23 /声明一个弹出式菜单24 /增加菜单项“关闭”,点击则发送消息 WM_CLOSE 给
5、主窗口(已 25 /隐藏),将程序结束。26 CMenu menu;27 menu.CreatePopupMenu();28 menu.AppendMenu(MF_STRING, ID_APP_EXIT, _T(“关闭“);29 30 /得到鼠标位置31 LPPOINT lpoint= new tagPOINT;32 :GetCursorPos(lpoint);33 34 /确定弹出式菜单的位置 35 menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint-x, lpoint-y,this);36 37 /资源回收38 HMENU hmenu=menu.Detach
6、();39 menu.DestroyMenu();40 41 delete lpoint;42 lpoint = NULL;43 44 break;45 46 case WM_LBUTTONDBLCLK:47 48 /双击左键的处理49 50 /显示界面51 ShowWindow(SW_SHOW);52 /界面置顶53 SetForegroundWindow();54 55 break;56 57 58 59 return 0;60 5、关闭时删除托盘图标。覆盖(override)OnCancel 函数。查看源码打印?01 virtual void OnCancel();02 03 void CTaskbarIconDlg:OnCancel()04 05 /删除任务栏图标06 NOTIFYICONDATA nid;07 nid.hWnd=this-m_hWnd;08 nid.uID=IDR_MAINFRAME;09 Shell_NotifyIcon(NIM_DELETE, 10 11 CDialog:OnCancel();12