Delphi托盘编程实战演练
DavidLove(原作)
关键字
RAD
托盘编程 任务栏
消息机制
很多人认为Delphi是一个RAD工具,包括我本人在上学的时候对Delphi也有偏见,现在走出了“象牙塔”,涉及的面广了,遇到的问题多了,慢慢地也有了自己的一点心得体会。其实,Delphi是基于Object
Pascal
语言的开发工具,也就是说Delphi本质上是一种语言工具,并且是真正的面向对象的。下面我举的例子就是用Delphi实现的一个托盘小程序。程序短小精悍,脉络分明,我将对关键部分进行详细讲解。就象候俊杰先生把MFC一层一层地剥开一样,今天我也来一次“庖丁解牛”。
在Delphi中涉及到系统编程的方面毫无例外都要调用API函数,在ShellAPI.pas单元中有要用到的API函数的原型。
实战演练:
一.新建一个应用程序:File->New
Applicaton
在Interface部分定义一个消息常量:const WM_NID=WM_USER+1000;
系统规定从WM_USER开始为用户自定义消息。
二.定义一个全局变量:
NotifyIcon:TNotifyIconData,NotifyIcon是非常重要的一个变量,整个程序基本上是围着这个变量在转。TNotifyIconData是一个记录类型,按住Ctrl键,在TNotifyIconData
双击即进入ShellAPI.pas单元。(注:在Delphi中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,{zh0}的方法就是分析源代码!)此时出现了以下赋值语句:
TNotifyIconData =
TNotifyIconDataA,这个意思很明显,就是说TNotifyIconData和TNotifyIconDataA是同种数据类型,接着往下看有:
TNotifyIconDataA =
_NOTIFYICONDATAA,意思与刚才的一样,再往下看:
type
_NOTIFYICONDATAA =
record
cbSize:
DWORD;
Wnd: HWND;
uID: UINT;
uFlags:
UINT;
uCallbackMessage:
UINT;
hIcon:
HICON;
szTip: array
[0..63] of
AnsiChar;
end;
这可真是“千呼万唤始出来,犹抱琵琶半遮面”。现在大家很清楚了,我们刚才定义的全局变量NotifyIcon其实是一个包含有7个成分的记录类型变量,就相当于C/C++中的结构体变量(C/C++的程序员应该是再熟悉不过了)。下面我们逐个来解释记录类型中的7个部分各有什么功能。
1>
cbSize就是你定义的NotifyIcon变量的大小,用SizeOf(TNotifyIconData)可以取得,如果你是一个熟练的C/C++程序员,你应该不会陌生。在C/C++中,每当要为一个结构体变量分配内存的时候都要:通过
SizeOf(Struct type)
来获知存放一个这样的结构体变量要多少内存。
2>
Wnd是一个句柄,你希望托盘程序产生的消息有哪个窗体来处理就让Wnd指向那个窗体。
例如:你准备在任务栏的托盘小图标上单击时窗体是窗体在“显示”和“隐藏”之间切换,则把Wnd指向主窗体。
3>
uID:如果你要创建多个托盘小程序,那么怎么区分它们呢?就是靠这个ID号来区分。
3>
uFlags是一个标志位,它表示当前所创建的托盘程序具有哪些性质:
NIF_ICON
表示当前所设置的图标(即hIcon的值)是有效的
NIF_MESSAGE