1. 程式人生 > >MFC將視窗最小化到托盤

MFC將視窗最小化到托盤

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、最小化到托盤函式:

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一登入就會有托盤和主介面同時存在,這樣的話不需要隱藏主介面
}
4、訊息響應函式onShowTask原型:
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; 
} 
5、刪除托盤函式:
void CVS2010_SerialPortDlg::DeleteTray()
{
	Shell_NotifyIcon(NIM_DELETE, &nid);    //在托盤區刪除圖示
}
6、RESHOW命令響應函式:
void CVS2010_SerialPortDlg::OnReshow(){
	ShowWindow(SW_SHOW);
	//DeleteTray();
}