我正在Delphi中进行自定义控件(继承自TCustomControl
),它由多个多边形列表项(不规则形状)组成。我需要为每个项目实现鼠标事件,但首先我需要能够检测鼠标位置是否在给定的多边形内(array of TPoint
)。我正在捕捉Hit Test消息(WM_NCHITTEST
),这是我需要进行此验证的地方。我有多个多边形,我将在每个多边形项目中执行循环,并执行此检查以查看鼠标的X/Y位置是否在此多边形内。确定点是否在多边形内?
procedure TMyControl.WMNCHitTest(var Message: TWMNCHitTest);
var
P: TPoint; //X/Y of Mouse
Poly: TPoints; //array of TPoint
X: Integer; //iterator
I: TMyListItem; //my custom list item
begin
P.X:= Message.XPos;
P.Y:= Message.YPos;
for X := 0 to Items.Count - 1 do begin
I:= Items[X]; //acquire my custom list item by index
Poly:= I.Points; //acquire polygon points
//Check if Point (P) is within Polygon (Poly)...?
end;
end;
只需指出,我只是在分配'P.X'和'P.Y'后丢失了一行代码'P:= ScreenToClient(P);'。这将这些点从相对于屏幕转换为相对于控件。 –
当然它可以像'P:= ScreenToClient(Point(Message.XPos,Message.YPos));'(将3行代码合并成一个)那样简单 –