MFC 主對話方塊最小化到托盤,托盤點選還原主對話方塊。
阿新 • • 發佈:2019-01-02
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 變數
找到主對話方塊.cpp檔案中void CzidlgDlg::OnSysCommand(UINT nID, LPARAM lParam)函式新增如下程式碼,位置自己覺得合適去吧。(百度上總有人非要新增onsize 呵呵。)NOTIFYICONDATA m_nid;
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.編譯執行。