Delphi 6 Personal
Windows XP
です.
SendMessage(self.Handle, WM_NCLBUTTONDOWN, HTCAPTION,0);
でbsNoneのフォームの移動をしていますが,
上側の画面外にドラッグしても,自動的に画面内まで戻ってきてしまいます.
戻さないようにする方法はありませんでしょうか?
>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;
試してみましたが,やっぱり前と同様な動作をしました.
別な要因が邪魔をしているのでは,と思いまっさらなフォームで試してみましたが,同じでした.
うーん,どうしてなんでしょう.
コード量は多いですが、これならできますよ。
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;
なるほど.
できました.ありがとうございました.
ツイート | ![]() |