1. 程式人生 > >MFC 主對話方塊最小化到托盤,托盤點選還原主對話方塊。

MFC 主對話方塊最小化到托盤,托盤點選還原主對話方塊。

1.將主對話方塊資源屬性Minimize Box設定為true,這個屬性顯示對話方塊的最小化按鈕。

2.最小化到托盤。

(1)首先要了解,你工作列右下角的托盤都是圖示,所以最小化到托盤建議新增一個Icon資源。

(2)到托盤的函式需要自己重構。

先巨集定義

#define WM_SHOWTASK WM_USER+1

在protected中新增函式

LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
BOOL CzidlgDlg::DestroyWindow();
在主對話方塊.h檔案中 新增public 變數
NOTIFYICONDATA m_nid;
找到主對話方塊.cpp檔案中void CzidlgDlg::OnSysCommand(UINT nID, LPARAM lParam)函式新增如下程式碼,位置自己覺得合適去吧。(百度上總有人非要新增onsize 呵呵。)
if(nID==SC_MINIMIZE) 
	{
	ShowWindow(SW_HIDE);
	m_nid.cbSize  = (DWORD)sizeof(NOTIFYICONDATA);
   	m_nid.hWnd    = this->m_hWnd;
    	m_nid.uID     = IDI_ICON1;
    	m_nid.uFlags  = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
    	m_nid.uCallbackMessage = WM_SHOWTASK;             // 自定義的訊息名稱
    	m_nid.hIcon   = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
    	strcpy(m_nid.szTip, "zidlg");                // 資訊提示條為"zidlg",VS2008 UNICODE編碼用wcscpy_s()函式
    	Shell_NotifyIcon(NIM_ADD, &m_nid);   // 在托盤區新增圖示
	}

再在.cpp中寫入

BOOL CzidlgDlg::DestroyWindow()
    {
           // TODO: Add your specialized code here and/or call the base class
           // 在托盤區刪除圖示
           Shell_NotifyIcon(NIM_DELETE, &m_nid);             
           return CDialog::DestroyWindow();
    }
用來刪除圖示。 3.托盤點選還原主對話方塊

在主對話方塊.cpp中重構函式(實現關鍵)

 afx_msg LRESULT CzidlgDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
    {
           if(wParam != IDI_ICON1)
                  return 1;
           switch(lParam)
           {
           case WM_RBUTTONUP:                                        // 右鍵起來時彈出選單
                  {
                    
                         LPPOINT lpoint = new tagPOINT;
                         ::GetCursorPos(lpoint);                    // 得到滑鼠位置
                         CMenu menu;
                         menu.CreatePopupMenu();                    // 宣告一個彈出式選單
                         menu.AppendMenu(MF_STRING, WM_DESTROY, "關閉");
                         menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this);
                         HMENU hmenu = menu.Detach(); 
                         menu.DestroyMenu();
                         delete lpoint;
                  }
                  break;
           case WM_LBUTTONDOWN:                                 // 單擊左鍵的處理
                  {
						CWnd *pWnd = AfxGetMainWnd();
						HWND hHwnd = pWnd->m_hWnd;
						HMODULE hUser32 = GetModuleHandle("user32"); 
						SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, "SwitchToThisWindow"); 
						SwitchToThisWindow(hHwnd, TRUE); 
						// 顯示主視窗
                  }
                  break;
           }
           return 0;
    }
注意:switchtothiswindow函式user32.dll未公開。要使用 需要自己宣告。

在.h檔案中剛才的巨集定義下邊

typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL); 
再在protected中定義
PROCSWITCHTOTHISWINDOW SwitchToThisWindow;

4.執行編譯。你會發現,滑鼠怎麼點都沒用,因為你寫的onshowtask沒有新增訊息響應。

找到.cpp中 BEGIN_MESSAGE_MAP(CzidlgDlg, CDialogEx)

在END_MESSAGE_MAP()上方加入

ON_MESSAGE(WM_SHOWTASK,OnShowTask)
5.編譯執行。