背景需求:
1、MFC對話框最小化時,只顯示系統右下角托盤圖標。
2、雙擊托盤,對話框還原。
3、右鍵點擊托盤,彈出“關閉”菜單,可關閉對話框。
實現步驟:
1、創建MFC對話框程序(本例程序名為TaskbarIcon),屬性中設置“MinimizeBox”為true。
2、定義自定義消息宏。
[cpp]
#define NOTIFY_SHOW WM_USER+2500
3、OnSysCommand(系統消息響應函數)添加對話框最小化執行代碼。
[cpp] view plaincopy
void CTaskbarIconDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if (SC_MINIMIZE == nID)
{
NOTIFYICONDATA nid;
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd = this->m_hWnd;
nid.uID = IDR_MAINFRAME;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP ;
nid.uCallbackMessage = NOTIFY_SHOW;//自定義的消息名稱
nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
wcscpy_s(nid.szTip, _T("圖標測試"));//信息提示條
Shell_NotifyIcon(NIM_ADD,&nid);//在托盤區添加圖標
ShowWindow(SW_HIDE);//隱藏主窗口
return;
}
//...系統自帶代碼
}
4、托盤自定義消息響應
[cpp]
BEGIN_MESSAGE_MAP(CTaskbarIconDlg, CDialog)
//...省略其他消息映射
ON_MESSAGE(NOTIFY_SHOW, OnTrayIcon)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
afx_msg LRESULT OnTrayIcon(WPARAM wParam, LPARAM lParam);
LRESULT CTaskbarIconDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{
if (wParam != IDR_MAINFRAME)
{
return 1;
}
switch(lParam)
{
case WM_RBUTTONUP:
{
//右鍵起來時彈出快捷菜單,這裡只有一個“關閉”
//聲明一個彈出式菜單
//增加菜單項“關閉”,點擊則發送消息WM_CLOSE給主窗口(已
//隱藏),將程序結束。
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING, ID_APP_EXIT, _T("關閉"));
//得到鼠標位置
LPPOINT lpoint= new tagPOINT;
::GetCursorPos(lpoint);
//確定彈出式菜單的位置
menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y,this);
//資源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
lpoint = NULL;
break;
}
case WM_LBUTTONDBLCLK:
{
//雙擊左鍵的處理
//顯示界面 www.2cto.com
ShowWindow(SW_SHOW);
//界面置頂
SetForegroundWindow();
break;
}
}
return 0;
}
5、關閉時刪除托盤圖標。
覆蓋(override)OnCancel函數。
[cpp]
virtual void OnCancel();
void CTaskbarIconDlg::OnCancel()
{
//刪除任務欄圖標
NOTIFYICONDATA nid;
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
Shell_NotifyIcon(NIM_DELETE, &nid);
CDialog::OnCancel();
}
作者:segen_jaa