用C++Builder實現工作列圖示動畫效果 (轉)

amyz發表於2007-08-15
用C++Builder實現工作列圖示動畫效果 (轉)[@more@]


主頁:/">
to::maxchou@163.com">郵件:maxchou@163.com


  平臺為應用提供許多的特色功能,任務圖欄就是一個非常實用和經典的一個。它不但可以節省工作列的空間,還可以透過不同的圖示或動畫效果來說明程式的當前狀態等的資訊。Windows裡沒有直接提供工作列圖示動畫效果的支援,所以要自己透過編碼實現,在這篇文章裡大家可以看到其中一種實現工作列圖示動畫效果的方法。

  首先要了解一下有關工作列圖示的知識,要實現對工作列圖示的控制主要是透過_NotifyIcon()進行。該函式的宣告如下:

BOOL Shell_NotifyIcon( D dwMessage, PNOTIFYICONDATA lpdata );


  引數dwMessage是指定進行什麼樣的動作,可選值有:NIM_ADD, NIM_DELETE, NIM_MODIFY, NIM_SETFOCUS, NIM_SETVERSION,分別代表為:新增、刪除、修改、獲得焦點、設定版本號,對於NIM_SETFOCUS,NIM_SETVERSION一般比較少用,我們最常使用的主要是NIM_ADD ,NIM_DELETE, NIM_MODIFY。

  另一個引數lpdata是一個NOTIFYICONDATA結構的指標,這個結構內容比較多,定義如下:

typedef struct _NOTIFYICONDATA { DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; HICON hIcon; #if (__< 0x0500) TCHAR szTip[64]; #else TCHAR szTip[128]; #endif #if (_WIN32_IE >= 0x0500) DWORD dwState; DWORD dwStateMask; TCHAR szInfo[256]; union { UINT uTimeout; UINT uVersion; } DUMMYUNIONNAME; TCHAR szInfoTitle[64]; DWORD dwInfoFlags; #endif #if (_WIN32_IE >= 0x600) GUID guidItem; #endif } NOTIFYICONDATA, *PNOTIFYICONDATA;


  在這裡我們主要留意上面粗體的成員cbSize, hWnd, uID, uFlags, uCallbackMessage, hIcon, szTip等的內容及用法。分別代表的意思是:結構體大小,視窗控制程式碼,圖示標識,回撥函式,所包含的內容標誌,圖示控制程式碼,文字提示。

  我們要定義自己的通知訊息和圖示標識來進行處理,內容如下:(這些內容在窗體的頭中定義)

const int WM_NC_NOTIFY = (WM_USER + 1); // 自定義的通知訊息 const int WM_NC_TRAYID = (WM_USER + 2); // 自定義的圖示標識


  一般情況下,都是在把應用程式最小化後才在工作列顯示小圖示,所以我們還必須捕獲訊息WM_SYMMAND中wParam引數所帶最小化命令,然後再進行有關的處理。另外最重要的就是要捕獲自定義通知訊息WM_NC_NOTIFY了,這些內容定義如下:(在窗體類的private內定義)

BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMSysCommand); VCL_MESSAGE_HANDLER(WM_NC_NOTIFY, TMessage, WMNCNotify) END_MESSAGE_MAP(TForm)


  為了要實現動畫效果,我們就需要有一個ImageList和Timer。ImageList中存放了每一幀的圖示,Timer是定時改變NOTIFYICONDATA結構中的圖示控制程式碼來實現動畫效果。主要建立幾個功能函式實現,分別是新增圖示AddTrayIcon(),修改圖示ModifyTrayIcon(),刪除圖示DeleteTrayIcon()。

  至於具體功能的實現細節這裡就不費筆墨了,大家可以/mss/tray_ani_src.rar">工作列圖示動畫示例原始碼進行檢視,該示例在BCB6 + 下編譯透過。歡迎交流!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-959266/,如需轉載,請註明出處,否則將追究法律責任。

相關文章