|
■No89990 (魔界の仮面弁士) に追記 > 再現手順が分かりました。 > (3) プライマリモニタ上で exe を実行し、Form1 をセカンダリに移動してから子フォームを表示 → ×プライマリ上で全画面 > (4) セカンダリモニタ上で exe を実行し、Form1 をプライマリに移動してから子フォームを表示 → ×セカンダリ上で全画面
FormStartPosition.CenterParent が指定されたフォームをモーダル表示した場合、 Load 時に「CenterToParent メソッド」が呼ばれているのですが、 FormWindowState.Maximized の状態では、Owner の中央座標への移動が 直ちに行われません。(最大化を解除した時に反映される)
' フォームをダブルクリックすると、子フォームをモーダル表示するサンプル Public Class Form1 Protected Overrides Sub OnDoubleClick(ByVal e As EventArgs) MyBase.OnDoubleClick(e) Using childForm As New Form2(True) childForm.ShowDialog(Me) 'これは OK (Form1 のある画面上に表示される) End Using Using childForm As New Form2(False) childForm.ShowDialog(Me) 'これは NG (初期起動時の画面上に表示される) End Using End Sub End Class
Public Class Form2 Inherits Form Public Sub New(b As Boolean) StartPosition = FormStartPosition.CenterParent If b Then CenterToParent() WindowState = FormWindowState.Maximized Else WindowState = FormWindowState.Maximized CenterToParent() End If End Sub End Class
というのも、そもそも最大化されている最中に Location プロパティを操作しても、 ウィンドウ位置が変化しないものらしいです。
' フォームをクリックするたびに、プライマリモニタとセカンダリモニタを行き来するサンプル ' 最大化している時と最大化していない時では、振る舞いが異なる。 Public Class Form1 Protected Overrides Sub OnClick(ByVal e As EventArgs) MyBase.OnClick(e) Dim AllScreens As Screen() = Screen.AllScreens If AllScreens.Length > 1 Then Location = If(Screen.FromControl(Me).DeviceName = AllScreens(1).DeviceName, AllScreens(0), AllScreens(1)).WorkingArea.Location Else MsgBox("マルチモニタ環境ではありません") End If End Sub End Class
|