亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

簡易托盤圖標控件-TTrayIcon

2019-09-08 23:09:09
字體:
來源:轉載
供稿:網友
                                                                                                                                                       
                       

{------------------------------------------------------------------------------}
{ 單元名稱: TrayIcon.pas/t/t/t/t/t/t       }
{/t/t/t/t/t/t/t/t/t      }
{ 單元作者: savetime (savetime2k@hotmail.com, http://savetime.delphibbs.com)   }
{ 創建日期: 2004-11-13 12:20:54/t/t/t/t/t/t}
{/t/t/t/t/t/t/t/t/t      }
{ 功能介紹:/t/t/t/t/t/t/t/t    }
{   封裝 Shell_NotifyIcon 的大部分功能,并增加部分常見應用/t/t      }
{/t/t/t/t/t/t/t/t/t      }
{ 使用說明:/t/t/t/t/t/t/t/t    }
{   如果設置了 OnDblClick 事件,則 onClick 的響應時間會增加 GetDoubleClickTime. }
{   否則, onClick 將會立即執行./t/t/t/t/t/t}
{   如果沒有設置 Icon, 將使用 Application 的圖標./t/t/t      }
{/t/t/t/t/t/t/t/t/t      }
{ 更新歷史:/t/t/t/t/t/t/t/t    }
{   彈出右鍵菜單時,點擊其他位置不能關閉該菜單.解決方法:/t/t/t}
{     在彈出菜單之前加上: SetForegroundWindow(FWindow); 即可./t/t  }
{/t/t/t/t/t/t/t/t/t      }
{ 尚存問題:/t/t/t/t/t/t/t/t    }
{   暫時只支持 Win95 Shell 風格, Version 5.0 新功能以后加入/t/t    }
{   DoubleClick 的間隔時間應可隨系統設置更改而更新./t/t/t    }
{   點擊 TrayIcon 時,應可設置是否將應用程序提至前臺./t/t/t   }
{/t/t/t/t/t/t/t/t/t      }
{------------------------------------------------------------------------------}
unit TrayIcon;

interface

uses 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;

implementation

procedure 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);/t   // 處理單擊和雙擊間隔時間的定時器
 FClickTimer.Enabled := False;
 FClickTimer.Interval := GetDoubleClickTime;   // 控制面板中鼠標雙擊間隔時間
 FClickTimer.OnTimer := CheckClickTimer;

 FIconData.cbSize := SizeOf(FIconData);/t// 初始化 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/t/t      // 如果未設置圖標,則使用缺省圖標
     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

/tWM_LBUTTONDOWN:
/tbegin
/t  // 如果沒設置 OnDblClick 事件,則直接調用 onclick
/t  if not Assigned(FOnDblClick) then
/t  begin
/t    if Assigned(FonClick) then FonClick(Self);
/t  end
/t  else  // 否則使用時間判斷雙擊時間是否到達
/t    FClickTimer.Enabled := True;
/tend;

/tWM_LBUTTONDBLCLK:
/tbegin
/t  FClickTimer.Enabled := False;
/t  if Assigned(FOnDblClick) then FOnDblClick(Self);
/tend;

/tWM_RBUTTONDOWN:
/tbegin
/t  if Assigned(FPopupMenu) then
/t  begin
/t    SetForegroundWindow(FWindow); // 這句一定要加,否則彈出菜單不會自動隱藏
/t    GetCursorPos(PT);
/t    FPopupMenu.Popup(PT.X, PT.Y);
/t  end;
/tend;
     end;
   end
   else    // 其他消息交由 Windows 處理
     Result := DefWindowProc(FWindow, Msg, WParam, LParam);
 end;
end;

end.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产一区二区三区四区在线观看| 国产婷婷色综合av蜜臀av| 欧美国产精品日韩| 在线观看不卡av| 欧美成人中文字幕| 久久中文久久字幕| 日韩**中文字幕毛片| 黄色精品一区二区| 91免费的视频在线播放| 国产精品一区二区久久久| 91高潮在线观看| 狠狠色狠狠色综合日日小说| 亲爱的老师9免费观看全集电视剧| 成人国产精品免费视频| 国产精品入口夜色视频大尺度| 亚洲成人网在线| 国内精品久久久久久| 亚洲四色影视在线观看| 97在线看免费观看视频在线观看| 日本午夜在线亚洲.国产| 中文字幕亚洲综合久久筱田步美| 欧美午夜久久久| 欧美在线视频免费观看| 亚洲第一页在线| 国产精品国产三级国产aⅴ9色| 成人精品福利视频| 久久久久久久国产精品视频| 日韩av手机在线| 亚洲精品综合精品自拍| 91精品视频在线播放| 大胆欧美人体视频| 精品久久国产精品| 国产美女久久精品香蕉69| 久久精品亚洲精品| 精品国产91久久久| 欧美性视频精品| 国产精品盗摄久久久| 国内精品一区二区三区四区| 久久久人成影片一区二区三区观看| 亚洲伦理中文字幕| 亚洲视频专区在线| 国产成人高潮免费观看精品| 色综合久综合久久综合久鬼88| 精品久久久久久久久久| 欧美国产日本高清在线| 国产视频精品一区二区三区| 国产91精品久久久| 国产脚交av在线一区二区| 久久精品视频在线| 亚洲网站视频福利| 国产精欧美一区二区三区| 欧美日韩国产一区二区| 国产精品一区久久久| 成人免费视频网址| 欧美日韩国产一中文字不卡| 亚洲国产精品99| 中文字幕视频在线免费欧美日韩综合在线看| 色伦专区97中文字幕| 亚洲欧美色婷婷| 国产精品色午夜在线观看| 一个人看的www久久| 一区二区日韩精品| 欧洲亚洲女同hd| 欧美大片在线免费观看| 欧美国产日韩在线| 亚洲国产小视频| 亚洲欧美国产日韩中文字幕| 粉嫩老牛aⅴ一区二区三区| 亚洲另类欧美自拍| 精品久久久久久久中文字幕| 国产精品久久久久久亚洲调教| 亚洲精品福利免费在线观看| 日韩美女视频在线观看| 国产精品久久久久久影视| 欧美激情xxxx性bbbb| 日韩av网站在线| 欧美日韩在线观看视频| 51精品国产黑色丝袜高跟鞋| 国产在线观看不卡| 国产精品看片资源| 激情亚洲一区二区三区四区| 亚洲国产精品专区久久| 国产精品电影一区| 中文字幕在线日韩| 性欧美亚洲xxxx乳在线观看| 亚洲精品福利在线| 亚洲欧洲日韩国产| 日韩欧美在线视频日韩欧美在线视频| 一区二区三区视频免费| 俺也去精品视频在线观看| 亚洲黄色www| 91国产在线精品| 欧美黑人xxx| 国产精品劲爆视频| 日本aⅴ大伊香蕉精品视频| 亚洲欧美综合v| 久久久天堂国产精品女人| 国产精品免费视频xxxx| 国产精品久久久久久久久久尿| 久久黄色av网站| 日韩综合中文字幕| 中文字幕日韩精品在线| 色天天综合狠狠色| 日韩精品在线电影| 国产精品444| 国产精品国产三级国产aⅴ浪潮| 国产精品视频在线观看| 欧美福利视频网站| 成人午夜两性视频| 97色在线播放视频| 欧美人在线观看| 午夜精品一区二区三区在线播放| 午夜精品视频网站| 欧美风情在线观看| 国产日韩欧美影视| 精品国内自产拍在线观看| 中文字幕日本精品| 亚洲aa在线观看| 亚洲国产高清自拍| 国产狼人综合免费视频| 亚洲欧美成人精品| 亚洲国产日韩精品在线| 欧美激情va永久在线播放| 中文字幕久热精品视频在线| 亚洲理论电影网| 中文字幕久热精品在线视频| 精品日韩美女的视频高清| 91免费在线视频| 中文字幕不卡在线视频极品| 久久国产精品久久久| 欧美国产日本在线| 国产裸体写真av一区二区| 欧美日本中文字幕| 欧美日韩亚洲系列| 一区二区日韩精品| 欧美性受xxxx黑人猛交| 国产日韩综合一区二区性色av| 亚洲综合精品伊人久久| 一本大道久久加勒比香蕉| 亚洲国产私拍精品国模在线观看| 国产一区深夜福利| 久久久国产精品亚洲一区| 欧美激情视频免费观看| 欧美性xxxx| 日韩欧美在线观看视频| 国产在线观看精品一区二区三区| www.欧美视频| 亚洲成人黄色网| 成人激情视频网| 国产精品99一区| 91香蕉电影院| 亚洲成色999久久网站| 日韩女在线观看| 亚洲毛茸茸少妇高潮呻吟| 最新91在线视频| 久久在精品线影院精品国产| 国产精品中文字幕久久久| 国产精品成人国产乱一区| 97色在线视频观看| 亚洲国产精品悠悠久久琪琪| 91精品国产成人www| 成人免费看片视频| 91啪国产在线| 68精品国产免费久久久久久婷婷|