(一) 原理
程序實現:最小化時隱藏至托盤,雙擊顯示窗口,右鍵彈出快捷菜單“退出”並添加了響應函數。
1、托盤化的原理:首先 要將窗口隱藏,然後 在右下角托盤中繪製圖標。
2、恢復的原理:將窗口顯示,再將托盤中的圖片刪除。
(二)總體程序實現
1、首先建立一個基於對話框的MFC程序"CTrayDlg"。
然後在TrayDlg.h文件里加入自定義消息WM_SHOWTASK:
#define WM_SHOWTASK (WM_USER + 0x100) //一般數值大於100
//{{AFX_MSG(CTrayDlg)
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2、在TrayDlg.cpp文件里加入如下代碼:
BEGIN_MESSAGE_MAP(CTrayDlg, CDialog)
//{{AFX_MSG_MAP(CTrayDlg)
中間加入消息聲明:
ON_MESSAGE(WM_SHOWTASK,onShowTask)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3、在CTrayDlg的::OnSysCommand(UINT nID, LPARAM lParam)函數體中增加一個命令響應:
if(nID==SC_MINIMIZE)
ToTray(); //最小化到托盤的函數
(三)具體函數內容
1、最小化到托盤函數
TrayDlg.h中添加函數聲明:
void ToTray();
TrayDlg.cpp中定義函數體:
void CTrayDlg::ToTray()
{
NOTIFYICONDATA nid; //NOTIFYICONDATA結構包含了系統用來處理托盤圖標的信息,
//它包括選擇的圖標、回調消息、提示消息和圖標對應的窗口等內容。
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); //以字節爲單位的這個結構的大小
nid.hWnd=this->m_hWnd; //接收托盤圖標通知消息的窗口句柄
nid.uID=IDR_MAINFRAME; //應用程序定義的該圖標的ID號
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //設置該圖標的屬性
nid.uCallbackMessage=WM_SHOWTASK; //應用程序定義的消息ID號,此消息傳遞給hWnd
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); //圖標的句柄
strcpy(nid.szTip,"我的托盤我作主"); //鼠標停留在圖標上顯示的提示信息
Shell_NotifyIcon(NIM_ADD,&nid); //在托盤區添加圖標de函數 ,函數說明見文章附錄
ShowWindow(SW_HIDE); //隱藏主窗口
}
2、恢復界面函數
//wParam接收的是圖標的ID,而lParam接收的是鼠標的行爲
LRESULT CTrayDlg::OnShowTask(WPARAM wParam,LPARAM 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.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//資源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK: //雙擊左鍵的處理
{
this->ShowWindow(SW_SHOW); //簡單的顯示主窗口
DeleteTray();
}
break;
default:
break;
}
return 0;
}
3、刪除托盤圖標函數
在TrayDlg.h文件中添加函數DeleteTray()聲明:
void DeleteTray();
cpp中其函數體爲:
void CTrayDlg::DeleteTray()
{
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=WM_SHOWTASK;//自定義的消息名稱
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"程序名稱"); //信息提示條爲“計劃任務提醒”
Shell_NotifyIcon(NIM_DELETE,&nid); //在托盤區刪除圖標
}
附錄:
Shell_NotifyIcon:
//原型WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage,PNOTIFYICONDATA pnid);
//Pnid是上面的NOTIFYICONDATA結構的指針。 dwMessage是被傳遞的消息,可以是以下消息之一:
//NIM_ADD:增加圖標;NIM_DELETE:刪除圖標;NIM_MODIFY:修改圖標。