如何實現模式對話框程序啟動時的系統欄顯示
Michael Wednesday, December 13, 2006
在實際工作中,需要用到一些類似狀態監控的程序,它們往往在一啟動時就要最小化到系統欄上.
這里涉及到兩個問題:1)如何在啟動時隱藏主窗口; 2)用托盤實現系統欄顯示.
模式對話框和非模式對話框的區別在于是否自身擁有一個消息循環,對于模式對話框程序,要實現程序啟動時的隱藏,一個比較完美(無閃爍地隱藏)的做法如下
這里使用CWnd::Create()函數來創建一非模式對話框,同時添加了消息循環的處理Run(). 因為pDlg(屬性為非visible)并沒有調用ShowWindow(),所以創建后為隱藏狀態.
關于托盤的顯示只要調用WINDOWS的SHELL API即可.
以下代碼用于添加一托盤:
以下代碼用于刪除一托盤:
托盤圖標的消息定義及響應函數如下:
//定義消息碼
#define? WM_NC? 1001
#define? IDC_NC 1002
//定義消息映射
ON_MESSAGE(WM_NC,OnNc)
//定義消息處理函數聲明
afx_msg void OnNc(WPARAM wParam,LPARAM IParam);
//定義消息處理函數實現
最后很關鍵的是,因為我們采用了非模式框來隱藏窗口,當對話框退出后,我們需要調用PostQuitMessage()來發送WM_QUIT消息給應用程序從而結束消息循環退出整個程序.
[全文完]
Michael Wednesday, December 13, 2006
在實際工作中,需要用到一些類似狀態監控的程序,它們往往在一啟動時就要最小化到系統欄上.
這里涉及到兩個問題:1)如何在啟動時隱藏主窗口; 2)用托盤實現系統欄顯示.
模式對話框和非模式對話框的區別在于是否自身擁有一個消息循環,對于模式對話框程序,要實現程序啟動時的隱藏,一個比較完美(無閃爍地隱藏)的做法如下
?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
}

?2



?3


?4

?5

?6



?7

?8

?9



10

11

12

13

14

15

這里使用CWnd::Create()函數來創建一非模式對話框,同時添加了消息循環的處理Run(). 因為pDlg(屬性為非visible)并沒有調用ShowWindow(),所以創建后為隱藏狀態.
關于托盤的顯示只要調用WINDOWS的SHELL API即可.
以下代碼用于添加一托盤:
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);

2

3

4

5

6

7

8

9

以下代碼用于刪除一托盤:
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);

2

3

4

5

6

7

托盤圖標的消息定義及響應函數如下:
//定義消息碼
#define? WM_NC? 1001
#define? IDC_NC 1002
//定義消息映射
ON_MESSAGE(WM_NC,OnNc)
//定義消息處理函數聲明
afx_msg void OnNc(WPARAM wParam,LPARAM IParam);
//定義消息處理函數實現
?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
}

?2



?3

?4



?5

?6

?7

?8

?9

10

11

12

13

最后很關鍵的是,因為我們采用了非模式框來隱藏窗口,當對話框退出后,我們需要調用PostQuitMessage()來發送WM_QUIT消息給應用程序從而結束消息循環退出整個程序.
[全文完]