1. 程式人生 > >MFC對話方塊最小化到托盤程式設計實現步驟

MFC對話方塊最小化到托盤程式設計實現步驟

以工程為例說明過程:此程式程式設計環境是VS2008,在除錯過程中,將字符集修改為“使用多位元組字符集”(專案->屬性->配置屬性->字符集)。

例如新建一個MFC對話方塊工程Dialogtest,程式實現的功能是,修改對話方塊標題欄上預設的圖示,在程式中改為新增的資源Icon IDI_ICON1,最小化對話方塊到托盤。

首先,在對話方塊資源屬性頁,選擇Minimize Box為TRUE。這樣可以實現對話方塊的最小化,但是這時最小化到了工作列,為了使其最小化到托盤,還必須新增一些程式碼,步驟如下:

首先新增變數NOTIFYICONDATA m_nid;//NOTIFYICONDATA作用是用來向工作列托盤區域傳送訊息和自定義訊息響應函式OnShowTask ,自定義訊息響應函式主要是新增三處程式碼:

1)標頭檔案中宣告部分新增#define WM_SHOWTASK WM_USER+1,程式碼部分新增afx_msg LRESULT OnShowTask(WPARAMwParam,LPARAM lParam);

2)在源程式中新增:BEGIN_MESSAGE_MAP(CDialogtestDlg, CDialog)

 ON_WM_SYSCOMMAND()

 ON_WM_PAINT()

 ON_WM_QUERYDRAGICON()



 //}}AFX_MSG_MAP

 ON_MESSAGE(WM_SHOWTASK,OnShowTask)//此處為新增部分

END_MESSAGE_MAP()

3)源程式中的響應函式程式碼

在本實現中源程式中總共添加了五處程式碼:(紅色為新增的程式碼)

1、修改圖示資源:

CDialogtestDlg::CDialogtestDlg(CWndpParent /=NULL*/)

 :CDialog(CDialogtestDlg::IDD, pParent)

{

 //m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);// IDR_MAINFRAME為系統預設

 m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);

}

2、同上自定義訊息2

BEGIN_MESSAGE_MAP(CDialogtestDlg,CDialog)

 ON_WM_SYSCOMMAND()

 ON_WM_PAINT()

 ON_WM_QUERYDRAGICON()



 //}}AFX_MSG_MAP

 ON_MESSAGE(WM_SHOWTASK,OnShowTask)

 ON_WM_SIZE()//為了隱藏最小化到工作列的圖示而新增的訊息響應函式,這個函式系統自帶直接新增

END_MESSAGE_MAP()

3、修改對話方塊標題欄圖示並在托盤區新增圖示:

BOOL CDialogtestDlg::OnInitDialog()

{

 CDialog::OnInitDialog();



 // 將“關於...”選單項新增到系統選單中。



 // IDM_ABOUTBOX 必須在系統命令範圍內。

 ASSERT((IDM_ABOUTBOX& 0xFFF0) == IDM_ABOUTBOX);

 ASSERT(IDM_ABOUTBOX< 0xF000);



 CMenu* pSysMenu= GetSystemMenu(FALSE);

 if (pSysMenu != NULL)

 {

     CString strAboutMenu;

     strAboutMenu.LoadString(IDS_ABOUTBOX);

     if (!strAboutMenu.IsEmpty())

     {

          pSysMenu->AppendMenu(MF_SEPARATOR);

          pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,strAboutMenu);

     }

 }



 // 設定此對話方塊的圖示。當應用程式主視窗不是對話方塊時,框架將自動

 //  執行此操作

 SetIcon(m_hIcon,TRUE);          // 設定大圖示

 SetIcon(m_hIcon,FALSE);         // 設定小圖示

 // TODO: 在此新增額外的初始化程式碼

 m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);

 m_nid.hWnd = this->m_hWnd;

 m_nid.uID = IDI_ICON1;

 m_nid.uFlags = NIF_ICON|NIF_MESSAGE |NIF_TIP;

 m_nid.uCallbackMessage = WM_SHOWTASK;

 m_nid.hIcon   = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

 strcpy_s(m_nid.szTip,strlen("對話方塊")+1,"對話方塊");

 Shell_NotifyIcon(NIM_ADD,&m_nid); // 在托盤區新增圖示

 return TRUE;  // 除非將焦點設定到控制元件,否則返回TRUE

}

4、自定義的訊息響應函式程式碼:

LRESULT CDialogtestDlg::OnShowTask(WPARAMwParam, LPARAM lParam)

{

 if(wParam != IDI_ICON1) return 1;



 switch(lParam)

 {

 case WM_RBUTTONUP:               //右鍵起來時彈出選單

     {

          LPPOINT lpoint = new tagPOINT;

          ::GetCursorPos(lpoint);                    // 得到滑鼠位置

          CMenu menu;

          menu.CreatePopupMenu();                    // 宣告一個彈出式選單

          menu.AppendMenu(MF_STRING, WM_DESTROY, "退出");//Appends a new item to the end ofthis menu

          //Displays a floating pop-up menu at the specifiedlocation and tracks the selection of items on the pop-up menu

          menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y,this);

          HMENU hmenu = menu.Detach();

          menu.DestroyMenu();

          delete lpoint;

          break;

     }

 case WM_LBUTTONDBLCLK:                            // 雙擊左鍵的處理

     this->ShowWindow(SW_SHOWNORMAL);         // 顯示主視窗 

     break;

 }



 return 0;

}

5、處理最小化時工作列出現圖示的程式:

void CDialogtestDlg::OnSize(UINTnType, int cx, int cy)

{

 CDialog::OnSize(nType, cx, cy);

 // TODO: 在此處新增訊息處理程式程式碼

 if (nType == SIZE_MINIMIZED)

 {

     ShowWindow(SW_HIDE);//隱藏最小化到工作列的圖示

 }

}

原文:https://blog.csdn.net/lejun2011/article/details/7570357