一緒に移動するフォーム


anonymous  2003-08-01 10:45:59  No: 78851  IP: [192.*.*.*]

二つのフォームを隣接させて、ひとつのフォームのように動くプログラムを作成しようと
しているのですが、いろいろやったんですがうまくいきません。
どなたかいい方法をお知りの方、是非ご教示ください。

編集 削除
毘沙門  2003-08-01 17:37:01  No: 78852  IP: [192.*.*.*]

Form1の移動に合わせてForm2が移動する例を作ってみました。
Form1にはTimerを貼り付けてください。

'=== Form1 ===
Option Explicit
Private mX As Long
Private mY As Long
Event MoveWindow(W As Long, H As Long, X As Long, Y As Long)

Private Sub Form_Load()
    Timer1.Interval = 200
    Timer1.Enabled = True
    Form2.Show
End Sub

Private Sub Timer1_Timer()
    If (mX <> Me.Left Or mY <> Me.Top) Then
        mX = Me.Left
        mY = Me.Top
        RaiseEvent MoveWindow(Me.Width, Me.Height, mX, mY)
    End If
End Sub

'=== Form2 ===
Option Explicit

Private WithEvents PForm As Form1

Private Sub Form_Load()
    Set PForm = Form1
End Sub

Private Sub PForm_MoveWindow(W As Long, H As Long, X As Long, Y As Long)
    Me.Move X + W, Y
End Sub

いかがでしょう?

編集 削除
anonymous  2003-08-01 18:46:28  No: 78853  IP: [192.*.*.*]

ありがとうございます。参考にさせてもらいます。
あと、WM_MOVE を使ったやり方があるそうなのですが、
それを使ったやり方をもし、お知りでしたらそちらも教えていただけませんでしょうか?よろしくお願いします。

編集 削除
たかみちえ  URL  2003-08-01 18:57:42  No: 78854  IP: [192.*.*.*]

要はまったく同じです。
WM_MOVEはウィンドウの移動時に発生するので、そこで毘沙門さんがタイマーでしたことと同じことをします。

  でも、WM_MOVEを受け取るには、サブクラス化しなければいけないので、お勧めはできません。

  もうサブクラス化しているというのならば、
WM_MOVEより、WM_WINDOWPOSCHANGINGやWM_WINDOWPOSCHANGED,WM_SETWINDOWPOSなどを使ったほうが滑らかに動かせると思います。

編集 削除