请问如何将窗体最小化到系统托盘?
解决方案 »
- 有关TDBGridEh的一个单元格内容复制的问题?还有TDBGridEh的内容过滤问题?
- 一个困扰我很久的问题,高分求解!!!!!!
- 谁帮我Overrdie 一下 TSpeedButton的方法?我不喜欢bsup状态.
- 在Web中如何实现文件的上传?
- 在线等待..100分.
- 请教一下,DBGRIDEH中如何使各列的数据居中显示 加分
- 用什么函数调用其他可执行程序?能举例说明吗?
- delphi即时通信设计,能谈谈吗?
- ******** 20 分********** 关于在STRINGGRID上实现用户添加数据的功能。
- 主意:截取WM_GetText消息
- delphi中的dbchart能够实现下面这个图的功能吗
- 阶乘 编译正确 输入数据显示floating point division by zero
ShellAPI;const
WM_HIDEAPP=WM_USER+21;procedure TForm1.Button1Click(Sender: TObject);
var
lpData:PNotifyIconData;
begin
lpData:=New(PNotifyIconDataA);
lpData.cbSize:=SizeOf(PNotifyIconDataA);
lpData.Wnd:=Application.Handle;
lpData.hIcon:=Application.Icon.Handle;
lpData.uCallbackMessage:=WM_HIDEAPP;
lpData.uID:=0;
lpData.szTip:='提示信息';
lpData.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,lpData);
dispose(lpData);
self.Hide;
ShowWindow(Application.Handle,SW_HIDE);
end;
//------------------------------------------------------------------------------
//
// Summary
//
// Author: Chris Mao
//
// History
// \Version \Date \Revision
// ========= =========== =============================================
// 1.0.0.0 2005-11-13 New Version
//
//------------------------------------------------------------------------------unit TrayIconUnit;interfaceuses Windows, SysUtils, Classes, Messages, Menus, Graphics, ExtCtrls, Forms,
ShellAPI;type
ENotifyIconError = class(Exception); TTrayNofifyIcon = class(TComponent)
private
FDefaultIcon: THandle;
FHideTask: Boolean;
FIconVisible: Boolean;
FHint: String;
FIcon: TIcon;
FOnDblClick: TNotifyEvent;
FOnClick: TNotifyEvent;
FPopuMenu: TPopupMenu;
FNoShowClick: Boolean;
FTimer: TTimer;
Tnd: TNotifyIconData;
procedure SetHideTask(const Value: Boolean);
procedure SetHint(const Value: String);
procedure SetIcon(const Value: TIcon);
procedure SetIconVisible(const Value: Boolean);
procedure SetPopuMenu(const Value: TPopupMenu);
procedure SendTrayMessage(Msg: DWORD; Flags: UINT);
function ActiveIconHandle: THandle;
procedure OnButtonTimmer(Sender: TObject);
protected
procedure Loaded; override;
procedure LoadDefaultIcon; virtual;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwer: TComponent); override;
destructor Destroy; override;
published
property Icon: TIcon read FIcon write SetIcon;
property HideTask: Boolean read FHideTask write SetHideTask default False;
property Hint: String read FHint write SetHint;
property IconVisible: Boolean read FIconVisible write SetIconVisible default False;
property PopuMenu: TPopupMenu read FPopuMenu write SetPopuMenu;
property OnClick: TNotifyEvent read FOnClick write FOnClick;
property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick;
end;implementationtype
TIconManager = class
private
FHWindow: HWnd;
procedure TrayWndProc(var Msg: TMessage);
public
constructor Create;
destructor Destroy; override;
property HWindow: HWnd read FHWindow write FHWindow;
end;var
IconMgr: TIconManager;
DDGM_TRAYICON: Integer;{ TIconManager }constructor TIconManager.Create;
begin
FHWindow := AllocateHWnd(TrayWndProc);
end;destructor TIconManager.Destroy;
begin
if FHWindow <> 0 then DeallocateHWnd(FHWindow);
inherited Destroy;
end;procedure TIconManager.TrayWndProc(var Msg: TMessage);
var
Pt: TPoint;
TheIcon: TTrayNofifyIcon;
begin
if Msg.Msg = DDGM_TRAYICON then begin//it's tray callback message
TheIcon := TTrayNofifyIcon(Msg.WParam);
case Msg.LParam of
WM_LBUTTONDOWN: TheIcon.FTimer.Enabled := True;
WM_LBUTTONDBLCLK:
begin
TheIcon.FNoShowClick := True;
if Assigned(TheIcon.FOnDblClick) then TheIcon.FOnDblClick(Self); //TheIcon
end;
WM_RBUTTONDOWN:
begin
if Assigned(TheIcon.FPopuMenu) then begin
SetForegroundWindow(IconMgr.HWindow);
GetCursorPos(Pt);
TheIcon.FPopuMenu.Popup(Pt.X, Pt.Y);
PostMessage(IconMgr.HWindow, WM_USER, 0, 0);
end;
end;
end;
end
else
Msg.Result := DefWindowProc(FHWindow, Msg.Msg, Msg.WParam, Msg.LParam);
end;{ TTrayNofifyIcon }function TTrayNofifyIcon.ActiveIconHandle: THandle;
begin
if (FIcon.Handle <> 0)
then Result := FIcon.Handle
else Result := FDefaultIcon;
end;constructor TTrayNofifyIcon.Create(AOwer: TComponent);
begin
inherited Create(AOwer);
FIcon := TIcon.Create;
FTimer := TTimer.Create(Self);
FTimer.Enabled := False;
FTimer.Interval := GetDoubleClickTime;
FTimer.OnTimer := OnButtonTimmer;
LoadDefaultIcon;
end;destructor TTrayNofifyIcon.Destroy;
begin
if FIconVisible then SetIconVisible(False);
FIcon.Free;
FTimer.Free;
inherited Destroy;
end;procedure TTrayNofifyIcon.LoadDefaultIcon;
begin
FDefaultIcon := LoadIcon(0, IDI_WINLOGO);
end;procedure TTrayNofifyIcon.Loaded;
begin
inherited;
if FIconVisible then
SendTrayMessage(NIM_ADD, NIF_MESSAGE or NIF_ICON or NIF_TIP);
end;procedure TTrayNofifyIcon.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = PopuMenu) then
PopuMenu := Nil;
end;procedure TTrayNofifyIcon.OnButtonTimmer(Sender: TObject);
begin
FTimer.Enabled := False;
if not FNoShowClick and Assigned(FOnClick) then
FOnClick(Self);
FNoShowClick := False;
end;procedure TTrayNofifyIcon.SendTrayMessage(Msg: DWORD; Flags: UINT);
begin
with Tnd do begin
cbSize := SizeOf(Tnd);
StrPLCopy(szTip, PChar(FHint), SizeOf(szTip));
uFlags := Flags;
uID := UINT(Self);
Wnd := IconMgr.HWindow;
uCallbackMessage := DDGM_TRAYICON;
hIcon := ActiveIconHandle;
end;
Shell_NotifyIcon(Msg, @Tnd);
end;procedure TTrayNofifyIcon.SetHideTask(const Value: Boolean);
const
ShowArray: array [Boolean] of Integer = (SW_ShowNormal, SW_Hide);
begin
if FHideTask <> Value then begin
FHideTask := Value;
if not(csDesigning in ComponentState) then
ShowWindow(Application.Handle, ShowArray[FHideTask]);
end;
end;procedure TTrayNofifyIcon.SetHint(const Value: String);
begin
if FHint <> Value then begin
FHint := Value;
if FIconVisible then
SendTrayMessage(NIM_MODIFY, NIF_TIP);
end;
end;procedure TTrayNofifyIcon.SetIcon(const Value: TIcon);
begin
FIcon.Assign(Value);
if FIconVisible then
SendTrayMessage(NIM_MODIFY, NIF_ICON);
end;procedure TTrayNofifyIcon.SetIconVisible(const Value: Boolean);
const
MsgArray: array [Boolean] of DWORD = (NIM_DELETE, NIM_ADD);
begin
if FIconVisible <> Value then begin
FIconVisible := Value;
SendTrayMessage(MsgArray[FIconVisible], NIF_MESSAGE or NIF_ICON or NIF_TIP);
end;
end;procedure TTrayNofifyIcon.SetPopuMenu(const Value: TPopupMenu);
begin
FPopuMenu := Value;
if Value <> Nil then Value.FreeNotification(Self);
end;const
TrayMsgStr = 'CADSonic.TrayNofifyIconMsg';initialization DDGM_TRAYICON := RegisterWindowMessage(TrayMsgStr);
IconMgr := TIconManager.Create;finalization
IconMgr.Free;end.