city

数字城市

21 成员272 主题84 回复0 张照片

如何在DELPHI中使用系统状态栏图标

如
如风逝去
2000-08-05 14:19
如何在DELPHI中使用系统状态栏图标

作者:abyssal


SYSTRAY ICON就是在WINDOWS 95桌面系统下边状态栏右边的区域,通常这里有输入法和时间的小图标。程序中增加使用该功能时,须在USES中添加`SHELLAPI`。添加图标时需要的函数是: Shell_NotifyIconA,它需要2个参数,一个参数是`TNotifyIconDataA`的结构,该结构如下:
TNOTIFYICONDATAA = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..63] of AnsiChar;
end;

----cbSize是该结构的长度;Wnd是调用Shell_NotifyIconA函数的窗口的Handle;uID是用户自定义的一个数值,在uCallbackMessage参数指定的消息中使用;uCallbackMessage是一个参数,当添加的图标上出现鼠标事件时,系统向Wnd参数指定的窗口发送一个消息,该消息的Msg参数是uCallbackMessage,该消息的wParam参数是uID,该消息的lParam参数是鼠标事件的Msg值。这样应用程序可使用几个图标,但只用一个消息处理函数,通过wParam参数决定处理哪一个图标的消息。uFlags是该结构中哪些项目有效,若有NIF_MESSAGE则uCallbackMessage参数是有效的;若有NIF_ICON则hIcon参数是有效的;若有NIF_TIP则szTip参数有效。

----uCallbackMessage是发送到Wnd参数所指定的窗口的消息。hIcon是出现系统状态栏的图标的Handle。

----szTip是当鼠标停留在系统状态栏图标上时,出现的提示。

----该结构添好后,可调用Shell_NotifyIconA函数,格式为:

Shell_NotifyIconA(dwMessage:
DWORD;lpData:PNotifyIconDataA)
dwMessage取值为
NIM_ADD:增加一个新图标
NIM_MODIFY:修改一个已有的图标
NIM_DELETE:删除一个已有的图标


----下面给出一个演示程序,该程序有两个按钮、一个弹出式菜单和一个Image构件。一个按钮用于添加图标,一个按钮用于删除图标,Image构件内有一个图标(从Delphi自带的图标中装入),在图标上用鼠标右键单击时,会弹出一个菜单。程序中自定义一个消息处理函数处理系统状态栏图标消息。
--------------------------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils,
Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ShellApi, ExtCtrls, Menus;

const mymsg=wm_user+1;iid=100;
type
TForm1 = class(Tform)
Button1: Tbutton;
Button2: Tbutton;
Image1: Timage;
PopupMenu1: TPopupMenu;
a1: TMenuItem;
b1: TMenuItem;
c1: TMenuItem;
procedure Button1Click(Sender: Tobject);
procedure Button2Click(Sender: Tobject);
private
procedure mymessage(var message:
tmessage);message mymsg;
public
{ Public declarations }
end;
var
Form1: TForm1;ntid:tnotifyicondataa;

implementation

{$R *.DFM}

procedure TForm1.mymessage(var message:tmessage);
var mypt:tpoint;
begin
inherited;
if message.lparam=wm_rbuttonup then begin
getcursorpos(mypt);
popupmenu1.popup(mypt.x,mypt.y);end;
message.Result:=0;
end;

procedure TForm1.Button1Click(Sender: Tobject);
begin
ntid.cbSize:=sizeof(tnotifyicondataa);
ntid.Wnd:=handle;
ntid.uID:=iid;
ntid.uFlags:=nif_icon+nif_tip+nif_message;
ntid.uCallbackMessage:=mymsg;
ntid.hIcon:=image1.Picture.Icon.handle;
ntid.szTip:=`asdf`;
shell_notifyicona(NIM_ADD,@ntid);
end;

procedure TForm1.Button2Click(Sender: Tobject);
begin
ntid.cbSize:=sizeof(tnotifyicondataa);
ntid.Wnd:=handle;
ntid.uID:=iid;
ntid.uFlags:=nif_icon+nif_tip+nif_message;
ntid.uCallbackMessage:=mymsg;
ntid.hIcon:=image1.Picture.Icon.handle;
ntid.szTip:=`asdf`;
shell_notifyicona(NIM_DELETE,@ntid);
end;

end.
1 / 1

登录后回复。