タスクバーを考慮してフォームを中央に寄せる

せっかくフォームを中央寄せしてもタスクバーにかかってしまって見栄えが悪かったりします。
そこでタスクバーの大きさを考慮してフォームを中央寄せするテクニックです。

サンプル(32bit) ダウンロード

'システムパラメータ情報の取得API
Private 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

Private Const SPI_GETWORKAREA = 48

Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type


Private Sub Command2_Click()

    Dim udtRECT As RECT
    
    'ワークエリアの取得
    Call SystemParametersInfo(SPI_GETWORKAREA, 0, udtRECT, 0)
    
    With udtRECT
        'ワークエリアの座標(Pixel)をTwipに変換
        .Left = .Left * Screen.TwipsPerPixelX
        .Top = .Top * Screen.TwipsPerPixelY
        .Right = .Right * Screen.TwipsPerPixelX
        .Bottom = .Bottom * Screen.TwipsPerPixelY
        
        'フォームの座標を設定(ワークエリア中央)
        Me.Left = (((.Right - .Left) - Me.Width) / 2) + .Left
        Me.Top = (((.Bottom - .Left) - Me.Height) / 2) + .Top
    End With

End Sub

サンプル解説

Command2ボタンをクリックするとスクリーンからタスクバー・アプリケーションバーの大きさを引いた領域(ワークエリア)の中央にフォームを移動しています。

ワークエリアの取得にはSystemParametersInfo関数を使用します。

引数の内容は次の通りです。
(引数の名前は、Declare Functionで指定したものです)

メンバー I/O 説明
uAction In 取得したい情報の種類。
サンプルではSPI_GETWORKAREAを指定しています。
uParam Out パラメータ1
サンプルではSPI_GETWORKAREAは使用しないので0を設定しています。
lpvParam Out パラメータ2
サンプルではワークエリアの座標情報を取得するためRECT構造体を指定しています。
fuWinIni In ユーザープロファイル(Win.ini)の更新オプション
サンプルでは更新しないので0を設定しています。

SystemParametersInfo関数を実行すると、引数lpvParamにRECT構造体を返してくるので、これをもとにフォームを中央に移動しています。

もちろんRECT構造体の内容はピクセルですのでTwipに換算する必要があります。

SystemParametersInfo関数は、その他にも多種多様な情報の取得や設定が行えます。(壁紙の変更も出来たりします)


[ Window Close ]