宮崎県延岡市 | スマイルカラーソフトウェア | ユーザースタイルに合わせたプログラミングでお客様に幸せをお届けします。

タスクバーを考慮してフォームを任意の位置に配置

フォームの表示位置を指定するとき、画面全体は 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

《 同一カテゴリ内の前後の記事》