利用Visual C++實(shí)現(xiàn)系統(tǒng)托盤程序
發(fā)布時(shí)間:2008/8/23 0:00:00 訪問次數(shù):502
自從微軟公司推出windows 95操作系統(tǒng)以來,系統(tǒng)托盤應(yīng)用作為一種極具吸引力的用戶界面設(shè)計(jì)深受廣大用戶的喜愛。使用系統(tǒng)托盤作為用戶界面的windows應(yīng)用程序數(shù)不勝數(shù),比如"金山詞霸"、"winamp"、"realplayer"等等。
這些程序運(yùn)行時(shí)不顯示運(yùn)行窗口,只在任務(wù)欄上顯示一個(gè)圖標(biāo),表示程序正在運(yùn)行,用戶可以通過鼠標(biāo)與應(yīng)用程序交互,程序開發(fā)人員有時(shí)也需要編制一些僅在后臺(tái)運(yùn)行的類似程序,為了不干擾前臺(tái)程序的運(yùn)行界面和不顯示不必要的窗口,應(yīng)使程序運(yùn)行時(shí)的主窗口不可見。同時(shí)將一個(gè)圖標(biāo)顯示在任務(wù)欄右端靜態(tài)通告區(qū)中并響應(yīng)用戶的鼠標(biāo)動(dòng)作。本實(shí)例就介紹visual c++開發(fā)這類程序的設(shè)計(jì)方法,該程序編譯運(yùn)行后,如果雙擊托盤圖標(biāo),程序會(huì)彈出一個(gè)消息列表窗口,只要鼠標(biāo)在托盤圖標(biāo)上移動(dòng)或點(diǎn)擊(無論是左右鍵的單擊或雙擊),產(chǎn)生的消息都會(huì)顯示在這個(gè)窗口里;當(dāng)鼠標(biāo)光標(biāo)移到托盤圖標(biāo)上時(shí),在圖標(biāo)附近會(huì)顯示提示信息;單擊右鍵時(shí)彈出上下文菜單,這個(gè)菜單中應(yīng)包含打開屬性頁的命令或者打開與圖標(biāo)相關(guān)的其它窗口的命令,另外,該程序還可以動(dòng)態(tài)的改變托盤的圖標(biāo)。參照這個(gè)例子,相信讀者能輕松自如地在自己的程序中應(yīng)用系統(tǒng)托盤。
一、實(shí)現(xiàn)方法
為了實(shí)現(xiàn)拖盤程序,首先要使程序的主窗口不可見,這點(diǎn)實(shí)現(xiàn)起來十分容易,只要調(diào)用showwindow(sw_hide)就可以了,本實(shí)例采用的就是這種方法,還有一種思路是通過分別設(shè)置主邊框窗口的風(fēng)格和擴(kuò)展風(fēng)格來隱藏主框架:
bool cmainframe::precreatewindow(createstruct& cs)
{
cs.style =ws_popup;//使主窗口不可見;
cs.dwexstyle =ws_ex_toolwindow;//不顯示任務(wù)按鈕;
return cframewnd::precreatewindow(cs);
}
在任務(wù)條上顯示圖標(biāo)是利用系統(tǒng)api函數(shù)shell_notifyicon()來將一個(gè)圖標(biāo)顯示在任務(wù)欄的通告區(qū)中。該函數(shù)的原型為:
bool shell_notifyicon(dword dwmessage, pnotifyicondata pnid);
該函數(shù)的第一個(gè)參數(shù)dwmessage類型為dword,表示要進(jìn)行的動(dòng)作,它可以是下面的值之一:
nim_add: 添加一個(gè)圖標(biāo)到任務(wù)欄。
nim_modify: 修改狀態(tài)欄區(qū)域的圖標(biāo)。
nim_delete: 刪除狀態(tài)欄區(qū)域的圖標(biāo)。
nim_setfocus: 將焦點(diǎn)返回到任務(wù)欄通知區(qū)域。當(dāng)完成用戶界面操作時(shí),任務(wù)欄圖標(biāo)必須用此消息。例如,如果任務(wù)欄圖標(biāo)正顯示上下文菜單,但用戶按下"escape"鍵取消操作,這時(shí)就必須用此消息將焦點(diǎn)返回到任務(wù)欄通知區(qū)域。
nim_setversion:指示任務(wù)欄按照相應(yīng)的動(dòng)態(tài)庫版本工作。
第二個(gè)參數(shù)pnid是notifyicondata結(jié)構(gòu)的地址,其內(nèi)容視dwmessage的值而定。這個(gè)結(jié)構(gòu)在shellapi.h文件中定義如下:
typedef struct _notifyicondata {
dword cbsize; // 結(jié)構(gòu)大。╯izeof struct),必須設(shè)置
hwnd hwnd; // 發(fā)送通知消息的窗口句柄
uint uid; // 圖標(biāo)id ( 由回調(diào)函數(shù)的wparam 指定)
uint uflags;
uint ucallbackmessage; // 消息被發(fā)送到此窗口過程
hicon hicon; // 任務(wù)欄圖標(biāo)句柄
char sztip[64]; // 提示文本
} notifyicondata;
該結(jié)構(gòu)中uflags的值分別為:
#define nif_message 0x1 // 表示ucallbackmessage 有效
#define nif_icon 0x2 // 表示hicon 有效
#define nif_tip 0x4 // 表示sztip 有效
在該結(jié)構(gòu)的成員中,cbsize為該結(jié)構(gòu)所占的字節(jié)數(shù),hwnd為接受該圖標(biāo)所發(fā)出的消息的窗口的句柄(鼠標(biāo)在任務(wù)欄上程序圖標(biāo)上動(dòng)作時(shí)圖標(biāo)將發(fā)出消息,這個(gè)消息用戶要自己定義),uid為被顯示圖標(biāo)的id,uflags指明其余的幾個(gè)成員(hicon、ucallbackmessage和sztip)的值是否有效,ucallbackmessage為一個(gè)用戶自定義的消息,當(dāng)用戶在該圖標(biāo)上作用一些鼠標(biāo)動(dòng)作時(shí),圖標(biāo)將向應(yīng)用程序的主框架窗口(hwnd成員中指定的窗口)發(fā)出該消息,為了使程序的主框架得到該通知消息,需要設(shè)置notifyicondata 結(jié)構(gòu)的flag成員的值為nif_message。hicon為將在任務(wù)欄上顯示的圖標(biāo)句柄,sztip鼠標(biāo)停留在該圖標(biāo)上時(shí)顯示的提示字符串。
盡管shell_notifyicon函數(shù)簡單實(shí)用,但它畢竟是個(gè)win32 api,為此本實(shí)例將它封裝在了一個(gè)c++類中,這個(gè)類叫做ctrayicon,有了它,托盤編程會(huì)更加輕松自如,因?yàn)樗[藏了notifyicondata、消息代碼、標(biāo)志以及一些繁瑣的細(xì)節(jié)。
二、編程步驟
1、 啟動(dòng)visual c++6.0,生成一個(gè)單文檔的應(yīng)用程序traytest,取消文檔視圖支持;
2、 在cmainframe類中添加自定義消息#define wm_my_tray_notification wm_user+0,并在該類中為此自定義消息手動(dòng)添加消息映射on_message(wm_my_tray_notification, ontraynotification)和消息響應(yīng)函數(shù)afx_msg lresult ontraynotification(wparam wp, lparam lp);
3、 設(shè)計(jì)二個(gè)圖
自從微軟公司推出windows 95操作系統(tǒng)以來,系統(tǒng)托盤應(yīng)用作為一種極具吸引力的用戶界面設(shè)計(jì)深受廣大用戶的喜愛。使用系統(tǒng)托盤作為用戶界面的windows應(yīng)用程序數(shù)不勝數(shù),比如"金山詞霸"、"winamp"、"realplayer"等等。
這些程序運(yùn)行時(shí)不顯示運(yùn)行窗口,只在任務(wù)欄上顯示一個(gè)圖標(biāo),表示程序正在運(yùn)行,用戶可以通過鼠標(biāo)與應(yīng)用程序交互,程序開發(fā)人員有時(shí)也需要編制一些僅在后臺(tái)運(yùn)行的類似程序,為了不干擾前臺(tái)程序的運(yùn)行界面和不顯示不必要的窗口,應(yīng)使程序運(yùn)行時(shí)的主窗口不可見。同時(shí)將一個(gè)圖標(biāo)顯示在任務(wù)欄右端靜態(tài)通告區(qū)中并響應(yīng)用戶的鼠標(biāo)動(dòng)作。本實(shí)例就介紹visual c++開發(fā)這類程序的設(shè)計(jì)方法,該程序編譯運(yùn)行后,如果雙擊托盤圖標(biāo),程序會(huì)彈出一個(gè)消息列表窗口,只要鼠標(biāo)在托盤圖標(biāo)上移動(dòng)或點(diǎn)擊(無論是左右鍵的單擊或雙擊),產(chǎn)生的消息都會(huì)顯示在這個(gè)窗口里;當(dāng)鼠標(biāo)光標(biāo)移到托盤圖標(biāo)上時(shí),在圖標(biāo)附近會(huì)顯示提示信息;單擊右鍵時(shí)彈出上下文菜單,這個(gè)菜單中應(yīng)包含打開屬性頁的命令或者打開與圖標(biāo)相關(guān)的其它窗口的命令,另外,該程序還可以動(dòng)態(tài)的改變托盤的圖標(biāo)。參照這個(gè)例子,相信讀者能輕松自如地在自己的程序中應(yīng)用系統(tǒng)托盤。
一、實(shí)現(xiàn)方法
為了實(shí)現(xiàn)拖盤程序,首先要使程序的主窗口不可見,這點(diǎn)實(shí)現(xiàn)起來十分容易,只要調(diào)用showwindow(sw_hide)就可以了,本實(shí)例采用的就是這種方法,還有一種思路是通過分別設(shè)置主邊框窗口的風(fēng)格和擴(kuò)展風(fēng)格來隱藏主框架:
bool cmainframe::precreatewindow(createstruct& cs)
{
cs.style =ws_popup;//使主窗口不可見;
cs.dwexstyle =ws_ex_toolwindow;//不顯示任務(wù)按鈕;
return cframewnd::precreatewindow(cs);
}
在任務(wù)條上顯示圖標(biāo)是利用系統(tǒng)api函數(shù)shell_notifyicon()來將一個(gè)圖標(biāo)顯示在任務(wù)欄的通告區(qū)中。該函數(shù)的原型為:
bool shell_notifyicon(dword dwmessage, pnotifyicondata pnid);
該函數(shù)的第一個(gè)參數(shù)dwmessage類型為dword,表示要進(jìn)行的動(dòng)作,它可以是下面的值之一:
nim_add: 添加一個(gè)圖標(biāo)到任務(wù)欄。
nim_modify: 修改狀態(tài)欄區(qū)域的圖標(biāo)。
nim_delete: 刪除狀態(tài)欄區(qū)域的圖標(biāo)。
nim_setfocus: 將焦點(diǎn)返回到任務(wù)欄通知區(qū)域。當(dāng)完成用戶界面操作時(shí),任務(wù)欄圖標(biāo)必須用此消息。例如,如果任務(wù)欄圖標(biāo)正顯示上下文菜單,但用戶按下"escape"鍵取消操作,這時(shí)就必須用此消息將焦點(diǎn)返回到任務(wù)欄通知區(qū)域。
nim_setversion:指示任務(wù)欄按照相應(yīng)的動(dòng)態(tài)庫版本工作。
第二個(gè)參數(shù)pnid是notifyicondata結(jié)構(gòu)的地址,其內(nèi)容視dwmessage的值而定。這個(gè)結(jié)構(gòu)在shellapi.h文件中定義如下:
typedef struct _notifyicondata {
dword cbsize; // 結(jié)構(gòu)大。╯izeof struct),必須設(shè)置
hwnd hwnd; // 發(fā)送通知消息的窗口句柄
uint uid; // 圖標(biāo)id ( 由回調(diào)函數(shù)的wparam 指定)
uint uflags;
uint ucallbackmessage; // 消息被發(fā)送到此窗口過程
hicon hicon; // 任務(wù)欄圖標(biāo)句柄
char sztip[64]; // 提示文本
} notifyicondata;
該結(jié)構(gòu)中uflags的值分別為:
#define nif_message 0x1 // 表示ucallbackmessage 有效
#define nif_icon 0x2 // 表示hicon 有效
#define nif_tip 0x4 // 表示sztip 有效
在該結(jié)構(gòu)的成員中,cbsize為該結(jié)構(gòu)所占的字節(jié)數(shù),hwnd為接受該圖標(biāo)所發(fā)出的消息的窗口的句柄(鼠標(biāo)在任務(wù)欄上程序圖標(biāo)上動(dòng)作時(shí)圖標(biāo)將發(fā)出消息,這個(gè)消息用戶要自己定義),uid為被顯示圖標(biāo)的id,uflags指明其余的幾個(gè)成員(hicon、ucallbackmessage和sztip)的值是否有效,ucallbackmessage為一個(gè)用戶自定義的消息,當(dāng)用戶在該圖標(biāo)上作用一些鼠標(biāo)動(dòng)作時(shí),圖標(biāo)將向應(yīng)用程序的主框架窗口(hwnd成員中指定的窗口)發(fā)出該消息,為了使程序的主框架得到該通知消息,需要設(shè)置notifyicondata 結(jié)構(gòu)的flag成員的值為nif_message。hicon為將在任務(wù)欄上顯示的圖標(biāo)句柄,sztip鼠標(biāo)停留在該圖標(biāo)上時(shí)顯示的提示字符串。
盡管shell_notifyicon函數(shù)簡單實(shí)用,但它畢竟是個(gè)win32 api,為此本實(shí)例將它封裝在了一個(gè)c++類中,這個(gè)類叫做ctrayicon,有了它,托盤編程會(huì)更加輕松自如,因?yàn)樗[藏了notifyicondata、消息代碼、標(biāo)志以及一些繁瑣的細(xì)節(jié)。
二、編程步驟
1、 啟動(dòng)visual c++6.0,生成一個(gè)單文檔的應(yīng)用程序traytest,取消文檔視圖支持;
2、 在cmainframe類中添加自定義消息#define wm_my_tray_notification wm_user+0,并在該類中為此自定義消息手動(dòng)添加消息映射on_message(wm_my_tray_notification, ontraynotification)和消息響應(yīng)函數(shù)afx_msg lresult ontraynotification(wparam wp, lparam lp);
3、 設(shè)計(jì)二個(gè)圖
熱門點(diǎn)擊
- CPLD開發(fā)板和FPGA開發(fā)板的區(qū)別
- 基于FPGA和AD1836的I2S接口設(shè)計(jì)
- vc中如何使用設(shè)備描述表
- Visual C++中調(diào)用DLL實(shí)現(xiàn)數(shù)據(jù)加密
- Visual C++6.0 API函數(shù)操作技
- JavaCard CPU的設(shè)計(jì)與FPGA實(shí)現(xiàn)
- VC++中進(jìn)程與多進(jìn)程管理的方法
- 如何用C語言開發(fā)DSP嵌入式系統(tǒng)
- C和C++ 字符串字面量的比較
- Xilinx針對(duì)Virtex-5 FXT F
推薦技術(shù)資料
- 聲道前級(jí)設(shè)計(jì)特點(diǎn)
- 與通常的Hi-Fi前級(jí)不同,EP9307-CRZ這臺(tái)分... [詳細(xì)]
- 高效率降壓 DC/DC 變換器
- 集成隔離電源 3kVRMS多
- 隔離式、雙輸入控制、高/低端半
- 隔離式、獨(dú)立雙通道柵極驅(qū)動(dòng)器
- Virtual Bench P
- 雙路輸出、數(shù)字、16 相控制器
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究