【发布时间】:2012-05-21 01:22:09
【问题描述】:
我正在 Delphi XE2 中构建一个自定义控件(继承自 TCustomControl)(并且在我的其他控件中遇到过这个问题),在设计时,我无法单击它们。我知道它与鼠标捕获有关,捕获鼠标事件并在设计时以不同于运行时的方式处理它们,但我不知道如何正确适应这一点。换句话说,在我能想到的许多变通方法中,我无法确定哪一个是正确(或最有效)的方法。
我确信这必须有一些非常简单的标准,很可能使用ControlStyle 或CreateParams 但不知道是什么。
在这个特定的控件中(我没有看到这个问题的模式),我正在捕获包括WM_NCHITTEST 和WM_LBUTTONDOWN 在内的消息。在设计时,控件就像在运行时一样 100% 处于活动状态,当单击时,它改为执行运行时代码。
我感觉它在我的命中测试消息处理程序中,所以这里的代码(一些东西重命名):
procedure TMyCustomControl.WMNCHitTest(var Message: TWMNCHitTest);
var
P: TPoint;
Poly: TPoints;
X: Integer;
I: TMyCollectionItem;
Ch: Bool; //Need to improve invalidation
begin
Ch:= False;
P:= ScreenToClient(Point(Message.Pos.X, Message.Pos.Y));
for X := 0 to Items.Count - 1 do begin
I:= Items[X];
Poly:= I.Points;
FMouseIndex:= -1;
FMouseState:= bmNone;
if PointInPolygon(P, Poly) then begin //checks if point is within polygon
FMouseIndex:= X;
FMouseState:= bmHover;
Ch:= True;
Break;
end;
end;
if Ch then Invalidate;
end;
还有我的控件的构造函数(剥离):
constructor TMyCustomControl.Create(AOwner: TComponent);
begin
inherited;
ControlStyle:= ControlStyle - [csDesignInteractive];
end;
【问题讨论】:
-
更具体地说,这个控件是一个水平(或垂直)的项目列表,实际上是箭头。每个项目一个接一个地被绘制为一个多边形,每个项目周围的空间被认为是空的(背景)。将鼠标悬停在某个项目上时,我会突出显示该项目(并对该项目执行其他内部引用)。我还计划将重点放在单个列表项上。
标签: delphi custom-controls mouse delphi-xe2 design-time