Windows任務欄編程

發表于:2007-07-14來源:作者:點擊數: 標簽:
Windows 95與Windows NT同Windows以前版本在人機界面上一個較為明顯的區別在于增加了一條系統任務條,從而極大地方便了用戶對系統間各個任務的管理。如果在程序中能夠對任務條進行靈活地控制,那一定會使程序增色不少。本文將重點介紹任務條中狀態區的編程要領
Windows 95與Windows NT同Windows以前版本在人機界面上一個較為明顯的區別在于增加了一條系統任務條,從而極大地方便了用戶對系統間各個任務的管理。如果在程序中能夠對任務條進行靈活地控制,那一定會使程序增色不少。本文將重點介紹任務條中狀態區的編程要領。
任務條主要包括以下幾個部分:起始菜單(Start menu),由Start button所彈出的菜單用于取得應用程序群組中的各個應用程序,對系統環境的設置,最近文檔的管理等一些基本的系統命令;任務按鈕(taskbar buttons),當應用程序創建一非擁有主窗口(unowned primarywi ndow即用WS-EX-AppWindow來填充CreateWindowEx函數的dwExStyle字段)時便會產生一任務按鈕,用它可對各個窗口進行切換;快捷菜單(
shortcut menu),用鼠標右鍵單擊任務條即會產生一快捷菜單,可層疊,平鋪各個窗口及設置任務條的屬性;狀態區(status area),當在任務條的屬性頁中選擇顯示時鐘項就會看到狀態區區域,在Windows 95 Plus!的系統管理、用M odem連Internet和當前的打印隊列,都會發現在狀態區中有非常形象的小圖標指示當前程序所處的狀態,用戶可以選用如下方式與狀態區的小圖標進行交互,移動鼠標至圖標上將會顯示一信息泡(ToolTip),單擊鼠標右鍵產生一快捷菜單,雙擊鼠標左鍵將執行快捷菜單中缺省命令。以下將詳細介紹在狀態區加入及刪除圖標的方法及狀態區鼠標消息傳遞的機制。
首先介紹只有Windows 95與Windows NT才支持的在shellapi.h下的API Shell-NotifyI con。

WINSHELLAPI BOOL WINAPI Shell-Notifylcon(
DWORD dwMessage,∥message identifier
PnotifyIcondata pnid∥pointer to structure
);

dwMessage可為NIM-Add,NIM-Delete,NIM-Modify分別指定在狀態區是加或刪或修改圖標。pnid為指向NotifyConData結構的指針,其內容取決于dwMessage的設置。函數執行若成功則返回true,否則返回false.接下來介紹NotifyConData結構。
typedef struct-NotifyIconData {∥ nid
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
}
NotifyIconData,*PNotifyIconData;

cbSize為NotifyIconData結構的大小;hWnd為接收圖標消息所在窗口的句柄;uID為同組圖標的統一標識符;uFlags分別NIF-Icon、NIF-Message、NIF-Tip為指明其下三項是否為有效數據;uCallbackMessage為程序所定義的消息標識符,系統會將在圖標所處的矩形區域的鼠標消息傳遞給hWnd所在窗口的uCallbackMessage消息;hIcon為圖標句柄;szTip為信息泡的字符數組。
筆者在VC4.2利用MFC4.2及這個函數編寫了一個實際的演示例子, 界面如圖1。圖1
功能為:當點中Enable或Disable的RadioBox時,Hide Button便使能,若按下則隱藏窗口口, 此時在狀態區中便可看到相應的圖標如圖2。
圖2
若鼠標左鍵按下圖標,則更替交換DisableIcon與EnableIcon圖標并置位各自的RadioBu tton以及顯示各自EditBox中的信息泡字符串;若鼠標右鍵按下圖標,則顯示窗口,并置為最前。
以下為增、刪、改圖標函數具體實現的源碼。
BOOL CTrayiconDlg::StatusArealcon(DWORD dwMessage,UINT u
lD,HICON hlcon,PSTR pszTip)
{
BOOL res;
NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=this->m-hWnd;
tnd.ulD=ulD;
tnd.uFlags=NIF-MESSAGE|NIF-ICON|NIF-TIP;
tnd.uCallbackMessage=WM-USER-NOTIFYICON;
tnd.hIcon=hIcon;
if(pszTip) lstrcpyn(tnd.szTip,pszTip,sizeof(tnd.szTip));
else tnd.szTip[0]=`\0'';
res=Shell-Notifylcon(dwMessage,&tnd);
return res;
}
以下為接收圖標消息具體實現的源碼。
LRESULT CTrayiconDlg::OnMyNotifyicon(WPARAM wParam,LPARAM lParam)
{
UINT uSelect;
switch(lParam)
{
case WM-LBUTTONDOWN:
switch(wParam)
{case IDICONTEAM:
uSelect=lsDlgButtonChecked(IDC-ENABLERADIO)?
IDC-DISABLERADIO:IDC-ENABLERADIO;
CheckRadioButton(IDC-ENABLERAIO,IDC-DISABLERADIO,uSelect);
GetDlgltemText(uSelect,m-Tip,64);
if(uSelect==IDC-ENABLERADIO)
{
GetDlgltemText(IDC-EDITENABLE,m-Tip,64);
StatusArealcon(NIM-MODIFY,IDHIDE,m-hlconEn,m-Tip);
}
else
{
GetDlgltemText(IDC-EDITDISABLE,m-Tip,64);
StatusArealcon(NIM-MODIFY,IDHIDE,m-hlconDis,m-Tip);
}
break;
default:
break;
}
break;
case WM-RBUTTONDOWN:
ShowWindow(SW-SHOW);
SetForegroundWindow();
break;
default:
break;
}
return 0;
}
由于使用的是MFC,所以還需要做一些輔助性工作。定義用戶自定義消息,并將該消息的各項聲明加入到相應聲明中去;并需要在窗口關閉時刪除圖標。這些內容相對簡單,這里不再贅述?,F在讀者一定可以動手編寫一個小的應用了,相信在看到自己的圖標在系統的任務條的狀態區中來回切換時,一定會因為深入切入系統而興奮不已,體會一下這種感覺吧! 

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97