VC 制作系統托盤程式實作将視窗最小化到系統托盤
2008年01月11日 星期五 10:24
前段時間因為要用到系統拖盤,是以研究了一下,在這裡記錄一下,免得以後忘了 ^_^
先在類中定義一個結構變量NOTIFYICONDATA pnid;然後在OnInitDialog進行初始化
pnid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//該結構體大小
pnid.hWnd=m_hWnd; //視窗句柄
pnid.uID=(UINT)m_hIcon; //圖示句柄
pnid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //圖示有效|自定義消息有效|滑鼠指向顯示文字有效
pnid.uCallbackMessage=WM_MYMESSAGE;//自定義的消息名稱
pnid.hIcon=m_hIcon; //圖示句柄
strcpy(pnid.szTip,"這是一個測試");//滑鼠指向所顯示的文字
實作最小化到系統拖盤,這定義一個視窗的OnSize事件
void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: 在此處添加消息處理程式代碼
if (nType==SIZE_MINIMIZED)//如果事件為最小化
{
Shell_NotifyIcon(NIM_ADD,&pnid);//在托盤區添加圖示
ShowWindow(SW_HIDE);//隐藏主視窗
}
}
還原功能則先在CMyDlg.h做下列操作:
#define WM_MYMESSAGE WM_USER+101 //定義自定義消息,加的這個值一般都要大于100
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); //在類中定義消息響應函數
然後就在CMyDlg.app中定義消息映射,函數實作了。
在
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
END_MESSAGE_MAP() 之間查入消息映射ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)
然後建立OnMyMessage函數。
LRESULT CMyDlg::OnMyMessage(WPARAM wParam, LPARAM lParam){
if( lParam == WM_LBUTTONDOWN )//如果在圖示中單擊左鍵則還原
{
Shell_NotifyIcon(NIM_DELETE,&pnid);//删除托盤圖示
ShowWindow(SW_SHOWNORMAL);//顯示主視窗
this->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使視窗總是在最前面
return 0;
如果要更改顯示圖示則先更改pnid結構裡的值,然後使用Shell_NotifyIcon(NIM_MODIFY,&pnid);來更改。