我正在尝试创建一个THintWindow并在其上放置一个TButton或TFrame。这是我的代码:
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
HintWindow: THintWindow;
public
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HintWindow := THintWindow.Create(Self);
HintWindow.Color := clInfoBk;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
P: TPoint;
R: TRect;
Control: TControl;
begin
Control := Button1;
P := Control.ClientToScreen(Point(0, Control.Height));
R := Rect(P.X, P.Y, P.x + 100, P.Y + 100);
with TButton.Create(HintWindow) do
begin
Parent := HintWindow;
Caption := 'My Button';
end;
HintWindow.ActivateHint(R, 'My Hint');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
HintWindow.ReleaseHandle;
end;
提示窗口已显示,但我看不到TButton。似乎在提示窗口内没有子窗口(我使用Spy++测试了“第一个子窗口”)。 我还尝试用新的CreateParams子类化THintWindow:
procedure TMyHintWindow.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or WS_CLIPCHILDREN;
Params.ExStyle := Params.ExStyle or WS_EX_CONTROLPARENT;
end;
当我将TFrame创建为提示窗口的子窗口时,Spy++显示提示窗口上有一个子窗口,但是我看不到它(即使我强制将其可见)。
请问对此有什么反馈吗?
ActivateHint
中设置ParentWindow。XE2代码总是将其设置为Application.Handle,所以我认为这只是最简单的方法。没有必要尝试将其设置为ActiveForm.Handle
。 - David Heffernan