托盤程式設計(出處:程式設計愛好者網站)
所謂的“托盤”,在Windows系統介面中,指的就是下面任務條右側,有系統時間等等的標誌的那一部分。在程式最小化或掛起時,但有不希望佔據工作列的時候,就可以把程式放到托盤區。其實,托盤區的程式設計很簡單,下面簡要闡述一下子嘍^_^[@more@]一、 托盤簡介
所謂的“托盤”,在Windows系統介面中,指的就是下面任務條右側,有系統時間等等的標誌的那一部分。在程式最小化或掛起時,但有不希望佔據工作列的時候,就可以把程式放到托盤區。其實,托盤區的程式設計很簡單,下面簡要闡述一下子嘍^_^
二、 托盤程式設計相關函式
其實呢,把程式放到托盤上的本質就是先在托盤區繪製一個圖示,然後把程式隱藏不見,再對托盤的圖示進行訊息處理,就可以了。
繪製圖示以及確定圖示所傳送訊息的函式只有一個,那就是——————
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
這個函式呢,負責向系統傳遞訊息,以新增、修改或刪除托盤區的圖示。
她的返回值呢,是個布林型別的。就是說,如果返回0,那就是成仁啦,非0才成功。
引數dwMessage 是表示這個函式的應用功能是哪一方面,是新增、刪除,還是修改圖示。如果是新增,則它的值為NIM_ADD;刪除則是NIM_DELETE;而修改是NIM_MODIFY。
引數pnid就是具體的和程式在托盤區的圖示有關係的結構了。它的定義如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
下面就對該結構各個引數進行刨析:
cbSize : 結構的長度,用“位”來做單位。一般在程式中,我們用(DWORD)sizeof(NOTIFYICONDATA) 給它賦值。
HWnd : 一個控制程式碼,如果對托盤中的圖示進行操作,相應的訊息就傳給這個控制程式碼所代表的視窗。自然了,大多數情況下是this->m_hWnd嘍。
uID : 在工程中定義的圖示ID
uFlags : 這個成員標誌著其他哪些成員的資料是有效的,分別為NIF_ICON, NIF_MESSAGE, NIF_TIP,分別代表著資料有效的成員是hIcon, uCallbackMessage, szTip。當然,三個值可以用“|”聯絡到一起。下面分別對涉及到的成員進行闡述
hIcon : 要增加,刪除或修改的圖示控制程式碼。如果只知道個uID, 一般可能會用函式LoadIcon來得到控制程式碼。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。
uCallbackMessage : 這在對托盤區的操作中,是比較重要的資料成員。這是個訊息標誌,當用滑鼠對托盤區相應圖示進行操作的時候,就會傳遞訊息給Hwnd所代表的視窗。所以說,在uFlags中,一般都得標誌它有效。這裡一般都是自定義的訊息。
szTip : 滑鼠移動到托盤圖示上時的提示文字。
三、 托盤程式設計例子
有關托盤程式設計的基礎知識呢,也就上面這些了。下面呢,我們就進入具體的實戰演練階段,舉幾個托盤程式設計的例子瞧瞧,加深理解。
1、 將程式最小化到系統托盤區的函式toTray()。
void CTimeWakeDlg::toTray()
{
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,"計劃任務提醒");//資訊提示條為“計劃任務提醒”
Shell_NotifyIcon(NIM_ADD,&nid);//在托盤區新增圖示
ShowWindow(SW_HIDE);//隱藏主視窗
}
這是個很簡單的函式,裡面首先給NOTIFYICONDATA賦值,然後呼叫shell_NotifyIcon, 頭一個引數是NIM_ADD,表示新增。然後用函式ShowWindow 隱藏主視窗,這樣,就實現了將程式最小化到系統托盤區的任務了。
2、 程式已經最小化到托盤區了,但是呢,對托盤圖示的操作如何進行呢?這就體現了結構NOTIFYICONDA他的成員uCallbackMessage 的作用了。它所提供的作用就是,當使用者用滑鼠點選托盤區的圖示的時候(無論是左鍵還是右鍵),會向hWnd所代表的視窗傳送訊息,如果是上例,訊息的名稱就是WM_SHOWTASK。根據VC的訊息機制,對自定義訊息增加訊息響應函式。
在標頭檔案的//{{AFX_MSG和//}}AFX_MSG之間宣告訊息響應函式:
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
然後在CPP檔案中新增訊息對映。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之間加入:
ON_MESSAGE(WM_SHOWTASK,onShowTask)將訊息和訊息響應函式對映起來。
然後就是在CPP檔案中加入函式onShowTask的實現了:
LRESULT CTimeWakeDlg::onShowTask(WPARAM wParam,LPARAM lParam)
//wParam接收的是圖示的ID,而lParam接收的是滑鼠的行為
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右鍵起來時彈出快捷選單,這裡只有一個“關閉”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到滑鼠位置
CMenu menu;
menu.CreatePopupMenu();//宣告一個彈出式選單
//增加選單項“關閉”,點選則傳送訊息WM_DESTROY給主視窗(已
//隱藏),將程式結束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"關閉");
//確定彈出式選單的位置
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;
}
所謂的“托盤”,在Windows系統介面中,指的就是下面任務條右側,有系統時間等等的標誌的那一部分。在程式最小化或掛起時,但有不希望佔據工作列的時候,就可以把程式放到托盤區。其實,托盤區的程式設計很簡單,下面簡要闡述一下子嘍^_^
二、 托盤程式設計相關函式
其實呢,把程式放到托盤上的本質就是先在托盤區繪製一個圖示,然後把程式隱藏不見,再對托盤的圖示進行訊息處理,就可以了。
繪製圖示以及確定圖示所傳送訊息的函式只有一個,那就是——————
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
這個函式呢,負責向系統傳遞訊息,以新增、修改或刪除托盤區的圖示。
她的返回值呢,是個布林型別的。就是說,如果返回0,那就是成仁啦,非0才成功。
引數dwMessage 是表示這個函式的應用功能是哪一方面,是新增、刪除,還是修改圖示。如果是新增,則它的值為NIM_ADD;刪除則是NIM_DELETE;而修改是NIM_MODIFY。
引數pnid就是具體的和程式在托盤區的圖示有關係的結構了。它的定義如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
下面就對該結構各個引數進行刨析:
cbSize : 結構的長度,用“位”來做單位。一般在程式中,我們用(DWORD)sizeof(NOTIFYICONDATA) 給它賦值。
HWnd : 一個控制程式碼,如果對托盤中的圖示進行操作,相應的訊息就傳給這個控制程式碼所代表的視窗。自然了,大多數情況下是this->m_hWnd嘍。
uID : 在工程中定義的圖示ID
uFlags : 這個成員標誌著其他哪些成員的資料是有效的,分別為NIF_ICON, NIF_MESSAGE, NIF_TIP,分別代表著資料有效的成員是hIcon, uCallbackMessage, szTip。當然,三個值可以用“|”聯絡到一起。下面分別對涉及到的成員進行闡述
hIcon : 要增加,刪除或修改的圖示控制程式碼。如果只知道個uID, 一般可能會用函式LoadIcon來得到控制程式碼。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。
uCallbackMessage : 這在對托盤區的操作中,是比較重要的資料成員。這是個訊息標誌,當用滑鼠對托盤區相應圖示進行操作的時候,就會傳遞訊息給Hwnd所代表的視窗。所以說,在uFlags中,一般都得標誌它有效。這裡一般都是自定義的訊息。
szTip : 滑鼠移動到托盤圖示上時的提示文字。
三、 托盤程式設計例子
有關托盤程式設計的基礎知識呢,也就上面這些了。下面呢,我們就進入具體的實戰演練階段,舉幾個托盤程式設計的例子瞧瞧,加深理解。
1、 將程式最小化到系統托盤區的函式toTray()。
void CTimeWakeDlg::toTray()
{
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,"計劃任務提醒");//資訊提示條為“計劃任務提醒”
Shell_NotifyIcon(NIM_ADD,&nid);//在托盤區新增圖示
ShowWindow(SW_HIDE);//隱藏主視窗
}
這是個很簡單的函式,裡面首先給NOTIFYICONDATA賦值,然後呼叫shell_NotifyIcon, 頭一個引數是NIM_ADD,表示新增。然後用函式ShowWindow 隱藏主視窗,這樣,就實現了將程式最小化到系統托盤區的任務了。
2、 程式已經最小化到托盤區了,但是呢,對托盤圖示的操作如何進行呢?這就體現了結構NOTIFYICONDA他的成員uCallbackMessage 的作用了。它所提供的作用就是,當使用者用滑鼠點選托盤區的圖示的時候(無論是左鍵還是右鍵),會向hWnd所代表的視窗傳送訊息,如果是上例,訊息的名稱就是WM_SHOWTASK。根據VC的訊息機制,對自定義訊息增加訊息響應函式。
在標頭檔案的//{{AFX_MSG和//}}AFX_MSG之間宣告訊息響應函式:
afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
然後在CPP檔案中新增訊息對映。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之間加入:
ON_MESSAGE(WM_SHOWTASK,onShowTask)將訊息和訊息響應函式對映起來。
然後就是在CPP檔案中加入函式onShowTask的實現了:
LRESULT CTimeWakeDlg::onShowTask(WPARAM wParam,LPARAM lParam)
//wParam接收的是圖示的ID,而lParam接收的是滑鼠的行為
{
if(wParam!=IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP://右鍵起來時彈出快捷選單,這裡只有一個“關閉”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到滑鼠位置
CMenu menu;
menu.CreatePopupMenu();//宣告一個彈出式選單
//增加選單項“關閉”,點選則傳送訊息WM_DESTROY給主視窗(已
//隱藏),將程式結束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"關閉");
//確定彈出式選單的位置
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;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/79126/viewspace-989690/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 科技愛好者週刊(第 174 期):全能程式設計師 vs 特長程式設計師程式設計師
- 程式設計師最佳網站程式設計師網站
- 科技愛好者週刊(第 222 期):四十年程式設計感想程式設計
- 高階的網站設計有哪些好處?網站
- 程式設計師最愛的網站克隆爬取工具- HTTrack程式設計師網站
- Java 網路程式設計(TCP程式設計 和 UDP程式設計)Java程式設計TCPUDP
- 女生學程式設計有哪些好處呢?程式設計
- 推薦12個免費學程式設計的好網站程式設計網站
- 【go網路程式設計】-HTTP程式設計Go程式設計HTTP
- 好程式設計師:Java程式設計師面試秘籍程式設計師Java面試
- 程式設計師實用工具網站程式設計師網站
- 學習程式設計常用網站分享程式設計網站
- IT招聘網站(程式設計師跳槽指南)網站程式設計師
- 程式設計師如何實現“網際網路+”04-擁有獨立網站的好處程式設計師網站
- 程式設計好習慣程式設計
- 好程式設計師Python培訓分享Python程式設計中常見的異常處理程式設計師Python
- 程式設計和網路程式設計入門程式設計
- JAVA網路程式設計(2)TCP程式設計Java程式設計TCP
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- 程式設計與網站建設協會面試程式設計網站面試
- 2018,程式設計師生活的兩個興趣愛好程式設計師
- 6個程式設計實戰網站,想學程式設計的你不能錯過!程式設計網站
- Java 網路程式設計 —— 非阻塞式程式設計Java程式設計
- 【網路程式設計】阻塞IO程式設計的坑程式設計
- 玩轉 PHP 網路程式設計全套之多程式程式設計PHP程式設計
- 【Linux網路程式設計】網路程式設計常見概念Linux程式設計
- 科技愛好者週刊(第 223 期):程式設計師需要擔心裁員嗎?程式設計師
- 好程式設計師不寫程式碼程式設計師
- 程式設計師之愛情觀程式設計師
- 程式設計師的鍵盤程式設計師
- 結對程式設計大法好程式設計
- 網路程式設計程式設計
- Python網路程式設計——程式Python程式設計
- 程式設計好學嗎?零基礎能學程式設計嗎?程式設計
- 【乾貨】程式設計師必逛的網站程式設計師網站
- 程式設計師超實用工具網站大全程式設計師網站
- 程式設計師經常去的網站有哪些?程式設計師網站
- 程式設計師學習、招聘網站導航程式設計師網站
- 程式設計師必收藏的五個網站程式設計師網站