4

Delphi XE2 で (から継承されたTCustomControl) カスタム コントロールを構築しています (そして、私の他のコントロールでこの問題が発生しました)。設計時に、それらをクリックできません。マウス キャプチャと関係があることはわかっています。マウス イベントをキャッチし、設計時と実行時では異なる方法で処理しますが、これに適切に対応する方法がわかりません。言い換えれば、私が考えることができる多くの回避策のうち、どれが適切な (または最も効率的な) 方法であるかを判断することはできません。

これには非常に単純な標準があるに違いないと確信してControlStyleCreateParamsます。

この特定のコントロールでは (この問題ではパターンを確認していません)、 と を含むメッセージをキャプチャしてい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;
4

2 に答える 2

6

しかし、もちろんあなたは正しいです。WM_NCHITTESTハンドラーで何も返していません。Mmessage.Resultハンドラーが呼び出され、他に何も割り当てていない場合、あなたは '0' (HTNOWHERE) です。

inheritedある時点で呼び出すか、ロジックを実装HTCLIENTして、コントロールの内部と見なされるポイントに戻ります (Message.Result を設定します)。

実行時にすでに望ましい動作になっている場合は、設計時のチェックを含めることができます (ただし、理由により、すべての計算を行う必要があると思います)。

if csDesigning in ComponentState then
  Msg.Result := HTCLIENT;
于 2012-05-13T00:52:30.000 に答える
5

設計時にマウス操作をサポートする公式の方法は、メッセージに対してゼロ以外の結果で応答することCM_DESIGNHITTESTです。その後、コンポーネントは通常のマウス メッセージを受け取ります。

于 2012-05-13T01:59:12.337 に答える