我正在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行代碼合併成一個)那樣簡單 –