让Hint窗口支持一些本来不具备的事件(100分)

  • 主题发起人 主题发起人 loujing
  • 开始时间 开始时间
L

loujing

Unregistered / Unconfirmed
GUEST, unregistred user!
谁有空的,江湖救急。

我写了一个类:
TXXHintWindow = class(THintWindow)

我查了一下,THintWindow是从TComponent派生出来的,TComponent支持Click事件,我想让我的TXXHintWindow也支持Click操作,应该怎么做啊?(就是那个类里面应该怎么写)

我的最终目的,就是让Hint窗口支持一些本来不具备的事件。
 
不对,写错了,是从TControl派生出来的。
 
以下是我写的代码,我故意让HintWindow盖在Button上面,如果单击HintWindow,弹出的是Button1Click而没有hintclick,是不是HintWindow是透明的?


unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TXXHintWindow = class(THintWindow)
protected
procedure MyClick(Sender: TObject);
public
constructor Create(aOwner: TComponent); override;
end;

TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TXXHintWindow.MyClick(Sender: TObject);
begin
inherited;
ShowMessage('hintclick');
end;

constructor TXXHintWindow.Create(aOwner: TComponent);
begin
inherited;
Self.OnClick := MyClick;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
x: TXXHintWindow;
R: TRect;
AHint: string;
begin
ShowMessage('button1click');
AHint := 'asdfsfdsfsdf';
x := TXXHintWindow.Create(Self);
R := x.CalcHintRect(Screen.Width, AHint, nil);
OffsetRect(R, clienttoscreen(Point(Button1.Left, button1.Top)).x, clienttoscreen(Point(Button1.Left, button1.Top)).y);
x.ActivateHint(R, AHint);
end;

end.
 
DELPHI的消息传递机制是比较复杂的。它传递到控件的时候将WM-COMMAND消息变形了,具体是什么记不起来了。好像是CN-NOTIFYEVENT什么的。然后处理这个消息完成ONCLICK事件的
 
THintWindow类没有响应键盘和鼠标的事件。和你一起等,看应该怎么加入。
刚从我测试了你的代码,怎么都加不上。也不知道应该怎么加。
 
覆盖这个消息就可以了
这个消息默认是,将消息透明传递给它下面的窗口,改成 HTClient 应该就可以了

procedure THintWindow.WMNCHitTest(var Message: TWMNCHitTest);
begin
Message.Result := HTTRANSPARENT;
end;
 
lich的方法正确,谢谢了。
 
多人接受答案了。
 
后退
顶部