请教请教
我向大家请教一下在编程时如何在系统托盘图标上显示气泡提示。望大家赐教~~
正好以前研究过这个问题, 并且做了一个单独的类, 算你运气好!
用法如下:procedure TForm1.Button1Click(Sender: TObject);
begin
a := TcTrayIcon.Create(Handle, 0);
a.SetIcon(application.Icon.Handle);
a.SetText('tip','title','info');
a.ShowIcon;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(a) then
a.HideIcon;
end;
// 下面是引用的文件
unit Unit2;
interface
uses windows,shellapi,sysutils;
type NOTIFYICONDATAtc = record
cbSize: DWORD; // 结构本身大小
Wnd: HWND; // 回调消息发送到的窗口句柄
uID: UINT; // 图标识别号
uFlags: UINT; // 图标事件选择
uCallbackMessage: UINT; // 回调消息
hIcon: HICON; // 图标句柄
szTip: array [0..127] of AnsiChar; // 图标悬停消息
dwState : DWORD; // 托盘图标状态
dwStateMask : DWORD; // 状态掩码
szInfo : array [0..255] of AnsiChar; // As String * 256 气球提示文本
uTimeoutOrVersion : DWORD; // 气球提示消失时间或版本
// uTimeout - 气球提示消失时间(单位:ms, 10000 -- 30000)
// uVersion - 版本(0 for V4, 3 for V5)
szInfoTitle : array[0..63] of AnsiChar; // String * 64 ' 气球提示标题
dwInfoFlags : DWORD; // 气球提示图标
end;
type TcTrayIcon = class
Private
icon : NOTIFYICONDATAtc ;
trayiconshow : boolean;
iconok, txtok : boolean;
Public
Constructor Create(hwnd:Cardinal;msg:Cardinal);
Destructor Destroy; override;
procedure ShowIcon();
procedure UpdateIcon();
procedure HideIcon();
procedure SetIcon(iconhandle:LongWord);
procedure SetText(tip,title,info:String);
Published
property IsShow:Boolean read TrayIconShow;
end;
implementation
uses dialogs,variants;
Constructor TcTrayIcon.Create(hwnd:Cardinal;msg:Cardinal) ;
begin
trayiconshow := false;
iconok := false;
txtok := false;
with icon do
begin
cbSize:=SizeOf(icon); // 结构大小
Wnd:=hwnd; //发送图标消息到此窗口
uID:=1; //图标标记,多个图标以此区别
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP or $10; // 需要哪些信息
uCallBackMessage := msg ; //自定义消息,当图标有事件时,将发送此消息和相关事件Lparam
// hIcon:=Application.Icon.Handle; // 图标句柄
// szInfo:='点击这里隐藏';
// szInfoTitle:='点歌台';
dwInfoFlags:=1; // 气球图标 0 1 2 3
// uTimeoutOrVersion := makelparam( 10000,0); // 气球时间
end;
end;
Destructor TcTrayIcon.Destroy;
begin
if self.trayiconshow then
self.HideIcon ;
end;
// 显示系统栏图标
procedure TcTrayIcon.ShowIcon();
begin
if not iconok or not txtok then exit;
Shell_NotifyIcon(NIM_ADD, @icon );
trayiconshow:=true;
end;
// 修改系统栏图标
procedure TcTrayIcon.UpdateIcon();
begin
if self.trayiconshow then
begin
Shell_NotifyIcon(NIM_MODIFY,@icon);
end;
end;
// 清除系统栏图标
procedure TcTrayIcon.HideIcon();
begin
Shell_NotifyIcon(NIM_DELETE,@icon);
TrayIconShow:=false;
end;
procedure TcTrayIcon.SetIcon(iconhandle:LongWord);
begin
icon.hIcon:=IconHandle; // 图标句柄
iconok := true;
self.UpdateIcon ;
end;
procedure TcTrayIcon.SetText(tip,title,info:String);
begin
strPCOPY(icon.szTip,tip) ;
strPCOPY(icon.szInfoTitle, title);
strPCOPY(icon.szInfo,info);
txtok := true;
self.UpdateIcon ;
end;
end.