我正在使用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;