画面上のウィンドウアイテムサイズ取得 <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