4

Label1BitBtn1およびのようなコンポーネントを持つDelphi XE2プロジェクトがありImage1ます。次のコードを記述して、キャプション バーなしでフォームのドラッグを実装しました。

  private
    { Private declarations }
    procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest;

procedure TMainForm.WMNCHitTest(var Msg: TWMNCHitTest) ;
begin
  inherited;
  if Msg.Result = htClient then Msg.Result := htCaption;
end;

私のフォームでは、Image1.OnMouseMoveおよびLabel1.OnClickイベントはプロジェクトに必須ですが、機能していません。Image1および領域以外のクライアント領域からフォームをドラッグするにはどうすればよいLabel1ですか? を使用できることは 1 つしかありませんが、フォームのおよびプロパティTPanelが破壊されます。GlassFrameSheetOfGlass

4

1 に答える 1

7

メッセージに含まれる位置情報を使用する必要がありWM_NCHITTESTます。それを使用して、その時点でコントロールが存在するかどうかを判断します。たとえば、ControlAtPosメソッドを使用できます。

procedure TMainForm.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  inherited;
  if ControlAtPos(ScreenToClient(Msg.Pos), True, True, True)=nil then
    if Msg.Result=htClient then
      Msg.Result := htCaption;
end;

これにより、コントロールが存在しないフォーム上のポイントをクリックした場合にのみドラッグが可能になります。別の基準を使用したい場合もありますが、使用することがMsg.Pos重要なアイデアです。

于 2012-06-27T11:17:58.470 に答える