Posted on 2006-12-13 16:18
奔跑的阿甘 閱讀(822)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
SDK/MFC
如何實(shí)現(xiàn)模式對(duì)話框程序啟動(dòng)時(shí)的系統(tǒng)欄顯示
Michael Wednesday, December 13, 2006
在實(shí)際工作中,需要用到一些類似狀態(tài)監(jiān)控的程序,它們往往在一啟動(dòng)時(shí)就要最小化到系統(tǒng)欄上.
這里涉及到兩個(gè)問(wèn)題:1)如何在啟動(dòng)時(shí)隱藏主窗口; 2)用托盤(pán)實(shí)現(xiàn)系統(tǒng)欄顯示.
模式對(duì)話框和非模式對(duì)話框的區(qū)別在于是否自身?yè)碛幸粋€(gè)消息循環(huán),對(duì)于模式對(duì)話框程序,要實(shí)現(xiàn)程序啟動(dòng)時(shí)的隱藏,一個(gè)比較完美(無(wú)閃爍地隱藏)的做法如下
?1
BOOL?CMyApp::InitInstance()
?2

{
?3
??//?
?4
?5
??CMyDlg*?pDlg?=?new?CMyDlg;
?6
??if?(pDlg->Create(IDD_MY_DIALOG))?
{
?7
????m_pMainWnd?=?pDlg;
?8
????Run();
?9
????if?(pDlg)?
{
10
??????delete?pDlg;
11
??????pDlg?=?NULL;
12
????}
13
??}
14
??return?FALSE;
15
}
這里使用CWnd::Create()函數(shù)來(lái)創(chuàng)建一非模式對(duì)話框,同時(shí)添加了消息循環(huán)的處理Run(). 因?yàn)閜Dlg(屬性為非visible)并沒(méi)有調(diào)用ShowWindow(),所以創(chuàng)建后為隱藏狀態(tài).
關(guān)于托盤(pán)的顯示只要調(diào)用WINDOWS的SHELL API即可.
以下代碼用于添加一托盤(pán):
1
????????NOTIFYICONDATA?nc;
2
????nc.cbSize=sizeof(NOTIFYICONDATA);
3
????nc.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
4
????nc.hWnd=m_hWnd;
5
????lstrcpy(nc.szTip,"Hi!");
6
????nc.uCallbackMessage=WM_NC;
7
????nc.uFlags=NIF_ICON?|?NIF_MESSAGE?|?NIF_TIP;
8
????nc.uID=IDC_NC;
9
????Shell_NotifyIcon(NIM_ADD,&nc); 以下代碼用于刪除一托盤(pán):
1
????????NOTIFYICONDATA?nc;
2
????nc.cbSize=sizeof(NOTIFYICONDATA);
3
????nc.hWnd=m_hWnd;
4
????nc.uCallbackMessage=WM_NC;
5
????nc.uFlags=NIF_ICON?|?NIF_MESSAGE?|?NIF_TIP;
6
????nc.uID=IDC_NC;
7
????Shell_NotifyIcon(NIM_DELETE,&nc); 托盤(pán)圖標(biāo)的消息定義及響應(yīng)函數(shù)如下:
//定義消息碼
#define? WM_NC? 1001
#define? IDC_NC 1002
//定義消息映射
ON_MESSAGE(WM_NC,OnNc)
//定義消息處理函數(shù)聲明
afx_msg void OnNc(WPARAM wParam,LPARAM IParam);
//定義消息處理函數(shù)實(shí)現(xiàn)
?1
void?CMyDlg::OnNc(WPARAM?wParam,LPARAM?IParam)
?2

{
?3
????if?((IParam?==?WM_LBUTTONDOWN)?||?(IParam?==?WM_RBUTTONDOWN))
?4
????
{
?5
????????CMenu?menu;
?6
????????menu.LoadMenu(IDR_MENU1);
?7
????????CMenu*?pPopup=menu.GetSubMenu(0);
?8
????????::SetMenuDefaultItem(pPopup->m_hMenu,0,TRUE);
?9
????????CPoint?Point;
10
????????GetCursorPos(&Point);
11
????????pPopup->TrackPopupMenu(TPM_LEFTALIGN,Point.x,Point.y,AfxGetMainWnd(),NULL);
12
????}
13
} 最后很關(guān)鍵的是,因?yàn)槲覀儾捎昧朔悄J娇騺?lái)隱藏窗口,當(dāng)對(duì)話框退出后,我們需要調(diào)用PostQuitMessage()來(lái)發(fā)送WM_QUIT消息給應(yīng)用程序從而結(jié)束消息循環(huán)退出整個(gè)程序.
[全文完]