希望找一个好的范例程序,我记得下载过一本书叫“DELPHI实例入门”其中有这样的例子,只是他的源码都在书的配套光盘上,而光盘又没下载到,不知谁有?
12 个解决方案
#1
我有你有邮箱吗,发给你好了
#2
就在CSDN里搜索一下,例子很多的
#3
文档区就有
http://www.csdn.net/Develop/Read_Article.asp?Id=16375
http://www.csdn.net/Develop/Read_Article.asp?Id=16375
#4
www.playicq.com
#5
标题 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中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:
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 表示当前所设置的系统消息(即uCallBackMessage的值)是有效的
NIF_TIP 表示当前所设置的提示条(即szTip的值)是有效的。
4> uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。
6> hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。
7> szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。
在这里我花了大量的笔墨介绍TNotifyIconData的内幕,把这部分搞清楚了,后面的东西就顺理成章了。
三. 双击主窗体,进入FormCreate的代码区域:
TForm1.FormCreate(Sender:TObject);
Begin
//NotifyIcon为全局变量,在程序的开头已经定义了
with NotifyIcon do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //指向当前窗体Form1的句柄
uID:=1;
uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP;
uCallBackMessage:=WM_NID;
hIcon:=Application.Icon.Handle;
szTip:=”张家恶少”;
end;.
//把设置好的变量NotifyIcon加入到系统中以便处理
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
End;
四.接下来就是定义一个消息处理函数:系统给窗体发来了一个消息,就由下面这个函数来处理。每个消息处理函数都是处理某一类消息的,大家仔细地看看下面函数体的定义和一般的函数定义有什么不一样:消息处理函数要在后面加上消息的名称,这样当系统发来WM_NID消息时,就是自动触发WMNID消息处理函数。
procedure WMNID(var msg:TMessage);message WM_NID;
begin
case msg.LParam of
WM_LBUTTONUp; Form1.Visible:=not Form1.Visible;
WM_RBUTTONUP: ShowMessage(‘您点击的是右键’);
End;
End;
好了,一个最简单的程序诞生了,大家自己设置好自己喜欢的图标.
Project->Options,选中Application页面,在Icon项中加载自己喜欢的图标,这样程序运行时,在任务栏里显示的就是你喜欢的图标了。当你单击图标时,窗体Form1会在可见与不可见之间切换,也就是说单击一下显示,再单击一下又隐藏。当你右击图标的时候会弹出一条消息:“你点击的是右键”。
五.最后要记住在关闭应用程序的时候要释放掉建立的托盘程序,否则会占用系统资源。
TForm1.FormDestroy(Sender:TObject);
Begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
End;
毕业快半年了,很多东西在学校总理解不了,认识不够深刻;出到社会,接触了不少道中朋友,受益非浅,每有心得体会,总想写成文字,一来总结自己学的东西,二来和大家共同交流。
E_Mail: zhangyi1980912@sina.com QQ: 8133413 张家恶少
关键字 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中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:
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 表示当前所设置的系统消息(即uCallBackMessage的值)是有效的
NIF_TIP 表示当前所设置的提示条(即szTip的值)是有效的。
4> uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。
6> hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。
7> szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。
在这里我花了大量的笔墨介绍TNotifyIconData的内幕,把这部分搞清楚了,后面的东西就顺理成章了。
三. 双击主窗体,进入FormCreate的代码区域:
TForm1.FormCreate(Sender:TObject);
Begin
//NotifyIcon为全局变量,在程序的开头已经定义了
with NotifyIcon do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //指向当前窗体Form1的句柄
uID:=1;
uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP;
uCallBackMessage:=WM_NID;
hIcon:=Application.Icon.Handle;
szTip:=”张家恶少”;
end;.
//把设置好的变量NotifyIcon加入到系统中以便处理
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
End;
四.接下来就是定义一个消息处理函数:系统给窗体发来了一个消息,就由下面这个函数来处理。每个消息处理函数都是处理某一类消息的,大家仔细地看看下面函数体的定义和一般的函数定义有什么不一样:消息处理函数要在后面加上消息的名称,这样当系统发来WM_NID消息时,就是自动触发WMNID消息处理函数。
procedure WMNID(var msg:TMessage);message WM_NID;
begin
case msg.LParam of
WM_LBUTTONUp; Form1.Visible:=not Form1.Visible;
WM_RBUTTONUP: ShowMessage(‘您点击的是右键’);
End;
End;
好了,一个最简单的程序诞生了,大家自己设置好自己喜欢的图标.
Project->Options,选中Application页面,在Icon项中加载自己喜欢的图标,这样程序运行时,在任务栏里显示的就是你喜欢的图标了。当你单击图标时,窗体Form1会在可见与不可见之间切换,也就是说单击一下显示,再单击一下又隐藏。当你右击图标的时候会弹出一条消息:“你点击的是右键”。
五.最后要记住在关闭应用程序的时候要释放掉建立的托盘程序,否则会占用系统资源。
TForm1.FormDestroy(Sender:TObject);
Begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
End;
毕业快半年了,很多东西在学校总理解不了,认识不够深刻;出到社会,接触了不少道中朋友,受益非浅,每有心得体会,总想写成文字,一来总结自己学的东西,二来和大家共同交流。
E_Mail: zhangyi1980912@sina.com QQ: 8133413 张家恶少
#6
呵呵, 实在是太多了121``````
#7
用第三方控件吧:RxTrayIcon
#8
我可以给你写一个(托盘程序)!
=======================================
你要第三方控件做呢?还是要用原始的办法?
你高树我邮箱地址!
我明天给你发出去!
=======================================
你要第三方控件做呢?还是要用原始的办法?
你高树我邮箱地址!
我明天给你发出去!
#9
谢谢诸位,我的邮箱是a_son@163.com
#10
我自己写的一篇文章,正好合符你的需要:
1.新建一个工程,在Form1中添加一个Button按钮和一个PopupMenu快捷菜单,把Button1的Caption属性设置为“最小化”,然后双击PopupMenu1进入菜单编辑窗口,在此我们建立两个菜单项:“还原”和“退出”,设置它们的Name属性分别为Resize和Exit。
如果大家觉得使用Delphi本身默认的图标不能体现个性化的话,那么我们可以点击“Project”菜单下面的“Options”项,跳转到“Application”页面,点击“Load Icon”从外部引入一个新图标(*.ico)。
由于本程序使用到TNotifyIconData类型,所以必须在uses部分加入Shellapi单元。
2.程序的清单
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms,
shellapi,Menus, StdCtrls;
const
ICON_ID = 1;
ICONEVENT = WM_USER + 1;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Resize: TMenuItem;
Exit: TMenuItem;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ExitClick(Sender: TObject);
procedure ResizeClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure InstallIcon;
procedure UnInstallIcon;
procedure IconOnclick(var message: TMessage); message ICONEVENT;
public
{ Public declarations }
end;
var
Form1: TForm1;
IconData: TNotifyIconData;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
InstallIcon; //安装图标
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); //在任务栏中隐藏程序
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnInstallIcon; //卸载图标
end;
procedure TForm1.InstallIcon;
begin
IconData.cbSize:=SizeOf(IconData);
IconData.Wnd:=Handle;
IconData.uID:=ICON_ID;
IconData.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
IconData.uCallBackMessage:=ICONEVENT;
IconData.hIcon:=application.Icon.Handle;//获得程序图标
IconData.szTip:='任务栏图标'; //图标的提示信息
Shell_NotifyIcon(NIM_ADD, @IconData );
end;
procedure TForm1.UnInstallIcon;
begin
//卸载图标
Shell_NotifyIcon(NIM_DELETE, @IconData );
end;
//在图标上按下鼠标
procedure TForm1.IconOnclick(var message: TMessage);
var
p: TPoint;
begin
case message.LParam of
WM_RBUTTONDOWN: //点击鼠标右键时响应
begin
GetCursorPos(p);
//在鼠标点击处弹出快捷菜单
form1.PopupMenu1.Popup(p.x ,p.y);
end;
WM_LBUTTONDOWN: //点击鼠标左键时响应
begin
form1.WindowState:=wsNormal;//还原窗口大小
form1.Visible:=true;
end;
end;
end;
procedure TForm1.ExitClick(Sender: TObject);
begin
form1.Close;
end;
procedure TForm1.ResizeClick(Sender: TObject);
begin
form1.WindowState:=wsNormal; //还原窗口大小
form1.Visible:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.WindowState:=wsMinimized; //最小化窗口
form1.Visible:=false;
end;
end.
本程序在Win98+Delphi6中编译运行通过。
1.新建一个工程,在Form1中添加一个Button按钮和一个PopupMenu快捷菜单,把Button1的Caption属性设置为“最小化”,然后双击PopupMenu1进入菜单编辑窗口,在此我们建立两个菜单项:“还原”和“退出”,设置它们的Name属性分别为Resize和Exit。
如果大家觉得使用Delphi本身默认的图标不能体现个性化的话,那么我们可以点击“Project”菜单下面的“Options”项,跳转到“Application”页面,点击“Load Icon”从外部引入一个新图标(*.ico)。
由于本程序使用到TNotifyIconData类型,所以必须在uses部分加入Shellapi单元。
2.程序的清单
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms,
shellapi,Menus, StdCtrls;
const
ICON_ID = 1;
ICONEVENT = WM_USER + 1;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Resize: TMenuItem;
Exit: TMenuItem;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ExitClick(Sender: TObject);
procedure ResizeClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure InstallIcon;
procedure UnInstallIcon;
procedure IconOnclick(var message: TMessage); message ICONEVENT;
public
{ Public declarations }
end;
var
Form1: TForm1;
IconData: TNotifyIconData;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
InstallIcon; //安装图标
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); //在任务栏中隐藏程序
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnInstallIcon; //卸载图标
end;
procedure TForm1.InstallIcon;
begin
IconData.cbSize:=SizeOf(IconData);
IconData.Wnd:=Handle;
IconData.uID:=ICON_ID;
IconData.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
IconData.uCallBackMessage:=ICONEVENT;
IconData.hIcon:=application.Icon.Handle;//获得程序图标
IconData.szTip:='任务栏图标'; //图标的提示信息
Shell_NotifyIcon(NIM_ADD, @IconData );
end;
procedure TForm1.UnInstallIcon;
begin
//卸载图标
Shell_NotifyIcon(NIM_DELETE, @IconData );
end;
//在图标上按下鼠标
procedure TForm1.IconOnclick(var message: TMessage);
var
p: TPoint;
begin
case message.LParam of
WM_RBUTTONDOWN: //点击鼠标右键时响应
begin
GetCursorPos(p);
//在鼠标点击处弹出快捷菜单
form1.PopupMenu1.Popup(p.x ,p.y);
end;
WM_LBUTTONDOWN: //点击鼠标左键时响应
begin
form1.WindowState:=wsNormal;//还原窗口大小
form1.Visible:=true;
end;
end;
end;
procedure TForm1.ExitClick(Sender: TObject);
begin
form1.Close;
end;
procedure TForm1.ResizeClick(Sender: TObject);
begin
form1.WindowState:=wsNormal; //还原窗口大小
form1.Visible:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.WindowState:=wsMinimized; //最小化窗口
form1.Visible:=false;
end;
end.
本程序在Win98+Delphi6中编译运行通过。
#11
谢谢楼上的,可是窗口没有了,托盘上的图标没出来,还能指点一下吗?
#12
这么麻烦
用CoolTrayIcon组件就什么都搞定了
Google上可以找到的
用CoolTrayIcon组件就什么都搞定了
Google上可以找到的
#1
我有你有邮箱吗,发给你好了
#2
就在CSDN里搜索一下,例子很多的
#3
文档区就有
http://www.csdn.net/Develop/Read_Article.asp?Id=16375
http://www.csdn.net/Develop/Read_Article.asp?Id=16375
#4
www.playicq.com
#5
标题 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中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:
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 表示当前所设置的系统消息(即uCallBackMessage的值)是有效的
NIF_TIP 表示当前所设置的提示条(即szTip的值)是有效的。
4> uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。
6> hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。
7> szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。
在这里我花了大量的笔墨介绍TNotifyIconData的内幕,把这部分搞清楚了,后面的东西就顺理成章了。
三. 双击主窗体,进入FormCreate的代码区域:
TForm1.FormCreate(Sender:TObject);
Begin
//NotifyIcon为全局变量,在程序的开头已经定义了
with NotifyIcon do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //指向当前窗体Form1的句柄
uID:=1;
uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP;
uCallBackMessage:=WM_NID;
hIcon:=Application.Icon.Handle;
szTip:=”张家恶少”;
end;.
//把设置好的变量NotifyIcon加入到系统中以便处理
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
End;
四.接下来就是定义一个消息处理函数:系统给窗体发来了一个消息,就由下面这个函数来处理。每个消息处理函数都是处理某一类消息的,大家仔细地看看下面函数体的定义和一般的函数定义有什么不一样:消息处理函数要在后面加上消息的名称,这样当系统发来WM_NID消息时,就是自动触发WMNID消息处理函数。
procedure WMNID(var msg:TMessage);message WM_NID;
begin
case msg.LParam of
WM_LBUTTONUp; Form1.Visible:=not Form1.Visible;
WM_RBUTTONUP: ShowMessage(‘您点击的是右键’);
End;
End;
好了,一个最简单的程序诞生了,大家自己设置好自己喜欢的图标.
Project->Options,选中Application页面,在Icon项中加载自己喜欢的图标,这样程序运行时,在任务栏里显示的就是你喜欢的图标了。当你单击图标时,窗体Form1会在可见与不可见之间切换,也就是说单击一下显示,再单击一下又隐藏。当你右击图标的时候会弹出一条消息:“你点击的是右键”。
五.最后要记住在关闭应用程序的时候要释放掉建立的托盘程序,否则会占用系统资源。
TForm1.FormDestroy(Sender:TObject);
Begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
End;
毕业快半年了,很多东西在学校总理解不了,认识不够深刻;出到社会,接触了不少道中朋友,受益非浅,每有心得体会,总想写成文字,一来总结自己学的东西,二来和大家共同交流。
E_Mail: zhangyi1980912@sina.com QQ: 8133413 张家恶少
关键字 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中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:
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 表示当前所设置的系统消息(即uCallBackMessage的值)是有效的
NIF_TIP 表示当前所设置的提示条(即szTip的值)是有效的。
4> uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。
6> hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。
7> szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。
在这里我花了大量的笔墨介绍TNotifyIconData的内幕,把这部分搞清楚了,后面的东西就顺理成章了。
三. 双击主窗体,进入FormCreate的代码区域:
TForm1.FormCreate(Sender:TObject);
Begin
//NotifyIcon为全局变量,在程序的开头已经定义了
with NotifyIcon do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //指向当前窗体Form1的句柄
uID:=1;
uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP;
uCallBackMessage:=WM_NID;
hIcon:=Application.Icon.Handle;
szTip:=”张家恶少”;
end;.
//把设置好的变量NotifyIcon加入到系统中以便处理
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
End;
四.接下来就是定义一个消息处理函数:系统给窗体发来了一个消息,就由下面这个函数来处理。每个消息处理函数都是处理某一类消息的,大家仔细地看看下面函数体的定义和一般的函数定义有什么不一样:消息处理函数要在后面加上消息的名称,这样当系统发来WM_NID消息时,就是自动触发WMNID消息处理函数。
procedure WMNID(var msg:TMessage);message WM_NID;
begin
case msg.LParam of
WM_LBUTTONUp; Form1.Visible:=not Form1.Visible;
WM_RBUTTONUP: ShowMessage(‘您点击的是右键’);
End;
End;
好了,一个最简单的程序诞生了,大家自己设置好自己喜欢的图标.
Project->Options,选中Application页面,在Icon项中加载自己喜欢的图标,这样程序运行时,在任务栏里显示的就是你喜欢的图标了。当你单击图标时,窗体Form1会在可见与不可见之间切换,也就是说单击一下显示,再单击一下又隐藏。当你右击图标的时候会弹出一条消息:“你点击的是右键”。
五.最后要记住在关闭应用程序的时候要释放掉建立的托盘程序,否则会占用系统资源。
TForm1.FormDestroy(Sender:TObject);
Begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
End;
毕业快半年了,很多东西在学校总理解不了,认识不够深刻;出到社会,接触了不少道中朋友,受益非浅,每有心得体会,总想写成文字,一来总结自己学的东西,二来和大家共同交流。
E_Mail: zhangyi1980912@sina.com QQ: 8133413 张家恶少
#6
呵呵, 实在是太多了121``````
#7
用第三方控件吧:RxTrayIcon
#8
我可以给你写一个(托盘程序)!
=======================================
你要第三方控件做呢?还是要用原始的办法?
你高树我邮箱地址!
我明天给你发出去!
=======================================
你要第三方控件做呢?还是要用原始的办法?
你高树我邮箱地址!
我明天给你发出去!
#9
谢谢诸位,我的邮箱是a_son@163.com
#10
我自己写的一篇文章,正好合符你的需要:
1.新建一个工程,在Form1中添加一个Button按钮和一个PopupMenu快捷菜单,把Button1的Caption属性设置为“最小化”,然后双击PopupMenu1进入菜单编辑窗口,在此我们建立两个菜单项:“还原”和“退出”,设置它们的Name属性分别为Resize和Exit。
如果大家觉得使用Delphi本身默认的图标不能体现个性化的话,那么我们可以点击“Project”菜单下面的“Options”项,跳转到“Application”页面,点击“Load Icon”从外部引入一个新图标(*.ico)。
由于本程序使用到TNotifyIconData类型,所以必须在uses部分加入Shellapi单元。
2.程序的清单
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms,
shellapi,Menus, StdCtrls;
const
ICON_ID = 1;
ICONEVENT = WM_USER + 1;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Resize: TMenuItem;
Exit: TMenuItem;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ExitClick(Sender: TObject);
procedure ResizeClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure InstallIcon;
procedure UnInstallIcon;
procedure IconOnclick(var message: TMessage); message ICONEVENT;
public
{ Public declarations }
end;
var
Form1: TForm1;
IconData: TNotifyIconData;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
InstallIcon; //安装图标
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); //在任务栏中隐藏程序
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnInstallIcon; //卸载图标
end;
procedure TForm1.InstallIcon;
begin
IconData.cbSize:=SizeOf(IconData);
IconData.Wnd:=Handle;
IconData.uID:=ICON_ID;
IconData.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
IconData.uCallBackMessage:=ICONEVENT;
IconData.hIcon:=application.Icon.Handle;//获得程序图标
IconData.szTip:='任务栏图标'; //图标的提示信息
Shell_NotifyIcon(NIM_ADD, @IconData );
end;
procedure TForm1.UnInstallIcon;
begin
//卸载图标
Shell_NotifyIcon(NIM_DELETE, @IconData );
end;
//在图标上按下鼠标
procedure TForm1.IconOnclick(var message: TMessage);
var
p: TPoint;
begin
case message.LParam of
WM_RBUTTONDOWN: //点击鼠标右键时响应
begin
GetCursorPos(p);
//在鼠标点击处弹出快捷菜单
form1.PopupMenu1.Popup(p.x ,p.y);
end;
WM_LBUTTONDOWN: //点击鼠标左键时响应
begin
form1.WindowState:=wsNormal;//还原窗口大小
form1.Visible:=true;
end;
end;
end;
procedure TForm1.ExitClick(Sender: TObject);
begin
form1.Close;
end;
procedure TForm1.ResizeClick(Sender: TObject);
begin
form1.WindowState:=wsNormal; //还原窗口大小
form1.Visible:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.WindowState:=wsMinimized; //最小化窗口
form1.Visible:=false;
end;
end.
本程序在Win98+Delphi6中编译运行通过。
1.新建一个工程,在Form1中添加一个Button按钮和一个PopupMenu快捷菜单,把Button1的Caption属性设置为“最小化”,然后双击PopupMenu1进入菜单编辑窗口,在此我们建立两个菜单项:“还原”和“退出”,设置它们的Name属性分别为Resize和Exit。
如果大家觉得使用Delphi本身默认的图标不能体现个性化的话,那么我们可以点击“Project”菜单下面的“Options”项,跳转到“Application”页面,点击“Load Icon”从外部引入一个新图标(*.ico)。
由于本程序使用到TNotifyIconData类型,所以必须在uses部分加入Shellapi单元。
2.程序的清单
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms,
shellapi,Menus, StdCtrls;
const
ICON_ID = 1;
ICONEVENT = WM_USER + 1;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Resize: TMenuItem;
Exit: TMenuItem;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ExitClick(Sender: TObject);
procedure ResizeClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure InstallIcon;
procedure UnInstallIcon;
procedure IconOnclick(var message: TMessage); message ICONEVENT;
public
{ Public declarations }
end;
var
Form1: TForm1;
IconData: TNotifyIconData;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
InstallIcon; //安装图标
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); //在任务栏中隐藏程序
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnInstallIcon; //卸载图标
end;
procedure TForm1.InstallIcon;
begin
IconData.cbSize:=SizeOf(IconData);
IconData.Wnd:=Handle;
IconData.uID:=ICON_ID;
IconData.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
IconData.uCallBackMessage:=ICONEVENT;
IconData.hIcon:=application.Icon.Handle;//获得程序图标
IconData.szTip:='任务栏图标'; //图标的提示信息
Shell_NotifyIcon(NIM_ADD, @IconData );
end;
procedure TForm1.UnInstallIcon;
begin
//卸载图标
Shell_NotifyIcon(NIM_DELETE, @IconData );
end;
//在图标上按下鼠标
procedure TForm1.IconOnclick(var message: TMessage);
var
p: TPoint;
begin
case message.LParam of
WM_RBUTTONDOWN: //点击鼠标右键时响应
begin
GetCursorPos(p);
//在鼠标点击处弹出快捷菜单
form1.PopupMenu1.Popup(p.x ,p.y);
end;
WM_LBUTTONDOWN: //点击鼠标左键时响应
begin
form1.WindowState:=wsNormal;//还原窗口大小
form1.Visible:=true;
end;
end;
end;
procedure TForm1.ExitClick(Sender: TObject);
begin
form1.Close;
end;
procedure TForm1.ResizeClick(Sender: TObject);
begin
form1.WindowState:=wsNormal; //还原窗口大小
form1.Visible:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.WindowState:=wsMinimized; //最小化窗口
form1.Visible:=false;
end;
end.
本程序在Win98+Delphi6中编译运行通过。
#11
谢谢楼上的,可是窗口没有了,托盘上的图标没出来,还能指点一下吗?
#12
这么麻烦
用CoolTrayIcon组件就什么都搞定了
Google上可以找到的
用CoolTrayIcon组件就什么都搞定了
Google上可以找到的