VC中關於程序的托盤化

(一)  原理

程序實現:最小化時隱藏至托盤,雙擊顯示窗口,右鍵彈出快捷菜單“退出”並添加了響應函數。

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:修改圖標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章