用 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用PHP編寫Android應用程式PHPAndroid
- 編寫友好的命令列應用程式命令列
- 如何學習用Java編寫程式碼?Java
- Java程式編寫Java
- 請用js編寫一個紅綠燈程式JS
- 使用rust編寫dwm status-bar應用程式Rust
- 編寫執行緒安全的JSP應用程式執行緒JS
- 用vim編寫markdown
- 用Rust編寫的快如閃電的程式碼編輯器:lapceRust
- Python編寫守護程式程式Python
- Sublime 編寫編譯 swift程式碼編譯Swift
- 用Java編寫一個最簡單的桌面程式Java
- 使用Intellij Idea編寫Spark應用程式(Scala+SBT)IntelliJIdeaSpark
- 幽默:儘量用領域語言編寫程式碼
- Go 編寫 Web 應用GoWeb
- PHP 編寫守護程式PHP
- Python編寫shellcode注入程式Python
- 使用Visual Studio Code編寫和啟用ABAP程式碼 (上)
- 第3天 | 12天搞定Python,用PyCharm編寫程式碼PythonPyCharm
- Ace Editor 擴充套件編寫初步(轉)套件
- 用 Vue 編寫抽象元件Vue抽象元件
- 測試用例編寫方法
- 使用Python編寫猜拳小程式Python
- 編寫可擴充套件程式套件
- Hbuilder快速程式碼編寫技巧UI
- Model 編寫程式碼智慧提醒
- PHP 編寫基本的 Socket 程式PHP
- 02 | 編寫Model層程式碼
- 【IDL〕編寫程式啟動介面
- vue3程式碼編寫Vue
- 編寫第一個Qt程式QT
- 用 C 語言編寫多程式 Web 伺服器【粗暴版】Web伺服器
- 用python語言寫程式有什麼好用的編輯器?Python
- 在VS2019使用MASM編寫彙編程式ASM
- 用指標編寫程式將輸入的字串倒序輸出指標字串
- 用掘金-Markdown 編輯器寫文章
- 用JavaScript中lodash編寫雙色球JavaScript
- 用Python編寫自己的微型RedisPythonRedis
- 為什麼 SQLite 用 C 編寫?SQLite