Tôi đang tạo điều khiển tùy chỉnh trong Delphi (được kế thừa từ TCustomControl
) bao gồm một số mục danh sách đa giác (hình dạng không đều). Tôi cần phải thực hiện các sự kiện chuột cho mỗi mục, nhưng trước tiên tôi cần phải có khả năng phát hiện nếu vị trí chuột nằm trong một đa giác nhất định (array of TPoint
). Tôi đang bắt được thông báo Kiểm tra lượt truy cập (WM_NCHITTEST
) và đây là nơi tôi sẽ cần thực hiện xác thực này. Tôi có một số đa giác, tôi sẽ thực hiện một vòng lặp qua từng mục đa giác và thực hiện kiểm tra này để xem vị trí X/Y của chuột có nằm trong đa giác này hay không.Xác định xem một điểm có nằm trong đa giác không?
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;
Chỉ cần chỉ ra, tôi thiếu một dòng mã 'P: = ScreenToClient (P);' ngay sau khi gán 'P.X' và' P.Y'. Điều này chuyển đổi những điểm đó liên quan đến màn hình tương ứng với điều khiển. –
Tất nhiên nó có thể dễ dàng như 'P: = ScreenToClient (Point (Message.XPos, Message.YPos));' (biến 3 dòng mã thành một) –