MFC將視窗最小化到托盤
阿新 • • 發佈:2019-01-09
1、在標頭檔案中自定義訊息:#define WM_SHOWTASK WM_USER+1以及宣告訊息響應函式: afx_msg LRESULT onShowTask(WPARAM wParam, LPARAM lParam);
宣告一個結構體變數:NOTIFYICONDATA nid;
2、在cpp檔案訊息對映中新增:ON_MESSAGE(WM_SHOWTASK , onShowTask)
3、最小化到托盤函式:
4、訊息響應函式onShowTask原型:void CVS2010_SerialPortDlg::OnBnClickedButton2() { nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this->m_hWnd; nid.uID=IDR_MAINFRAME; //通過多次呼叫,你可以使用不同的uID將多個圖示關聯到一個視窗hWnd,例如QQ修改登入狀態時,圖示也會變 nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //此成員表明具體哪些其他成員為合法資料(即哪些成員起作用) nid.uCallbackMessage=WM_SHOWTASK;//自定義的訊息名稱 //應用程式定義的訊息標示。當托盤圖示區域發生滑鼠事件或者使用鍵盤選擇或啟用圖示時, //系統將使用此標示向由hWnd成員標示的視窗傳送訊息。訊息響應函式的wParam引數標示了 //訊息事件發生的工作列圖示,lParam引數根據事件的不同,包含了滑鼠或鍵盤的具體訊息, //例如當滑鼠指標移過托盤圖示時,lParam將為WM_MOUSEMOVE。 nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); //圖示的控制代碼 strcpy(nid.szTip,"VS2010_SerialPortDlg"); //資訊提示條 Shell_NotifyIcon(NIM_ADD,&nid); //在托盤區新增圖示 ShowWindow(SW_HIDE); //隱藏主視窗,像QQ一登入就會有托盤和主介面同時存在,這樣的話不需要隱藏主介面 }
5、刪除托盤函式:LRESULT CVS2010_SerialPortDlg::onShowTask(WPARAM wParam,LPARAM lParam) //wParam接收的是圖示的ID,而lParam接收的是滑鼠的行為 { if(wParam!=IDR_MAINFRAME) 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,"關閉"); menu.AppendMenu(MF_STRING,WM_RESHOW,"開啟");//自己定義的命令,需要手動新增命令響應函式 //確定彈出式選單的位置 menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //資源回收 HMENU hmenu=menu.Detach(); menu.DestroyMenu(); delete lpoint; } break; case WM_LBUTTONUP://左鍵起來時開啟介面 { ShowWindow(SW_SHOW);//顯示主視窗 //DeleteTray();//刪除托盤 } break; case WM_LBUTTONDBLCLK://左鍵雙擊,新增相應的功能 break; } return 0; }
void CVS2010_SerialPortDlg::DeleteTray()
{
Shell_NotifyIcon(NIM_DELETE, &nid); //在托盤區刪除圖示
}
6、RESHOW命令響應函式:
void CVS2010_SerialPortDlg::OnReshow(){
ShowWindow(SW_SHOW);
//DeleteTray();
}