求TTrayIcon控件 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://blog.csdn.net/Hunto/到俺的专栏上去找吧. 木招致,要TrayIcon: TTrayIcon这个。 谁说找不到的:http://www.2ccc.com/search.asp?KeyWord=trayicon&Submit=%BF%EC%CB%D9%CB%D1%CB%F7 简易托盘图标控件 - TTrayIcon自己做一个[转](重新编译就可以){------------------------------------------------------------------------------}{ 单元名称: TrayIcon.pas }{ }{ 单元作者: savetime ([email protected], http://savetime.delphibbs.com) }{ 创建日期: 2004-11-13 12:20:54 }{ }{ 功能介绍: }{ 封装 Shell_NotifyIcon 的大部分功能,并增加部分常见应用 }{ }{ 使用说明: }{ 如果设置了 OnDblClick 事件,则 OnClick 的响应时间会增加 GetDoubleClickTime. }{ 否则, OnClick 将会立即执行. }{ 如果没有设置 Icon, 将使用 Application 的图标. }{ }{ 更新历史: }{ 弹出右键菜单时,点击其他位置不能关闭该菜单.解决方法: }{ 在弹出菜单之前加上: SetForegroundWindow(FWindow); 即可. }{ }{ 尚存问题: }{ 暂时只支持 Win95 Shell 风格, Version 5.0 新功能以后加入 }{ DoubleClick 的间隔时间应可随系统设置更改而更新. }{ 点击 TrayIcon 时,应可设置是否将应用程序提至前台. }{ }{------------------------------------------------------------------------------}unit TrayIcon;interfaceuses SysUtils, Classes, Graphics, Controls, Windows, Messages, Forms, Menus, ExtCtrls, ShellAPI;type//==============================================================================// TTrayIcon class//============================================================================== TTrayIcon = class(TComponent) private FWindow: HWND; FHint: string; FIcon: TIcon; FActive: Boolean; FOnClick: TNotifyEvent; FOnDblClick: TNotifyEvent; FPopupMenu: TPopupMenu; FClickTimer: TTimer; FIconData: TNotifyIconData; procedure CheckClickTimer(Sender: TObject); procedure SendTrayMessage(MsgID: DWORD; Flags: UINT); procedure TrayWndProc(var Message: TMessage); procedure SetActive(const Value: Boolean); procedure SetIcon(const Value: TIcon); procedure SetHint(const Value: string); procedure SetPopupMenu(const Value: TPopupMenu); protected procedure Loaded; override; procedure Notification(AComponent: TComponent; Operation: TOperation); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Active: Boolean read FActive write SetActive default False; property Hint: string read FHint write SetHint; property Icon: TIcon read FIcon write SetIcon; property PopupMenu: TPopupMenu read FPopupMenu write SetPopupMenu; property OnClick: TNotifyEvent read FOnClick write FOnClick; property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick; end; procedure Register;implementationprocedure Register;begin RegisterComponents('Savetime', [TTrayIcon]);end;{ TTrayIcon }const WM_CALLBACKMESSAGE = WM_USER + 100; // 托盘图标回调消息常量procedure TTrayIcon.CheckClickTimer(Sender: TObject);begin FClickTimer.Enabled := False; if Assigned(FOnClick) then FOnClick(Self);end;constructor TTrayIcon.Create(AOwner: TComponent);begin inherited Create(AOwner); FWindow := Classes.AllocateHWnd(TrayWndProc); // 处理 TrayIcon 消息的窗口 FIcon := TIcon.Create; FClickTimer := TTimer.Create(Self); // 处理单击和双击间隔时间的定时器 FClickTimer.Enabled := False; FClickTimer.Interval := GetDoubleClickTime; // 控制面板中鼠标双击间隔时间 FClickTimer.OnTimer := CheckClickTimer; FIconData.cbSize := SizeOf(FIconData); // 初始化 NotifyIconData 结构 FIconData.Wnd := FWindow; FIconData.uID := UINT(Self); FIconData.uCallbackMessage := WM_CALLBACKMESSAGE;end;destructor TTrayIcon.Destroy;begin Active := False; FClickTimer.Free; FIcon.Free; Classes.DeallocateHWnd(FWindow); inherited;end;procedure TTrayIcon.Loaded;begin inherited; if FActive then SendTrayMessage(NIM_ADD, NIF_MESSAGE or NIF_ICON or NIF_TIP);end;procedure TTrayIcon.Notification(AComponent: TComponent; Operation: TOperation);begin inherited Notification(AComponent, Operation); if (Operation = opRemove) and (AComponent = PopupMenu) then PopupMenu := nil;end;procedure TTrayIcon.SendTrayMessage(MsgID: DWORD; Flags: UINT);begin if (Flags and NIF_ICON) <> 0 then begin if FIcon.Handle = 0 then // 如果未设置图标,则使用缺省图标 FIconData.hIcon := Application.Icon.Handle else FIconData.hIcon := FIcon.Handle; end; FIconData.uFlags := Flags; Shell_NotifyIcon(MsgID, @FIconData);end;procedure TTrayIcon.SetActive(const Value: Boolean);begin FActive := Value; if (not (csDesigning in ComponentState)) and (not (csLoading in ComponentState)) then begin if Value then SendTrayMessage(NIM_ADD, NIF_MESSAGE or NIF_ICON or NIF_TIP) else SendTrayMessage(NIM_DELETE, 0) end;end;procedure TTrayIcon.SetHint(const Value: string);begin FHint := Value; StrPLCopy(FIconData.szTip, PChar(FHint), SizeOf(FIconData.szTip)); if (not (csDesigning in ComponentState)) and (not (csLoading in ComponentState)) and FActive then begin SendTrayMessage(NIM_MODIFY, NIF_TIP); end;end;procedure TTrayIcon.SetIcon(const Value: TIcon);begin FIcon.Assign(Value); if (FActive and not (csDesigning in ComponentState)) then SendTrayMessage(NIM_MODIFY, NIF_ICON);end;procedure TTrayIcon.SetPopupMenu(const Value: TPopupMenu);begin FPopupMenu := Value; if Value <> nil then Value.FreeNotification(Self);end;procedure TTrayIcon.TrayWndProc(var Message: TMessage);var PT: TPoint;begin with Message do begin if Msg = WM_CALLBACKMESSAGE then begin case LParam of WM_LBUTTONDOWN: begin // 如果没设置 OnDblClick 事件,则直接调用 Onclick if not Assigned(FOnDblClick) then begin if Assigned(FOnClick) then FOnClick(Self); end else // 否则使用时间判断双击时间是否到达 FClickTimer.Enabled := True; end; WM_LBUTTONDBLCLK: begin FClickTimer.Enabled := False; if Assigned(FOnDblClick) then FOnDblClick(Self); end; WM_RBUTTONDOWN: begin if Assigned(FPopupMenu) then begin SetForegroundWindow(FWindow); // 这句一定要加,否则弹出菜单不会自动隐藏 GetCursorPos(PT); FPopupMenu.Popup(PT.X, PT.Y); end; end; end; end else // 其他消息交由 Windows 处理 Result := DefWindowProc(FWindow, Msg, WParam, LParam); end;end;end. fastreport报表要把报表中含(合计)的一行内容字体加粗怎么设置 dxBarManager上建立dxBarDateCombo 怎样共享ADOConnection DBGridEh点击标题标题如何实现? intraweb使用模块的问题 windows优化大师的BUG! Delphi 发送信息,并提醒对方,并且把信息保存到数据库。怎么样来实现。 怎样才能实现在Form上当鼠标按下后能够画出虚线框 高分等你拿!!11delphi中怎样做位移操作!? 想做个dbgrid 的 树状结构显示 没有思路 求大佬给点思路 介绍一个好的电子书网站 求救,请问如何取的打印机缓存里的数据
到俺的专栏上去找吧.
要TrayIcon: TTrayIcon这个。
{------------------------------------------------------------------------------}
{ 单元名称: TrayIcon.pas }
{ }
{ 单元作者: savetime ([email protected], http://savetime.delphibbs.com) }
{ 创建日期: 2004-11-13 12:20:54 }
{ }
{ 功能介绍: }
{ 封装 Shell_NotifyIcon 的大部分功能,并增加部分常见应用 }
{ }
{ 使用说明: }
{ 如果设置了 OnDblClick 事件,则 OnClick 的响应时间会增加 GetDoubleClickTime. }
{ 否则, OnClick 将会立即执行. }
{ 如果没有设置 Icon, 将使用 Application 的图标. }
{ }
{ 更新历史: }
{ 弹出右键菜单时,点击其他位置不能关闭该菜单.解决方法: }
{ 在弹出菜单之前加上: SetForegroundWindow(FWindow); 即可. }
{ }
{ 尚存问题: }
{ 暂时只支持 Win95 Shell 风格, Version 5.0 新功能以后加入 }
{ DoubleClick 的间隔时间应可随系统设置更改而更新. }
{ 点击 TrayIcon 时,应可设置是否将应用程序提至前台. }
{ }
{------------------------------------------------------------------------------}
unit TrayIcon;interfaceuses SysUtils, Classes, Graphics, Controls, Windows, Messages, Forms, Menus,
ExtCtrls, ShellAPI;type//==============================================================================
// TTrayIcon class
//============================================================================== TTrayIcon = class(TComponent)
private
FWindow: HWND;
FHint: string;
FIcon: TIcon;
FActive: Boolean;
FOnClick: TNotifyEvent;
FOnDblClick: TNotifyEvent;
FPopupMenu: TPopupMenu;
FClickTimer: TTimer;
FIconData: TNotifyIconData;
procedure CheckClickTimer(Sender: TObject);
procedure SendTrayMessage(MsgID: DWORD; Flags: UINT);
procedure TrayWndProc(var Message: TMessage);
procedure SetActive(const Value: Boolean);
procedure SetIcon(const Value: TIcon);
procedure SetHint(const Value: string);
procedure SetPopupMenu(const Value: TPopupMenu);
protected
procedure Loaded; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Active: Boolean read FActive write SetActive default False;
property Hint: string read FHint write SetHint;
property Icon: TIcon read FIcon write SetIcon;
property PopupMenu: TPopupMenu read FPopupMenu write SetPopupMenu;
property OnClick: TNotifyEvent read FOnClick write FOnClick;
property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick;
end; procedure Register;implementationprocedure Register;
begin
RegisterComponents('Savetime', [TTrayIcon]);
end;{ TTrayIcon }const
WM_CALLBACKMESSAGE = WM_USER + 100; // 托盘图标回调消息常量procedure TTrayIcon.CheckClickTimer(Sender: TObject);
begin
FClickTimer.Enabled := False;
if Assigned(FOnClick) then FOnClick(Self);
end;constructor TTrayIcon.Create(AOwner: TComponent);
begin
inherited Create(AOwner); FWindow := Classes.AllocateHWnd(TrayWndProc); // 处理 TrayIcon 消息的窗口 FIcon := TIcon.Create; FClickTimer := TTimer.Create(Self); // 处理单击和双击间隔时间的定时器
FClickTimer.Enabled := False;
FClickTimer.Interval := GetDoubleClickTime; // 控制面板中鼠标双击间隔时间
FClickTimer.OnTimer := CheckClickTimer; FIconData.cbSize := SizeOf(FIconData); // 初始化 NotifyIconData 结构
FIconData.Wnd := FWindow;
FIconData.uID := UINT(Self);
FIconData.uCallbackMessage := WM_CALLBACKMESSAGE;
end;destructor TTrayIcon.Destroy;
begin
Active := False; FClickTimer.Free;
FIcon.Free;
Classes.DeallocateHWnd(FWindow); inherited;
end;procedure TTrayIcon.Loaded;
begin
inherited;
if FActive then
SendTrayMessage(NIM_ADD, NIF_MESSAGE or NIF_ICON or NIF_TIP);
end;procedure TTrayIcon.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = PopupMenu) then
PopupMenu := nil;
end;procedure TTrayIcon.SendTrayMessage(MsgID: DWORD; Flags: UINT);
begin
if (Flags and NIF_ICON) <> 0 then
begin
if FIcon.Handle = 0 then // 如果未设置图标,则使用缺省图标
FIconData.hIcon := Application.Icon.Handle
else
FIconData.hIcon := FIcon.Handle;
end; FIconData.uFlags := Flags;
Shell_NotifyIcon(MsgID, @FIconData);
end;procedure TTrayIcon.SetActive(const Value: Boolean);
begin
FActive := Value; if (not (csDesigning in ComponentState)) and
(not (csLoading in ComponentState)) then
begin
if Value then
SendTrayMessage(NIM_ADD, NIF_MESSAGE or NIF_ICON or NIF_TIP)
else
SendTrayMessage(NIM_DELETE, 0)
end;
end;procedure TTrayIcon.SetHint(const Value: string);
begin
FHint := Value;
StrPLCopy(FIconData.szTip, PChar(FHint), SizeOf(FIconData.szTip)); if (not (csDesigning in ComponentState)) and
(not (csLoading in ComponentState)) and
FActive then
begin
SendTrayMessage(NIM_MODIFY, NIF_TIP);
end;
end;procedure TTrayIcon.SetIcon(const Value: TIcon);
begin
FIcon.Assign(Value); if (FActive and not (csDesigning in ComponentState)) then
SendTrayMessage(NIM_MODIFY, NIF_ICON);
end;procedure TTrayIcon.SetPopupMenu(const Value: TPopupMenu);
begin
FPopupMenu := Value;
if Value <> nil then Value.FreeNotification(Self);
end;procedure TTrayIcon.TrayWndProc(var Message: TMessage);
var
PT: TPoint;
begin
with Message do
begin
if Msg = WM_CALLBACKMESSAGE then
begin
case LParam of WM_LBUTTONDOWN:
begin
// 如果没设置 OnDblClick 事件,则直接调用 Onclick
if not Assigned(FOnDblClick) then
begin
if Assigned(FOnClick) then FOnClick(Self);
end
else // 否则使用时间判断双击时间是否到达
FClickTimer.Enabled := True;
end; WM_LBUTTONDBLCLK:
begin
FClickTimer.Enabled := False;
if Assigned(FOnDblClick) then FOnDblClick(Self);
end; WM_RBUTTONDOWN:
begin
if Assigned(FPopupMenu) then
begin
SetForegroundWindow(FWindow); // 这句一定要加,否则弹出菜单不会自动隐藏
GetCursorPos(PT);
FPopupMenu.Popup(PT.X, PT.Y);
end;
end;
end;
end
else // 其他消息交由 Windows 处理
Result := DefWindowProc(FWindow, Msg, WParam, LParam);
end;
end;end.