DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームの移動について

環境/言語:[WinXP HE / VB.NET]
分類:[.NET]

フォームが移動されたことを監視したいのですが,
どのようにすれば良いでしょうか.
例えば,
フォームの移動完了後に
「フォームが移動されました」とかを表示したいです.
■No5724に返信(tatsuyaさんの記事)
> フォームが移動されたことを監視したいのですが,
> どのようにすれば良いでしょうか.

FormのMoveイベントはおそらくその為にあるかと思います。

Private Sub Form_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Move
MsgBox("フォームが移動されました")
End Sub
■No5724に返信(tatsuyaさんの記事)

 tatsuyaさん、こんにちは。深山と申します。

 その後レスがないところを見ると、ひろさんのされた回答で十分だったのかも知れませんけども
> フォームの移動完了後に
というのが気になったので実験してみました。
# いや、相当今更だとは思うのですが(^_^;)


 『移動が完了する』というのは『移動した後、一定時間以上移動しない』と見做すことが
できるのでは? そんな観点から試してみたのが次のコードです。タイマ コントロールを
配置し、 Interval プロパティには適当な値を設定しました。

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Timer1.Enabled = False
        MessageBox.Show("フォームが移動されました")
    End Sub

    Private Sub Form1_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Move
        Timer1.Enabled = False
        Timer1.Enabled = True
    End Sub

 で、動かしたところ‥‥起動時にもメッセージが表示される、最小化など WindowState が
変化したときにもメッセージが表示される、タイトルバーをドラッグ中(=移動中)でも
メッセージが表示されると散々でした(汗)
 一つ目のは Visible プロパティが False のときにはタイマを起動しないことで回避できますし、
二つ目のは移動と言えなくもありません(ぇ)。でも最後のは致命的ですよね。メッセージ表示後に
移動開始時の位置に戻ってしまう(しかもそれによって再度メッセージが表示されてしまう)
のですから‥‥(ーー;)


 どうやら方向性を変えた方が良さそうだと思い Spy++ で監視してみたところ、移動完了時には
WM_EXITSIZEMOVE メッセージが通知されることが判りました。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowMessages/WM_EXITSIZEMOVE.asp
 そこで書いたのが次のコードです。

    Private Const WM_EXITSIZEMOVE As Integer = &H232

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_EXITSIZEMOVE
                MessageBox.Show("フォームが移動されました")
        End Select
        MyBase.WndProc(m)
    End Sub

 これなら問題はないかと思うのですが如何でしょう?
# 勿論、これだけだとフォームのサイズを変更したときにもメッセージが表示されてしまいますし
# コード上で直接 Location (若しくは Left 、 Top )プロパティの値を変更したときには
# メッセージが表示されませんけど。

DOBON.NET | プログラミング道 | プログラミング掲示板