私はいくつかのポリゴンリスト項目(不規則な形)からなるDelphi(TCustomControl
から継承)でカスタムコントロールを作成しています。アイテムごとにマウスイベントを実装する必要がありますが、まず、マウスの位置が指定されたポリゴン(array of TPoint
)内にあるかどうかを検出できる必要があります。私はヒットテストメッセージ(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);というコードが1行欠けています。これは、これらの点を画面に関連するものからコントロールに対するものに変換します。 –
もちろん 'P:= ScreenToClient(Point(Message.XPos、Message.YPos));'(3行のコードを1つに変えて) –