Form1とForm2があって、Form2はForm1のすぐ下にくっついて表示されています。
(ここまでは問題ありません)
Form1をドラッグして動かすと、動かし終わった後にForm2がForm1のすぐ下に移動するようにしたいのですが、イベントを検出する方法がわかりません。
Formにはmoveっていうイベントはなさそうですし、タイトルバーのドラッグはマウスのupやdownイベントには引っかからないようです。
どうかよろしくお願いします。
自前で WM_MOVE メッセージを捕まえます。
type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private 宣言 }
public
procedure WMMove(var Msg:TWMMove);message WM_MOVE;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.WMMove(var Msg: TWMMove);
begin
Label1.Caption := Format('Left = %d Top := %d',[Left,Top]);
end;
早速の回答、有難うございます。
上記のサンプルソース、うまく動作しました。
しかし、これだと移動中、ずっとイベントが起きてしまいます。
タイトルバーをドラッグしていたマウスを離した時に、Form2を移動させようと思います。
重ねて質問なのですが、タイトルバーのマウスのメッセージはどのように捕まえるのでしょうか?
※jokさんのを真似て
procedure WMLBUTTONUP(var Msg:TWMLBUTTONUP);message WM_LBUTTONUP;
(中略)
procedure TForm1.WMLBUTTONDOWN(var Msg: TWMLBUTTONDOWN);
begin
Label2.Caption := 'DOWN';
end;
などとやってみましたが、こりゃFormのmausedownイベントと同じですね^^;
タイトルバーには反応しませんでした。
参考→https://www.petitmonte.com/bbs/answers?question_id=1675
>しかし、これだと移動中、ずっとイベントが起きてしまいます。
どのように確認したのでしょう?
Form1のドラッグ中には WM_MOVEメッセージは送られてこないはずですよ。
(送られてくるのはドラッグ終了時に一度だけ)
>しかし、これだと移動中、ずっとイベントが起きてしまいます。
にゃるほどにゃ〜
下のような設定にゃらば、そういうことが起きるにゃ〜
>「画面のプロパティ」、「効果」の
>「ウィンドウの内容を表示したままドラッグする」にチェック
にゃ〜も、そういう設定してるんにゃら、ドラッグ中にForm2が一緒に移動した方がいいと思うけどにゃ〜
ん?どうしても Form1のドラッグ終了時に Form2を移動させたいのかにゃ〜?
それはワガママというものだにゃ〜
private
procedure WMNCLBUTTONDOWN(var Msg: TWMNCLBUTTONDOWN); message WM_NCLBUTTONDOWN;
end;
procedure TForm1.WMNCLBUTTONDOWN(var Msg: TWMNCLBUTTONDOWN);
begin
inherited;
if Msg.HitTest = HTCAPTION then begin
if Assigned(Form2) then begin
Form2.Top := Form1.Top + Form1.Height;
Form2.Left := Form1.Left;
end;
end;
end;
みなさん、ありがとうございます。
にゃ〜さんのコードを参考に目的は果たせました。また、過去ログの読みが浅いな、と反省しました。
【総括】(すみません。コピペばかりの文章です)
・画面のプロパティ->効果->ウィンドウの内容を表示したままドラッグする
にチェックがあると、ドラッグ中に WM_MOVEメッセージが送られ続ける。
(チェックを外すと移動後に1度送られる)
・WM_NCLBUTTONDOWN (非クライアント領域上でマウスの左ボタンのイベント)と
HTCAPTION(タイトルバーかどうか?)によってタイトルバーのドラッグを判定できる。
にゃ〜さん
> にゃ〜も、そういう設定してるんにゃら、ドラッグ中にForm2が一緒に移動した方がいいと思うけどにゃ〜
これに賛成。WM_MOVE のメッセージハンドラだけでいいのではないでしょうか。
ツイート | ![]() |