很多人認(rèn)為Delphi是一個(gè)RAD工具,包括我本人在上學(xué)的時(shí)候?qū)elphi也有偏見(jiàn),現(xiàn)在走出了“象牙塔”,涉及的面廣了,遇到的問(wèn)題多了,慢慢地也有了自己的一點(diǎn)心得體會(huì)。其實(shí),Delphi是基于Object Pascal 語(yǔ)言的開(kāi)發(fā)工具,也就是說(shuō)Delphi本質(zhì)上是一種語(yǔ)言工具,并且是真正的面向?qū)ο蟮?。下面我舉的例子就是用Delphi實(shí)現(xiàn)的一個(gè)托盤(pán)小
程序。程序短小精悍,脈絡(luò)分明,我將對(duì)關(guān)鍵部分進(jìn)行詳細(xì)講解。就象候俊杰先生把MFC一層一層地剝開(kāi)一樣,今天我也來(lái)一次“庖丁解牛”。
在Delphi中涉及到系統(tǒng)編程的方面毫無(wú)例外都要調(diào)用API函數(shù),在ShellAPI.pas單元中有要用到的API函數(shù)的原型。
實(shí)戰(zhàn)演練:
一.新建一個(gè)應(yīng)用程序:File->New Applicaton 在Interface部分定義一個(gè)消息常量:const WM_NID=WM_USER+1000; 系統(tǒng)規(guī)定從WM_USER開(kāi)始為用戶自定義消息。
二.定義一個(gè)全局變量: NotifyIcon:TNotifyIconData,NotifyIcon是非常重要的一個(gè)變量,整個(gè)程序基本上是圍著這個(gè)變量在轉(zhuǎn)。TNotifyIconData是一個(gè)記錄類型,按住Ctrl鍵,在TNotifyIconData 雙擊即進(jìn)入ShellAPI.pas單元。(注:在Delphi中,這是一個(gè)非常好的對(duì)源代碼進(jìn)行分析的方法,源代碼說(shuō)明一切,你要想知道程序背后的內(nèi)幕,最好的方法就是分析源代碼?。┐藭r(shí)出現(xiàn)了以下賦值語(yǔ)句:
TNotifyIconData = TNotifyIconDataA,這個(gè)意思很明顯,就是說(shuō)TNotifyIconData和TNotifyIconDataA是同種數(shù)據(jù)類型,接著往下看有:
TNotifyIconDataA = _NOTIFYICONDATAA,意思與剛才的一樣,再往下看:
type
_NOTIFYICONDATAA = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..63] of AnsiChar;
end; |
這可真是“千呼萬(wàn)喚始出來(lái),猶抱琵琶半遮面”?,F(xiàn)在大家很清楚了,我們剛才定義的全局變量NotifyIcon其實(shí)是一個(gè)包含有7個(gè)成分的記錄類型變量,就相當(dāng)于C/C++中的結(jié)構(gòu)體變量(C/C++的程序員應(yīng)該是再熟悉不過(guò)了)。下面我們逐個(gè)來(lái)解釋記錄類型中的7個(gè)部分各有什么功能。
1> cbSize就是你定義的NotifyIcon變量的大小,用SizeOf(TNotifyIconData)可以取得,如果你是一個(gè)熟練的C/C++程序員,你應(yīng)該不會(huì)陌生。在C/C++中,每當(dāng)要為一個(gè)結(jié)構(gòu)體變量分配內(nèi)存的時(shí)候都要:通過(guò) SizeOf(Struct type) 來(lái)獲知存放一個(gè)這樣的結(jié)構(gòu)體變量要多少內(nèi)存。
2> Wnd是一個(gè)句柄,你希望托盤(pán)程序產(chǎn)生的消息有哪個(gè)窗體來(lái)處理就讓W(xué)nd指向那個(gè)窗體。
例如:你準(zhǔn)備在任務(wù)欄的托盤(pán)小圖標(biāo)上單擊時(shí)窗體是窗體在“顯示”和“隱藏”之間切換,則把Wnd指向主窗體。
3> uID:如果你要?jiǎng)?chuàng)建多個(gè)托盤(pán)小程序,那么怎么區(qū)分它們呢?就是靠這個(gè)ID號(hào)來(lái)區(qū)分。
4> uFlags是一個(gè)標(biāo)志位,它表示當(dāng)前所創(chuàng)建的托盤(pán)程序具有哪些性質(zhì):
NIF_ICON 表示當(dāng)前所設(shè)置的圖標(biāo)(即hIcon的值)是有效的
NIF_MESSAGE 表示當(dāng)前所設(shè)置的系統(tǒng)消息(即uCallBackMessage的值)是有效的
NIF_TIP 表示當(dāng)前所設(shè)置的提示條(即szTip的值)是有效的。
5> uCallBackMessage這是7個(gè)部分里面最重要的一個(gè)。這里指定一個(gè)回調(diào)消息,也就是說(shuō)這里定義一個(gè)消息名,當(dāng)你單擊或者右擊托盤(pán)圖標(biāo)的時(shí)候就會(huì)向你在Wnd所指向的窗體發(fā)送一個(gè)在uCallBackMessage中定義的消息名,然后你在程序中定義一個(gè)消息出來(lái)函數(shù)來(lái)處理這個(gè)消息。這樣就把Windows關(guān)于消息的整套流程都處理好了。
6> hIcon為托盤(pán)圖標(biāo)的句柄,根據(jù)這個(gè)句柄你就可以增加、修改、刪除圖標(biāo)。
7> szTip就是當(dāng)你的鼠標(biāo)放到任務(wù)欄托盤(pán)的小圖標(biāo)上的時(shí)候彈出來(lái)的提示信息。
在這里我花了大量的筆墨介紹TNotifyIconData的內(nèi)幕,把這部分搞清楚了,后面的東西就順理成章了。
三.雙擊主窗體,進(jìn)入FormCreate的代碼區(qū)域:
TForm1.FormCreate(Sender:TObject);
Begin
//NotifyIcon為全局變量,在程序的開(kāi)頭已經(jīng)定義了
with NotifyIcon do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //指向當(dāng)前窗體Form1的句柄
uID:=1;
uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP;
uCallBackMessage:=WM_NID;
hIcon:=Application.Icon.Handle;
szTip:=”張家惡少”;
end;.
//把設(shè)置好的變量NotifyIcon加入到系統(tǒng)中以便處理
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
End;
|
四.接下來(lái)就是定義一個(gè)消息處理函數(shù):系統(tǒng)給窗體發(fā)來(lái)了一個(gè)消息,就由下面這個(gè)函數(shù)來(lái)處理。每個(gè)消息處理函數(shù)都是處理某一類消息的,大家仔細(xì)地看看下面函數(shù)體的定義和一般的函數(shù)定義有什么不一樣:消息處理函數(shù)要在后面加上消息的名稱,這樣當(dāng)系統(tǒng)發(fā)來(lái)WM_NID消息時(shí),就是自動(dòng)觸發(fā)WMNID消息處理函數(shù)。
procedure WMNID(var msg:TMessage);message WM_NID;
begin
case msg.LParam of
WM_LBUTTONUp; Form1.Visible:=not Form1.Visible;
WM_RBUTTONUP: ShowMessage(‘您點(diǎn)擊的是右鍵’);
End;
End; |
好了,一個(gè)最簡(jiǎn)單的程序誕生了,大家自己設(shè)置好自己喜歡的圖標(biāo).
Project->Options,選中Application頁(yè)面,在Icon項(xiàng)中加載自己喜歡的圖標(biāo),這樣程序運(yùn)行時(shí),在任務(wù)欄里顯示的就是你喜歡的圖標(biāo)了。當(dāng)你單擊圖標(biāo)時(shí),窗體Form1會(huì)在可見(jiàn)與不可見(jiàn)之間切換,也就是說(shuō)單擊一下顯示,再單擊一下又隱藏。當(dāng)你右擊圖標(biāo)的時(shí)候會(huì)彈出一條消息:“你點(diǎn)擊的是右鍵”。
五.最后要記住在關(guān)閉應(yīng)用程序的時(shí)候要釋放掉建立的托盤(pán)程序,否則會(huì)占用系統(tǒng)資源。
TForm1.FormDestroy(Sender:TObject);
Begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
End; |
畢業(yè)快半年了,很多東西在學(xué)校總理解不了,認(rèn)識(shí)不夠深刻;出到社會(huì),接觸了不少道中朋友,受益非淺,每有心得體會(huì),總想寫(xiě)成文字,一來(lái)總結(jié)自己學(xué)的東西,二來(lái)和大家共同交流。