bsNoneフォームを画面の外(上側)にはみ出させるには?

解決


MC  2005-12-13 06:19:59  No: 19222

Delphi 6 Personal
Windows XP
です.

SendMessage(self.Handle, WM_NCLBUTTONDOWN, HTCAPTION,0);
でbsNoneのフォームの移動をしていますが,

上側の画面外にドラッグしても,自動的に画面内まで戻ってきてしまいます.
戻さないようにする方法はありませんでしょうか?


Mr.XRAY  URL  2005-12-13 10:11:11  No: 19223

>SendMessage(self.Handle, WM_NCLBUTTONDOWN, HTCAPTION,0);

WM_NCLBUTTONDOWN はクライアント以外の場所で発生するメッセージです.
したがって,上の関数は,Formのキャプション以外をクリックしても,キャ
プションをクリックしたのと同じとなりますので,質問の動作となります.

これをさけるためには,実際にFormのどこでもクリックして移動できるよう
にする必要があります.例えば以下の様に.

  //定義場所は用途に応じてどこでも
  protected
    procedure WMLBUTTONDOWN(var message: TWMLBUTTONDOWN);message WM_LBUTTONDOWN;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TForm2 }

procedure TForm1.WMLBUTTONDOWN(var message: TWMLBUTTONDOWN);
begin
     SendMessage(Handle, WM_SYSCOMMAND, SC_MOVE or 2, 0);
end;


MC  2005-12-13 10:30:03  No: 19224

試してみましたが,やっぱり前と同様な動作をしました.

別な要因が邪魔をしているのでは,と思いまっさらなフォームで試してみましたが,同じでした.

うーん,どうしてなんでしょう.


deldel  2005-12-13 17:52:19  No: 19225

コード量は多いですが、これならできますよ。

  private
    { Private 宣言 }
    iX, iY: integer;
    boDown: Boolean;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then begin
    iX := X;
    iY := Y;
    boDown := True;
  end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if boDown then begin
    Left := Left + (X - iX);
    Top  := Top  + (Y - iY);
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    boDown := False;
end;


MC  2005-12-14 03:57:37  No: 19226

なるほど.

できました.ありがとうございました.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加