VC++中把一个对话框最小化到托盘[转载]
From:?http://hi.baidu.com/maxlcl/blog/item/61e83c87de35e529c65cc3e0.html
一、托盤簡(jiǎn)介?
所謂的“托盤”,在Windows系統(tǒng)界面中,指的就是下面任務(wù)條右側(cè),有系統(tǒng)時(shí)間等等的標(biāo)志的那一部分。在程序最小化或掛起時(shí),但有不希望占據(jù)任務(wù)欄的時(shí)候,就可以把程序放到托盤區(qū)。?
二、托盤編程相關(guān)函數(shù)?
把程序放到托盤上的本質(zhì)就是先在托盤區(qū)繪制一個(gè)圖標(biāo),然后把程序隱藏不見,再對(duì)托盤的圖標(biāo)進(jìn)行消息處理,就可以了。?
繪制圖標(biāo)以及確定圖標(biāo)所傳送消息的函數(shù)只有一個(gè):?
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(?
DWORD dwMessage,?
PNOTIFYICONDATA pnid?
);?
這個(gè)函數(shù),負(fù)責(zé)向系統(tǒng)傳遞消息,以添加、修改或刪除托盤區(qū)的圖標(biāo)。?
參數(shù)dwMessage 是表示這個(gè)函數(shù)的應(yīng)用功能是哪一方面,是添加、刪除,還是修改圖標(biāo)。如果是添加,則它的值為NIM_ADD;刪除則是NIM_DELETE;而修改是NIM_MODIFY。參數(shù)pnid就是具體的和程序在托盤區(qū)的圖標(biāo)有關(guān)系的結(jié)構(gòu)了。它的定義如下:?
下面就對(duì)該結(jié)構(gòu)各個(gè)參數(shù)進(jìn)行刨析:?
cbSize : 結(jié)構(gòu)的長(zhǎng)度,用“位”來做單位。一般在程序中,我們用(DWORD)sizeof(NOTIFYICONDATA) 給它賦值。?
HWnd : 一個(gè)句柄,如果對(duì)托盤中的圖標(biāo)進(jìn)行操作,相應(yīng)的消息就傳給這個(gè)句柄所代表的窗口。大多數(shù)情況下是this->m_hWnd。?
uID : 在工程中定義的圖標(biāo)ID?
uFlags : 這個(gè)成員標(biāo)志著其他哪些成員的數(shù)據(jù)是有效的,分別為NIF_ICON, NIF_MESSAGE, NIF_TIP,分別代表著數(shù)據(jù)有效的成員是hIcon, uCallbackMessage, szTip。當(dāng)然,三個(gè)值可以用“|”聯(lián)系到一起。下面分別對(duì)涉及到的成員進(jìn)行闡述?
hIcon : 要增加,刪除或修改的圖標(biāo)句柄。如果只知道個(gè)uID, 一般可能會(huì)用函數(shù)LoadIcon來得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。?
uCallbackMessage : 這在對(duì)托盤區(qū)的操作中,是比較重要的數(shù)據(jù)成員。這是個(gè)消息標(biāo)志,當(dāng)用鼠標(biāo)對(duì)托盤區(qū)相應(yīng)圖標(biāo)進(jìn)行操作的時(shí)候,就會(huì)傳遞消息給Hwnd所代表的窗口。所以說,在uFlags中,一般都得標(biāo)志它有效。這里一般都是自定義的消息。?
szTip : 鼠標(biāo)移動(dòng)到托盤圖標(biāo)上時(shí)的提示文字。?
三、托盤編程例子?
1、將程序最小化到系統(tǒng)托盤區(qū)的函數(shù):添加一個(gè)按鈕的點(diǎn)擊事件。?
? void CDdDlg::OnBtnHide() // 隱藏主窗口,顯示到系統(tǒng)托盤區(qū) {NOTIFYICONDATA nid; nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); nid.hWnd = this->m_hWnd; nid.uID = IDR_MAINFRAME; nid.uFlags = NIF_ICON|NIF_MESSAGE | NIF_TIP;nid.uCallbackMessage = WM_SHOWTASK; // 自定義的消息名稱 nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nid.szTip, "計(jì)劃任務(wù)提醒"); // 信息提示條為“計(jì)劃任務(wù)提醒” Shell_NotifyIcon(NIM_ADD, &nid); // 在托盤區(qū)添加圖標(biāo)ShowWindow(SW_HIDE); // 隱藏主窗口 }
這是個(gè)很簡(jiǎn)單的函數(shù),里面首先給NOTIFYICONDATA賦值,然后調(diào)用shell_NotifyIcon, 頭一個(gè)參數(shù)是NIM_ADD,表示添加。然后用函數(shù)ShowWindow 隱藏主窗口,這樣,就實(shí)現(xiàn)了將程序最小化到系統(tǒng)托盤區(qū)的任務(wù)了。?
2、程序已經(jīng)最小化到托盤區(qū)了,但是對(duì)托盤圖標(biāo)的操作如何進(jìn)行呢?這就體現(xiàn)了結(jié)構(gòu)NOTIFYICONDATA的成員uCallbackMessage 的作用了。它所提供的作用就是,當(dāng)用戶用鼠標(biāo)點(diǎn)擊托盤區(qū)的圖標(biāo)的時(shí)候(無論是左鍵還是右鍵),會(huì)向hWnd所代表的窗口傳送消息.?
如上例,我們自定義了消息WM_SHOWTASK。根據(jù)VC的消息機(jī)制,對(duì)自定義消息增加消息響應(yīng)函數(shù).?
在*Dlg.cpp文件上面定義一個(gè)用戶消息:?
#define WM_SHOWTASK (WM_USER + 2012)?
在頭文件的//{{AFX_MSG和//}}AFX_MSG之間聲明消息響應(yīng)函數(shù):?
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam); ?
然后在CPP文件中添加消息映射。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之間加入: ON_MESSAGE(WM_SHOWTASK,onShowTask)將消息和消息響應(yīng)函數(shù)映射起來。?
然后就是在CPP文件中加入函數(shù)onShowTask的實(shí)現(xiàn)了:?
LRESULT CDdDlg::onShowTask(WPARAM wParam, LPARAM lParam) // wParam接收的是圖標(biāo)的ID,而lParam接收的是鼠標(biāo)的行為 { if(wParam != IDR_MAINFRAME)return 1; switch(lParam) { case WM_RBUTTONUP: //右鍵菜單 {LPPOINT lpoint = new tagPOINT; ::GetCursorPos(lpoint); // 得到鼠標(biāo)位置 CMenu menu; menu.CreatePopupMenu(); // 創(chuàng)建一個(gè)彈出式菜單 //增加菜單項(xiàng)“關(guān)閉”,點(diǎn)擊則發(fā)送消息WM_DESTROY給主窗口(已隱藏),退出程序menu.AppendMenu(MF_STRING, WM_DESTROY, "關(guān)閉");menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this); //確定彈出式菜單的位置HMENU hmenu = menu.Detach(); // 資源回收menu.DestroyMenu();delete lpoint;} break;case WM_LBUTTONDBLCLK: // 左鍵雙擊{ this->ShowWindow(SW_SHOW); // 顯示主窗口} break;}return 0; }
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的VC++中把一个对话框最小化到托盘[转载]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 10下,如何使用Powe
- 下一篇: Windows常用运行库下载 (Dire