|
|
#2
makebest2008-04-01 15:39
正好以前研究过这个问题, 并且做了一个单独的类, 算你运气好!
用法如下:
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. |
我向大家请教一下在编程时如何在系统托盘图标上显示气泡提示。望大家赐教~~