《MFC對(duì)話框系統(tǒng)托盤(pán)詳細(xì)步驟》由會(huì)員分享,可在線閱讀,更多相關(guān)《MFC對(duì)話框系統(tǒng)托盤(pán)詳細(xì)步驟(8頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、
MFC 中將窗口最小化至系統(tǒng)托盤(pán)
1. 在對(duì)話框類(lèi)中聲明 NOTIFYICONDATA 變量
class CCamProjDlg : public CDialog
{
...
NOTIFYICONDATA nid;
BOOL isNotify;
...
}
//初始化
isNotify = false;
2. 在 resource.h文件中自定義消息
#define WM_SHOWTASK 1001
2、
3. 在對(duì)話框類(lèi)中聲明消息相應(yīng)函數(shù)
class CCamProjDlg : public CDialog
{
...
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam;
...
}
4、在消息映射中添加
BEGIN_MESSAGE_MAP(CCamProjDlg, CDialog
...
ON_MESSAGE(WM_SHOWTASK,onShowTask
...
3、
END_MESSAGE_MAP(
5. 定義消息響應(yīng)函數(shù)
LRESULT CCamProjDlg::onShowTask( WPARAM wParam, LPARAM lParam
{ // wParam 接收的是圖標(biāo)的 ID ,而 lParam 接收的是鼠標(biāo)的 行為
if( wParam != IDR_MAINFRAME
return 1;
switch(lParam
{
case WM_RBUTTONUP: // 右鍵起來(lái)時(shí)彈出快捷菜單 ,這里只有一個(gè) " 關(guān)閉
4、 " {
LPPOINT lpoint = new tagPOINT;
::GetCursorPos(lpoint; // 得到鼠標(biāo)位置
CMenu menu;
menu.CreatePopupMenu(; //聲明一個(gè)彈出式菜單
menu.AppendMenu(MF_STRING,WM_DESTROY,_T(" 關(guān)閉 "; // 增加菜單 項(xiàng) "
關(guān)閉 " ,點(diǎn)擊則發(fā)送消息 WM_DESTROY 給主窗口 (已隱藏 ,將程序結(jié)束。
menu.TrackPopupMenu(TPM_LEFT
5、ALIGN,lpoint->x,lpoint->y,this; // 確定彈 出
式菜單的位置
SetForegroundWindow(;
HMENU hmenu = menu.Detach(; // 資源回收
menu.DestroyMenu(;
delete lpoint;
}break;
case WM_LBUTTONDBLCLK: // 雙擊左鍵的處理
{
this->ShowWindow(SW_SHOW; // 簡(jiǎn)單的顯示主窗口完事兒
}break;
6、
}
return 0;
}
6. 在需要最小化的地方添加代碼
if ( !isNotify
{
nid.cbSize = (DWORDsizeof(NOTIFYICONDATA;
nid.hWnd = this->m_hWnd;
nid.uID = IDR_MAINFRAME;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP|NIF_INFO;
nid.uCallbackMessage = WM_
7、SHOWTASK; // 自定義的消息名稱(chēng) , 注意 :這里的
消 息是用戶(hù)自定義消息
nid.hIcon =
LoadIcon(AfxGetInstanceHandle(,MAKEINTRESOURCE(IDR_MAINFRAME;
wcscpy_s(nid.szTip,_T("提示標(biāo)題 ";
wcscpy_s(nid.szInfo,_T("提示內(nèi)容 ";
wcscpy_s(nid.szInfoTitle,_T(" 提示標(biāo)題 ";
nid.dwInfoFlags = NIIF_INFO;
nid.
8、uTimeout = 5000;
Shell_NotifyIcon(NIM_ADD,&nid; // 在托盤(pán)區(qū)添加圖標(biāo)
}
ShowWindow(SW_HIDE; // 隱藏主窗口
7. 在 OnDestroy(函數(shù)中添加代碼
void CCamProjDlg::OnDestroy(
{
CDialog::OnDestroy(;
// TODO: Add your message handler code here Shell_NotifyIcon(NIM_DELET
9、E,&nid; }
1、在資源中的 Icon 中導(dǎo)入一個(gè)自己喜歡的圖標(biāo) , ID 命名為 IDR_MAINFRAME, 將先 前的 IDR_MAINFRAME 的圖標(biāo)刪除掉 ;
2、在自己的 Dialog 頭文件中定義一個(gè)變量 NOTIFYICONDATA m_nid, 關(guān)于該
結(jié)構(gòu) 體的具體信息可以查閱 MSDN ;
3、添加消息響應(yīng)函數(shù) OnInitDialog(, 并在該函數(shù)中添加以下代碼 ,這樣程序一啟
動(dòng) , 就在托盤(pán)中顯示出了自己應(yīng)用程序的圖標(biāo)。
//--------------------------- 托盤(pán)顯示 ----
10、-----------------------------//
m_nid.cbSize = (DWORDsizeof(NOTIFYICONDATA;
m_nid.hWnd = this->m_hWnd;
m_nid.uID = IDR_MAINFRAME;
m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
m_nid.uCallbackMessage = WM_SHOWTASK; // 自定義的消息名稱(chēng)
m_nid.hIcon=
LoadIcon
11、(AfxGetInstanceHandle(,MAKEINTRESOURCE(IDR_MAINFRAME;
// 信息提示條為 " 服務(wù)器程序 " , VS2008 UNICODE 編碼用 wcscpy_s(函數(shù)
strcpy(m_nid.szTip, "服務(wù)器程序 ";
Shell_NotifyIcon(NIM_ADD, &m_nid; // 在托盤(pán)區(qū)添加圖標(biāo)
這時(shí)候編譯 ,會(huì)報(bào) WM_SHOWTASK 的錯(cuò) ,因?yàn)樵撓⒁约憾x。
4、在 Dialog 頭文件中聲明消息函數(shù)原型
LR
12、ESULT OnShowTask(WPARAM wParam, LPARAM lParam;
5、在 Dialog 源文件中進(jìn)行消息映射
ON_MESSAGE(WM_SHOWTASK,OnShowTask
6、在 Dialog 源文件中添加自定義的消息響應(yīng)代碼 ,左鍵雙擊彈出應(yīng)用程序主窗
口 ,右 鍵單擊彈出菜單。
LRESULT CServerDlg::OnShowTask(WPARAM wParam, LPARAM lParam
{
if(wParam != IDR_MAINFRAME
13、return 1;
switch(lParam
{
case WM_RBUTTONUP: // 右鍵起來(lái)時(shí)彈出菜單
{
LPPOINT lpoint = new tagPOINT;
::GetCursorPos(lpoint; // 得到鼠標(biāo)位置
CMenu menu;
menu.CreatePopupMenu(; //聲明一個(gè)彈出式菜單
menu.AppendMenu(MF_STRING, WM_DESTROY, " 關(guān)閉 ";
menu
14、.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;
15、
}
7、添加 OnSize 消息響應(yīng)函數(shù) ,處理最小化時(shí)的操作。
void CServerDlg::OnSize(UINT nType, int cx, int cy
{
CDialog::OnSize(nType, cx, cy;
// TODO: Add your message handler code here if(nType == SIZE_MINIMIZED
{
ShowWindow(SW_HIDE; // 當(dāng)最小化市 ,隱藏主窗口
}
16、
}
8、添加關(guān)閉窗口時(shí)的消息響應(yīng)函數(shù) ,將托盤(pán)中的應(yīng)用程序圖標(biāo)刪除
BOOL CServerDlg::DestroyWindow(
{
// TODO: Add your specialized code here and/or call the base class
// 在托盤(pán)區(qū)刪除圖標(biāo)
Shell_NotifyIcon(NIM_DELETE, &m_nid;
return CDialog::DestroyWindow(;
}
經(jīng)過(guò)以上的步驟 , 就編寫(xiě)出了一個(gè)簡(jiǎn)單的可以最小化到托盤(pán)的程序。 該程序在一啟動(dòng)時(shí) , 在 托盤(pán)創(chuàng)立應(yīng)用程序的圖標(biāo) ,最小化程序時(shí)隱藏主窗口 ,雙擊托盤(pán)區(qū)的圖標(biāo)時(shí) ,顯示主窗口 , 右鍵點(diǎn)擊托盤(pán)區(qū)窗口時(shí) ,彈出菜單進(jìn)行相應(yīng)的操作。