フォームの表示位置を指定するとき、画面全体は Screen オブジェクトで表現するので画面の横幅は Screen.Width、縦幅は Screen.Height で取得できます。
表示するフォームを Me としたとき、画面中央にフォームを表示するには以下のコードで実現できます。
Me.Left = (Screen.Width - Me.Width) ¥ 2 Me.Top = (Screen.Height - Me.Height) ¥ 2
ところが実際には通常タスクバーが存在し、割と大きなフォームの場合はタスクバーにかかってスマートでないことがあります。しかし、タスクバーのサイズが分かれば次のようにすることで、タスクバー以外の範囲内で表示することが可能です。
以下がそのコードです。
まず、宣言部でWinsows API、そこで使用する定数や構造体を宣言します。モジュールレベルに記述します。
Public Const SPI_GETWORKAREA = 48 Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Public RectA As RECT Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" _ (ByVal uAction As Long, ByVal uParam As Long, _ ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
これらを使って以下のようなコードにします。
SystemParametersInfo SPI_GETWORKAREA, 0, RectA, False Me.Left = (Screen.TwipsPerPixelX * (RectA.Right - RectA.Left) - Me.Width) ¥ 2 Me.Top = (Screen.TwipsPerPixelY * (RectA.Bottom - RectA.Top) - Me.Height) ¥ 2
Winsows APIである SystemParametersInfo 関数を SPI_GETWORKAREA 定数で呼び出すと、 第三引数に指定した RECT 構造体変数に画面からタスクバーを除いた位置がピクセル単位で取得できます。 あとは Screenオブジェクトの TwipsPerPixelX, TwipsPerPixelYプロパティで、ピクセルからTwipsに変換できるので 中央への表示位置を算出できます。
通常は上記コードで十分ですが、タスクバーを上や左に配置されると期待した位置になりません。 これを考慮したコードにするには以下のようにするとよいでしょう。
SystemParametersInfo SPI_GETWORKAREA, 0, RectA, False Me.Left = (Screen.TwipsPerPixelX * (RectA.Right - RectA.Left) - Me.Width) ¥ 2 + _ Screen.TwipsPerPixelX * RectA.Left Me.Top = (Screen.TwipsPerPixelY * (RectA.Bottom - RectA.Top) - Me.Height) ¥ 2 + Screen.TwipsPerPixelY * RectA.Top