タスクバーを考慮しフォームを画面中央に(U)          <TOP>


タスクバーを考慮しフォームをデスクトップ中央に配置します。

FindWindow クラス名またはキャプションを与えてウィンドウのハンドルを取得

GetWindowRect ウィンドウの座標をスクリーン座標系で取得

GetDesktopWindow Windows のデスクトップ ウィンドウを識別

GetClientRect ウィンドウのクライアント領域の座標を取得

 

画面解像度により、適当なフォームサイズを指定し、中央に配置されるか確認しています。(疑い深い・・)

タスクバーが下および右にある場合のみ想定しています。

 

'================================================================
'= タスクバーを考慮しフォームを中央に(U)
'=    (MoveWindowCenter.bas)
'================================================================
#include "Windows.bi"

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

' クラス名またはキャプションを与えてウィンドウのハンドルを取得
Declare Function Api_FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$)

' ウィンドウの座標をスクリーン座標系で取得
Declare Function Api_GetWindowRect& Lib "user32" Alias "GetWindowRect" (ByVal hWnd&, lpRect As RECT)

' Windows のデスクトップ ウィンドウを識別。返されるポインタは、一時的なポインタ。後で使用するために保存しておくことはできない
Declare Function Api_GetDesktopWindow& Lib "user32" Alias "GetDesktopWindow" ()

' ウィンドウのクライアント領域の座標を取得
Declare Function Api_GetClientRect& Lib "user32" Alias "GetClientRect" (ByVal hWnd&, lpRect As RECT)

Var Shared Text(1) As Object
Var Shared Edit(1) As Object
Var Shared Button1 As Object

For i = 0 To 1
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14
    Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) : Edit(i).SetFontSize 14
Next i
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var Rect_Client As RECT
    Var Rect_TaskBar As RECT
    Var fWidth As Long
    Var fHeight As Long
    Var vLeft As Long
    Var vTop As Long
    Var hTask As Long
    Var Ret As Long

    fWidth = Val(Edit(0).GetWindowText)
    fHeight = Val(Edit(1).GetWindowText)
    If fWidth < 240 Or fHeight < 140 Then
        fWidth = 240
        fHeight = 140
    End If
    SetWindowSize fWidth, fHeight

    Ret = Api_GetClientRect(Api_GetDesktopWindow(), Rect_Client) 
    hTask = Api_FindWindow("Shell_TrayWnd", Chr$(0))

    If hTask <> 0 Then
        Ret = Api_GetWindowRect(hTask, Rect_TaskBar)
        If (Rect_TaskBar.Right - Rect_TaskBar.Left) > (Rect_TaskBar.Bottom - Rect_TaskBar.Top) Then
            If Rect_TaskBar.Top <= 0 Then
                Rect_Client.Top = Rect_Client.Top + Rect_TaskBar.Bottom
            Else
                Rect_Client.Bottom = Rect_Client.Bottom - (Rect_TaskBar.Bottom - Rect_TaskBar.Top)
            End If
        Else
            If Rect_TaskBar.Left <= 0 Then
                Rect_Client.Left = Rect_Client.Left + Rect_TaskBar.Right
            Else
                Rect_Client.Right = Rect_Client.Right - (Rect_TaskBar.Right - Rect_TaskBar.Left)
            End If
        End If
    End If

    vLeft = (Rect_Client.Right - Rect_Client.Left - GetWidth) / 2
    vTop = (Rect_Client.Bottom - Rect_Client.Top - GetHeight) / 2
    MoveWindow vLeft, vTop
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End