天天看點

VC 制作系統托盤程式實作将視窗最小化到系統托盤

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

繼續閱讀