画面上のウィンドウアイテムサイズ取得             <TOP>


画面およびフォーム上の各サイズを取得します。

SystemParametersInfo システムパラメータ情報の取得

GetSystemMetrics 表示要素寸法とシステム構成等の取得

SendMessage メッセージの送信

 

テストプログラムでは、定数および取得した値をリスト表示します。

リスト内表示データは印刷することができます。OSによる相違など比較するのに項目が多すぎるので印刷するようにしました。


'================================================================
'= 画面上のウィンドウアイテムサイズ取得
'=    (GetSystemMetrics.bas)
'================================================================
#include "Windows.bi"

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

' システム全体に関するパラメータを取得・設定
Declare Function Api_SystemParametersInfo& Lib "user32" Alias "SystemParametersInfoA" (ByVal uiAction&, ByVal uiParam&, pvParam As RECT, ByVal fWinIni&)

' さまざまなシステムメトリックの値とシステムの現在の構成を取得
Declare Function Api_GetSystemMetrics& Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex&)

' ウィンドウにメッセージを送信。この関数は、指定したウィンドウのウィンドウプロシージャが処理を終了するまで制御を返さない
Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

#define LB_GETITEMHEIGHT &H1A1          'リストボックス内の項目の高さを取得する
#define LB_SETITEMHEIGHT &H1A0          'リストボックス項目の高さを設定
#define SPI_GETWORKAREA 48              '主モニターの有効なスクリーンのサイズを取得

Var Shared List1 As Object
Var Shared Bitmap As Object
Var Shared Prt As Object 
Var Shared Prm As PRINTPARAM
Var Shared SM$(79,2) As String

List1.Attach GetDlgItem("List1") : List1.SetFontSize 12
BitmapObject Bitmap
PrinterObject Prt

'================================================================
'= ディスプレイ上のウィンドウアイテムのサイズを取得する
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    on error goto *Er_Trap

    Var Flg As byte
    Var rc As RECT
    Var Ret As Long
    Var ListHeight As Long
    Var nIndex As Long

    '------------------------------
    '二重起動禁止
    '------------------------------
    If PrevInstance Then 
        A% = MessageBox(GetWindowText, "このプログラムは実行中です。" , 0 , 0 ) : End
    End If

    '------------------------------
    'ワークエリア取得
    '------------------------------
    Ret = Api_SystemParametersInfo(SPI_GETWORKAREA, 0, rc, 0)

    '------------------------------
    'リスト行間隔設定
    '------------------------------
    ListHeight = 18
    Ret = Api_SendMessage&(List1.GethWnd, LB_SETITEMHEIGHT, 0, ByVal ListHeight)

    '------------------------------
    '
    '------------------------------
    For i = 0 To 79
        For j = 0 To 2
            Read SM$(i, j)
        Next
    Next
    data SM_CXSCREEN          , 0,ディスプレイの幅
    data SM_CYSCREEN          , 1, 〃高さ
    data SM_CXVSCROLL         , 2,垂直スクロールバーの矢印ビットマップの幅
    data SM_CYHSCROLL         , 3,水平スクロールバーの矢印ビットマップの高さ
    data SM_CYCAPTION         , 4,キャプションの高さ
    data SM_CXBORDER          , 5,サイズ固定ウィンドウの境界線の、X方向の幅
    data SM_CYBORDER          , 6, 〃Y方向の幅
    data SM_CXDLGFRAME        , 7,ダイアログフレームスタイルを持つウィンドウの枠線のX方向の幅
    data SM_CYDLGFRAME        , 8, 〃Y方向の高さ
    data SM_CYVTHUMB          , 9,垂直スクロールバーのサムのビットマップの幅
    data SM_CXHTHUMB          ,10,水平スクロールバーのサムのビットマップの幅
    data SM_CXICON            ,11,アイコンの幅
    data SM_CYICON            ,12, 〃高さ
    data SM_CXCURSOR          ,13,カーソルのX方向の幅
    data SM_CYCURSOR          ,14, 〃Y方向の高さ
    data SM_CYMENU            ,15,メニューバーの行の高さ
    data SM_CXFULLSCREEN      ,16,最大化したときのクライアント領域の幅
    data SM_CYFULLSCREEN      ,17, 〃高さ
    data SM_CYKANJIWINDOW     ,18,漢字ウィンドウの高さ
    data SM_MOUSEPRESENT      ,19,マウスがあるとき1
    data SM_CYVSCROLL         ,20,垂直スクロールバーの矢印ビットマップの高さ
    data SM_CXHSCROLL         ,21,水平スクロールバーの矢印ビットマップのX方向の幅
    data SM_DEBUG             ,22,USER.EXEがデバッグ版のとき1
    data SM_SWAPBUTTON        ,23,左右のマウスボタンの機能を切り替えているとき1
    data SM_RESERVED1         ,24,予備1
    data SM_RESERVED2         ,25,予備2
    data SM_RESERVED3         ,26,予備3
    data SM_RESERVED4         ,27,予備4
    data SM_CXMIN             ,28,ウィンドウの最小幅
    data SM_CYMIN             ,29, 〃高さ
    data SM_CXSIZE            ,30,タイトルバー内のビットマップの幅
    data SM_CYSIZE            ,31, 〃高さ
    data SM_CXFRAME           ,32,サイズ可変ウィンドウの境界線の、X方向の幅
    data SM_CYFRAME           ,33, 〃Y方向の幅
    data SM_CXMINTRACK        ,34,ウィンドウの可能な最小幅
    data SM_CYMINTRACK        ,35, 〃高さ
    data SM_CXDOUBLECLK       ,36,ダブルクリックと見なせッル前後のクリックのX方向の幅
    data SM_CYDOUBLECLK       ,37, 〃Y方向の幅
    data SM_CXICONSPACING     ,38,アイコンを配置するための矩形の幅
    data SM_CYICONSPACING     ,39, 〃高さ
    data SM_MENUDROPALIGNMENT ,40,サブメニューが左側揃えのとき0
    data SM_PENWINDOWS        ,41,ペンウィンドウのとき1
    data SM_DBCSENABLED       ,42,2バイト文字をサポートしているとき1
    data SM_CMOUSEBUTTONS     ,43,マウスボタンの数(マウスがないとき0)
    data SM_CXFIXEDFRAME      , 7,SM_CXDLGFRAMEダイアログフレームスタイルを持つウィンドウの枠線のX方向の幅
    data SM_CYFIXEDFRAME      , 8,SM_CYDLGFRAME 〃Y方向の高さ
    data SM_CXSIZEFRAME       ,32,SM_CXFRAMEサイズ可変ウィンドウの境界線の、X方向の幅
    data SM_CYSIZEFRAME       ,33,SM_CYFRAME 〃Y方向の高さ
    data SM_SECURE            ,44,セキュリティが存在するかどうかを示す値
    data SM_CXEDGE            ,45,3D表示ためのX方向の幅
    data SM_CYEDGE            ,46, 〃Y方向の幅
    data SM_CXMINSPACING      ,47,最小化したウィンドウのグリッドセルの幅
    data SM_CYMINSPACING      ,48, 〃高さ
    data SM_CXSMICON          ,49,小さなキャプション内のビットマップの幅
    data SM_CYSMICON          ,50, 〃高さ
    data SM_CYSMCAPTION       ,51,小さいキャプションの高さ
    data SM_CXSMSIZE          ,52,タイトルバー内の小さいボタンの幅
    data SM_CYSMSIZE          ,53, 〃高さ
    data SM_CXMENUSIZE        ,54,メニューバーボタンの幅
    data SM_CYMENUSIZE        ,55, 〃高さ
    data SM_ARRANGE           ,56,最小化ウィンドウの配置方法を示す値
    data SM_CXMINIMIZED       ,57,ウィンドウの可能な最小幅
    data SM_CYMINIMIZED       ,58, 〃高さ
    data SM_CXMAXTRACK        ,59,サイズ変更可能なウィンドウの最大幅
    data SM_CYMAXTRACK        ,60, 〃高さ
    data SM_CXMAXIMIZED       ,61,ディスプレイの最大幅
    data SM_CYMAXIMIZED       ,62, 〃高さ
    data SM_NETWORK           ,63,ネットワークになっているとき
    data SM_CLEANBOOT         ,67,Windowsを起動した方法
    data SM_CXDRAG            ,68,ドラッグを検出する矩形の幅
    data SM_CYDRAG            ,69, 〃Y高さ
    data SM_SHOWSOUNDS        ,70,サウンド解説を使うが有効かどうかを判定
    data SM_CXMENUCHECK       ,71,メニューボタンのチェックマークの幅
    data SM_CYMENUCHECK       ,72, 〃高さ
    data SM_SLOWMACHINE       ,73,処理速度の遅いマシンのとき1
    data SM_MIDEASTENABLED    ,74,アラビア語、ヘブライ語をサポートするとき1
    data SM_XVIRTUALSCREEN    ,76,仮想スクリーンの左座標
    data SM_YVIRTUALSCREEN    ,77, 〃上座標
    data SM_CXVIRTUALSCREEN   ,78,仮想スクリーンの幅
    data SM_CYVIRTUALSCREEN   ,79, 〃高さ

    '------------------------------
    'リスト表示
    '------------------------------
    List1.ResetContent
    For i = 0 To 79
        ZD1$ = Format$(i + 1," ## ")
        ZD2$ = Format$(Trim$(SM$(i, 0)),"&                  & ")
        ZD3$ = Format$(Kacnv$(SM$(i, 2)),"&                            & ")
        ZD4$ = Format$(Api_GetSystemMetrics(Val(SM$(i, 1)))," ####")
        List1.AddString ZD1$ & ZD2$ & ZD3$ & ZD4$
    Next
    List1.AddString String$(71, "-")

    '------------------------------
    'ワークエリア・タスクバー
    '------------------------------
    ZD1$ = "ワークエリア ("
    ZD2$ = Str$(rc.Left) & "," & Str$(rc.Top) & ")-("
    ZD3$ = Str$(rc.Right - 1) & "," & Str$(rc.Bottom - 1) & ")"
    List1.AddString ZD1$ & ZD2$ & ZD3$

    ZD1$ = "タスクバーの高さ "
    ZD2$ = Format$(Api_GetSystemMetrics(1) - rc.Bottom," ####")
    List1.AddString ZD1$ & ZD2$
    Exit Sub

    *Er_Trap
        Flg = 1 : Resume Next
End Sub

'================================================================
'= 印刷
'================================================================
Declare Sub mnuPrintOut_On edecl ()
Sub mnuPrintOut_On()
    Prt.SetupPrinterMode "SetupPrinter:", 13, 1
    If Prt.PrintDlg(Prm) <> 0 Then
        Prt.SetMapMode 2
        Prt.StartDoc "Sample"
        Prt.StartPage
        Prt.SetFontName "MS ゴシック"
        Prt.SetFontSize 11
        Page = 1
        Gyo = 0
        GoSub *Prt_Style
        For i = 0 To 79
            Gyo = Gyo + 1
            ZD1$ = Format$(i + 1," ## ")
            ZD2$ = Format$(Trim$(SM$(i, 0)),"&                  & ")
            ZD3$ = Format$(Kacnv$(SM$(i, 2)),"&                            & ")
            ZD4$ = Format$(Api_GetSystemMetrics(Val(SM$(i, 1)))," ####")
            Prt.Symbol(150, (Gyo - 1) * 45 + 350), ZD1$ & ZD2$ & ZD3$ & ZD4$, 1, 1
            If Gyo = 40 and i < 79 Then GoSub *Page_Change
        Next

        Prt.EndPage
        Prt.EndDoc
        Prt.ClosePrinter
        Exit Sub
    Else
        Exit Sub
    End If

    *Prt_Style
        Prt.Symbol(630, 200), "ウィンドウズアイテムサイズ取得", 1, 1
        Prt.Symbol(850, 2300), "- " & Trim$(Str$(Page)) & " -", 1, 1
        Return

    *Page_Change
        Prt.EndPage
        Prt.EndDoc

        Prt.StartDoc "Sample"
        Prt.StartPage
        Page = Page + 1
        Gyo = 0
        goSub *Prt_Style
        Return
End Sub

'================================================================
'= 終了
'================================================================
Declare Sub MainForm_QueryClose edecl (Cancel%, ByVal Mode%)
Sub MainForm_QueryClose(Cancel%, ByVal Mode%)
    Cancel% = MessageBox(GetWindowText, "終了しますか?", 1, 1)
    If Cancel% = 0 Then End
End Sub

Declare Sub mnuExit_On edecl ()
Sub mnuExit_On()
    Ret = MessageBox(GetWindowText, "終了しますか?", 1, 1)
    If Ret = 0 Then End
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
STop
End