|
三 托盘如果处理消息,上面说到,要设置托盘结构,一定要有一个窗口句柄,才能检索托盘消息,那么这个句柄是什么呢,非可视组件没有窗口句柄呀。
如果你有看过TTimer的源码,一定知道这一句代码:
FWindowHandle := AllocateHWnd(WndProc);
它创建一个看不见的窗口,返回他的句柄,并指定WndProc为窗口的消息处理过程
我们何不效仿它呢。
于是也定义一个成员句柄:
FHandle: HWnd;
把该句柄赋给NOTIFYICONDATA的hWnd字段
再定义一个消息处理过程:
procedure WndProc(var Msg: TMessage);
再在组件构造函数中:
FHandle := AllocateHWnd(WndProc);
如此之后,组件就可以截获托盘的消息了,并在WndProc过程中作相应处理。这里有必要对托盘的自定义消息做一个介绍:
我们自定义了这个消息WM_TrayMsg,它的lParam与托盘的uID相同,wParam是鼠标在图标上发生的事件消息,比如单击,双击等。
我们就要把这些消息转化为事件,供给用户处理,所以定义几个事件调度函数:
//以下为事件的调度函数
procedure DblClick; dynamic;
procedure Click; dynamic;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); dynamic;
意思很明显,不多说,
当然也有几个事件方法指针:
FOnIconClick: TNotifyEvent;
FOnIconDblClick: TNotifyEvent;
FOnIconMouseMove: TMouseMoveEvent;
FOnIconMouseDown: TMouseEvent;
FOnIconMouseUp: TMouseEvent;
然后在WndProc中判断消息,并调用相应的事件调度函数。看代码吧,有解释。
好了,三个技术解决了,第四个呢,还是等代码出来以后再加组件编辑器吧。以下是源代码:
unit MyTray;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, ShellApi, ExtCtrls,StdCtrls;
const
//自定义托盘消息
WM_TrayMsg=WM_USER+10;
type
//恢复窗口的方式,左双击,右双击,左单击,右双击
TRMode=(LDbClick,RDbClick,LCLick,RClick);
TMyTray=class(TComponent)
private
//私有成员
FIcon:TIcon; //图标
FDfIcon:THandle; //应用程序的默认图标
FSetDfIcon:Boolean; //是否用应用程序的图标,如果为True,则Ficon为nil
FIconData: TNotifyIconData; //托盘数据结构
isMin:Boolean;//标识是否窗口最小化了
FHandle: HWnd; //不可视建窗体句柄,用于处理托盘事件
FActive: Boolean; //是否启用托盘
FHint: string; //托盘提示字符串
FRMode:TRMode; //恢复窗口的方式
isClickIn:Boolean;//标识鼠标是否点在图标上
OldStyleEX:longInt; //保存老的窗口风格
//事件成员
FOnIconClick: TNotifyEvent;
FOnIconDblClick: TNotifyEvent;
FOnIconMouseMove: TMouseMoveEvent;
FOnIconMouseDown: TMouseEvent;
FOnIconMouseUp: TMouseEvent;
//设置方法
procedure SetIcon(value:TIcon);
procedure SetDfIcon(value:boolean);
procedure SetActive(value:boolean);
procedure SetHint(value:string);
procedure SetRMode(value:TRMode);
//私有方法
procedure SetTray(Way:DWORD); //设置托盘样式,修改,删除,增加
function GetActiveIcon:THandle; //取得有用的图标句柄
protected
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页 没有相关教程
|