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);//隱藏最小化到工作列的圖示
}