托盘程序开发
托盤程序
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;//應用程序定義的回調消息IDCString 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 defaultNOTIFYICONDATA 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(); }轉載于:https://www.cnblogs.com/17bdw/p/10354679.html
總結
- 上一篇: C++ 之虚函数的实现原理
- 下一篇: HDU 4256 翻译罗马数字