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);來更改。 |