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;