用 C++Builder 編寫 Tray 程式 (轉)
Tray(托盤)是9x任務條上的一個特殊區域,它的技術名稱為“工作列佈告區”,一些(如金山詞霸Ⅲ)執行時會在托盤上放置一個圖示,使一眼就能知道這個正在後臺執行,要想啟用它也很容易,通常只需單擊一下這個圖示即可,非常方便。
Tray的比較特殊,但並不難,主要包括圖示、工具提示和訊息等三個方面,它是程式設計的一部分。Shell提供了Shell—NotifyIcon,用它可以增加、刪除或者修改托盤中的圖示,在托盤上放置圖示後,Windows Shell會負責把發生在圖示上的滑鼠事件通知應用程式。Shell—NotifyIcon函式定義如下:
WINSHELLAPI BOOL WINAPI Shell—NotifyIcon(D dwMessage,PNOTIFYICONDATA pnid);
dwMessage表示要完成的操作:NIM—ADD(增加圖示)、NIM—DELETE(刪除圖示)、NIM—MODIFY(修改圖示或提示文字),pnid是一個指向NOTIFYICONDATA結構的指標,結構的定義如下:
typedef struct —NOTIFYICONDATA{
DWORD cbSize;//結構所佔的位元組數,必須用結構的大小來初始化。
HWND hWnd;//接受Tray圖示訊息的視窗控制程式碼
UINT uID;//由應用程式定義的圖示ID
UINT uFlags;//用來鑑別那些需要改變其值的域,
//NIF_ICON表示hIcon有效,可用來修改圖示,
//NIF_MESSAGE表示uCallbackMessage有效,用來定義訊息,
//NIF—TIP表示szTip引數有效,可修改工具提示。
UINT uCallbackMessage;//應用程式定義的訊息
HICON hIcon;//Tray圖示的控制程式碼
char szTip[64];//工具提示的文字
} NOTIFYICONDATA;
下面我們就透過一個具體例子來說明實現方法,程式執行時不會顯示主窗體,只在托盤上增加一個圖示,雙擊圖示可關閉程式。
新建一個工程,放置一個Timer到窗體上。開啟unit1.h,增加標頭檔案說明#include
unsigned int iconmessage;//定義的訊息
void AddTrayIcon();//在托盤上增加圖示
void RemoveTrayIcon();//從托盤中刪除圖示
由於要增加對自定義訊息的處理,所以必須過載視窗過程函式WndProc,在TForm1的定義中增加protected段:virtual void ——fastcall WndProc(Messages::Tmessage& Message);
在unit1.cpp中定義相應的成員函式:
void TForm1::AddTrayIcon()
{
NOTIFYICONDATA icondata;
memset(&icondata,0,sizeof(icondata));
//將結構icondata的各域初始化為0
icondata.cbSize=sizeof(icondata);
icondata.hWnd=Handle;
strncpy(icondata.szTip,″未知狀態″,sizeof(icondata.szTip));
icondata.hIcon=Application->Icon->Handle;
icondata.uCallbackMessage=iconmessage;
icondata.uFlags=NIF—MESSAGE|NIF—ICON|NIF—TIP;
Shell—NotifyIcon(NIM—ADD,&icondata);
}
void TForm1::RemoveTrayIcon()
{
NOTIFYICONDATA icondata;
memset(&icondata,0,sizeof(icondata));
icondata.cbSize=sizeof(icondata);
icondata.hWnd=Handle;
Shell—NotifyIcon(NIM—DELETE,&icondata);
}
過載TForm1的WndProc函式,加入對自定義訊息的處理程式碼,這其實相當於建立了TForm類的子類。
void __fastcall TForm1::WndProc(Messages::TMessage& Message)
{
if(Message.Msg==iconmessage)
{
if(Message.LParam==WM—LBUTTONLCLK)
{
Application->Tenate();
//如果雙擊圖示,則關閉應用程式
}
return;
}
TForm::WndProc(Message);//對於其他的訊息,基礎類的WndProc函式讓Windows進行預設處理。
}
建立窗體的OnCreate事件控制程式碼:
void __fastcall TForm1::FormCreate(T *Sender)
{
iconmessage=RegisterWindowMessage(″IconNotify″);
AddTrayIcon();
}
這裡透過呼叫RegisterWindowMessage函式來定義一個使用者訊息,也可以透過WM_USER+n來獲得一個沒有使用的訊息編號。
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
RemoveTrayIcon();
//窗體在關閉時刪除托盤中的圖示
}
編寫Timer1的Timer事件程式碼,當使用者將滑鼠停留在圖示上時,顯示提示文字:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
NOTIFYICONDATA icondata;
memset (&icondata, 0, sizeof (icondata));
icondata.cbSize = sizeof (icondata);
icondata.hWnd = Handle;
String s=″我的圖示!″;//定義提示文字
strncpy (icondata.szTip, s.c_str(), sizeof (icondata.szTip));
icondata.uFlags = NIF—T;
Shell—NotifyIcon (NIM—MODIFY,&icondata);
}
程式執行時不顯示主窗體,只在托盤上放置相應的程式圖示,從C++ Builder主選單中選擇View|Project ,在WinMain函式的Application→Initialize()語句後增加程式碼:
ShowWindow(Application→Handle,SW—H);
Application→ShowMainForm=false;
按F9編譯並執行程式,托盤上就會出現相應的圖示。以上程式碼在C++ Builder3、P環境下編譯、執行透過。
-=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-/
__________/LB___ OUTINN
/ _[]_ /____
/_________/| () |__ /">
| ____ /-| __ |-| Welcome to visit OUTINN!
|__|==|___| || |__|
-=--=--=- |_||_| =- Fancy, to:outinn@china.com">outinn@china.com
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990013/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用 C++Builder 編寫傳送電子郵件軟體 (轉)C++UI
- 用Delphi編寫DelTree程式 (轉)
- 用VC++編寫CGI程式 (轉)C++
- 用VB編寫抽獎程式 (轉)
- C++Builder 高手進階 (一)編寫彈出廣告殺手 (轉)C++UI
- 用C++Builder在WINNT下編制一個Service (轉)C++UI
- 用Delphi編寫安裝程式(1) (轉)
- 用VB編寫標準CGI程式 (轉)
- C++Builder的編譯超頻 (轉)C++UI編譯
- 用VC++6.0編寫撥號程式 (轉)C++
- 為Linux 應用程式編寫 DLL(轉)Linux
- 用 Delphi 編寫 VxD 裝置驅動程式(轉) (轉)
- C++Builder下實現埠讀寫 (轉)C++UI
- 編寫Linux實用程式的藝術(轉)Linux
- 用BCB編寫身份證號識別程式 (轉)
- 用Delphi編寫塗鴉桌面的小程式 (轉)
- 用Java編寫ASP元件 (轉)Java元件
- 用Excel編寫小遊戲 (轉)Excel遊戲
- 用C#Builder編寫螢幕保護程式 (轉)UI
- C++Builder常用程式碼片斷 (轉)C++UI
- 用匯編編寫DOS下的記憶體駐留程式(5) (轉)記憶體
- 用匯編編寫DOS下的記憶體駐留程式(3) (轉)記憶體
- 用匯編編寫DOS下的記憶體駐留程式(4) (轉)記憶體
- 用C語言編寫Linux實用程式的藝術(轉)C語言Linux
- 用Delphi編寫點對點傳檔案程式(1) (轉)
- 用Delphi編寫點對點傳檔案程式(2) (轉)
- 用VC6編寫登錄檔管理程式(三) (轉)
- 用VC6編寫登錄檔管理程式(二) (轉)
- 用Visual C++編寫電子郵件程式 (轉)C++
- C++Builder的幾則小應用 (轉)UI
- 用C++Builder建立數字簽名 (轉)C++UI
- 編寫高效的MySQL應用(轉)MySql
- 用PHP編寫Android應用程式PHPAndroid
- 編寫易讀的程式碼 (轉)
- 動畫程式編寫——DirectDraw之旅(3)(轉)動畫
- VC在windows下編寫用於序列通訊的程式 (轉)Windows
- 用VB編寫非同步多執行緒下載程式 (轉)非同步執行緒
- 編寫適用於模擬器的 Linux 程式碼(轉)Linux