托盘程序
OninitDialog()
在主界面的OninitDialog()函数里添加代码
BOOL CMFC07trayiconDlg::OnInitDialog(){ // TODO: 在此添加额外的初始化代码 NOTIFYICONDATA m_tnid; m_tnid.cbSize = sizeof(NOTIFYICONDATA);//设置结构大小// m_tnid.hWnd = this->m_hWnd;//设置图标对应的窗口 m_tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//图标属性 m_tnid.uCallbackMessage = WM_ICON_NOTIFY;//应用程序定义的回调消息ID CString szToolTip; szToolTip = _T("INeed 客户端程序"); _tcscpy_s(m_tnid.szTip, szToolTip);//帮助信息 m_tnid.uID = IDR_MAINFRAME;//应用程序图标 m_tnid.hIcon = m_hIcon;//图标句柄 PNOTIFYICONDATA m_ptnid = &m_tnid; ::Shell_NotifyIcon(NIM_ADD, m_ptnid);//增加图标到系统盘}
定义一个自定义的消息。代码放在主界面【.CPP】文件顶部。
#define WM_ICON_NOTIFY WM_USER+100
关闭程序后自动关闭托盘
在主界面对话框中的【属性】-【消息】选项卡里的【WM_CLOSE】添加一OnClose()函数,在程序关闭后,关闭托盘。
void CMFC07trayiconDlg::OnClose(){ // TODO: Add your message handler code here and/or call default NOTIFYICONDATA nd = { 0 }; nd.cbSize = sizeof(NOTIFYICONDATA); nd.hWnd = m_hWnd; nd.uID = IDR_MAINFRAME; nd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nd.uCallbackMessage = WM_ICON_NOTIFY; nd.hIcon = m_hIcon; Shell_NotifyIcon(NIM_DELETE, &nd); CDialogEx::OnClose();}
托盘最小化支持
在【属性】-【Minimize Box】设置为【True】。设置为支持最小化按钮。
在OnSyscommand()函数里,在最后的位置加入
if(nID == SC_MINIMIZE) { ShowWindow(FALSE); //隐藏窗口 }
OnSysCommand()代码。
void CMFC07trayiconDlg::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } if (nID == SC_MINIMIZE) { ShowWindow(FALSE); //隐藏窗口 }}
定义消息,托盘菜单实现
在MFC主界面的CPP文件代码里找到【BEGIN_MESSAGE_MAP(CMFC07trayiconDlg, CDialogEx)】这个宏,往里面添加【ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification)】,实现之前自定义消息的宏。
BEGIN_MESSAGE_MAP(CMFC07trayiconDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CLOSE() ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification) // 添加的代码END_MESSAGE_MAP()
在主界面的【.h】文件里声明函数OnTrayNotification()
LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
定义代码:
响应鼠标的左键和右键消息。
LRESULT CMFC07trayiconDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam){ switch (lParam) { case WM_LBUTTONDOWN: { AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL); SetForegroundWindow(); break; } case WM_RBUTTONUP: { POINT point; HMENU hMenu, hSubMenu; GetCursorPos(&point); //鼠标位置 hMenu = LoadMenu(NULL, MAKEINTRESOURCE(IDR_MENU_TRAY)); // 加载菜单 hSubMenu = GetSubMenu(hMenu, 0);//得到子菜单(因为弹出式菜单是子菜单) SetForegroundWindow(); // 激活窗口并置前 TrackPopupMenu(hSubMenu, 0, point.x, point.y, 0, m_hWnd, NULL); } } return LRESULT();}
IDR_MENU_TRAY是加载了一个菜单,所以要自己自定义【恢复 ID_TRAY_RESTORE】、【退出 ID_TRAY_EXIT】
【恢复 ID_TRAY_RESTORE】,OnTrayRestore()
void CmyfirstmfcDlg::OnTrayRestore(){ AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL); SetForegroundWindow();}
【退出 ID_TRAY_EXIT】,OnTrayExit()
void CMFC07trayiconDlg::OnTrayExit(){ // TODO: 在此添加命令处理程序代码 OnClose();}