- 題名: フォームの移動について
- 日時: 2004/08/21 1:51:45
- ID: 5724
- この記事の返信元:
- (なし)
- この記事への返信:
- [5727] Re[1]: フォームの移動について2004/08/21 18:17:02
- [5948] Re[1]: フォームの移動について2004/09/01 13:01:41
- ツリーを表示
■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 )プロパティの値を変更したときには
# メッセージが表示されませんけど。
分類:[.NET]
フォームが移動されたことを監視したいのですが,
どのようにすれば良いでしょうか.
例えば,
フォームの移動完了後に
「フォームが移動されました」とかを表示したいです.