エディットボックス(複数行入力)の表示行数取得 <TOP>
GetWindowLong
指定されたウィンドウに関しての情報を取得
SetWindowLong
指定されたウィンドウの属性を変更
SetWindowPos
ウィンドウのサイズ、位置、およびZオーダーを設定
SendMessage
ウィンドウにメッセージを送信
GetDC
指定されたウィンドウのデバイスコンテキストのハンドルを取得
SelectObject指定されたデバイスコンテキストのオブジェクトを選択
GetTextMetrics
フォントに関する情報を取得
ReleaseDC
デバイスコンテキストを解放
EM_GETLINECOUNT(&HBA) MLE(複数行編集)内の行数を取得
'================================================================ '= エディットボックス(複数行入力)の表示行数取得 '= (EM_GETLINECOUNT.bas) '================================================================ #include "Windows.bi" Type TEXTMETRIC tmHeight As Long tmAscent As Long tmDescent As Long tmInternalLeading As Long tmExternalLeading As Long tmAveCharWidth As Long tmMaxCharWidth As Long tmWeight As Long tmOverhang As Long tmDigitizedAspectX As Long tmDigitizedAspectY As Long tmFirstChar As Byte tmLastChar As Byte tmDefaultChar As Byte tmBreakChar As Byte tmItalic As Byte tmUnderlined As Byte tmStruckOut As Byte tmPitchAndFamily As Byte tmCharSet As Byte End Type Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type ' 指定されたウィンドウに関しての情報を取得。また、拡張ウィンドウメモリから、指定されたオフセットにある32ビット値を取得することもできる Declare Function Api_GetWindowLong& Lib "user32" Alias "GetWindowLongA" (ByVal hWnd&, ByVal nIndex&) ' 指定されたウィンドウの属性を変更。また、拡張ウィンドウメモリの指定されたオフセットの32ビット値を書き換えることができる Declare Function Api_SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&) ' ウィンドウのサイズ、位置、および Z オーダーを設定。(ウィンドウの重なり順のことを「Zオーダー」といいZオーダーのトップに置くと一番手前に表示される) Declare Function Api_SetWindowPos& Lib "user32" Alias "SetWindowPos" (ByVal hWnd&, ByVal hWndInsertAfter&, ByVal X&, ByVal Y&, ByVal CX&, ByVal CY&, ByVal uFlags&) ' ウィンドウにメッセージを送信 Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any) ' 指定されたウィンドウのデバイスコンテキストのハンドルを取得 Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' 指定されたデバイスコンテキストのオブジェクトを選択 Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&) ' フォントに関する情報を取得 Declare Function Api_GetTextMetrics& Lib "gdi32" Alias "GetTextMetricsA" (ByVal hDC&, lpMetrics As TEXTMETRIC) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) #define GWL_STYLE -16 'アプリケーションのインスタンスハンドル #define WS_THICKFRAME &H40000 'サイズ変更境界を持つウィンドウを作成する #define SWP_DRAWFRAME &H20 '再描画のときウインドウを囲む枠も描画 #define SWP_FRAMECHANGED &H20 'ウインドウのサイズ変更中でなくてもWM_NCCALCSIZEを送る #define SWP_HIDEWINDOW &H80 'ウインドウを隠す #define SWP_NOACTIVATE &H10 'ウインドウをアクティブにしない #define SWP_NOCOPYBITS &H100 'クライアント領域の内容をクリアする #define SWP_NOMOVE &H2 'ウインドウの現在位置を保持する #define SWP_NOOWNERZORDER &H200 'オーナーウインドウのZオーダーは変えない #define SWP_NOREDRAW &H8 'ウインドウを自動的に再描画しない #define SWP_NOREPOSITION &H200 'SWP_NOOWNERZORDERと同じ #define SWP_NOSIZE &H1 'ウインドウの現在のサイズを保持する #define SWP_NOZORDER &H4 'ウインドウリスト内での現在位置を保持する #define SWP_SHOWWINDOW &H40 'ウインドウを表示する #define SWP_FLAGS (SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME) #define EM_GETRECT &HB2 'エディットコントロール長方形の座標を取得する #define WM_GETFONT &H31 'テキストボックス・」エディットボックス等が現在使っているフォントのハンドル #define EM_GETLINECOUNT &HBA 'MLE(複数行編集)内の行数を取得する Var Shared Text1 As Object Var Shared Text2 As Object var Shared Edit1 As Object Var Shared Button1 As Object Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 Text2.Attach GetDlgItem("Text2") : Text2.SetFontSize 14 Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Var newStyle As Long Var txt As String Var Ret As Long For i = 1 To 20 txt = txt & Trim$(Str$(Rnd(1) * 10000)) & Chr$(13, 10) Next Edit1.SetWindowtext txt 'エディットボックスのサイズを変更可能に newStyle = Api_GetWindowLong(Edit1.GethWnd, GWL_STYLE) newStyle = newStyle Or WS_THICKFRAME Ret = Api_SetWindowLong(Edit1.GethWnd, GWL_STYLE, newStyle) Ret = Api_SetWindowPos(Edit1.GethWnd, GethWnd, 0, 0, 0, 0, SWP_FLAGS) End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var rct As RECT Var TextBoxHeihgt As Long Var hTextBoxDC As Long Var hFont As Long Var tm As TEXTMETRIC Var TextboxLineCount As Long Var VisibleLineCount As Long Var Ret As Long 'フォーマット矩形を取得 Ret = Api_SendMessage(Edit1.GethWnd, EM_GETRECT, 0, rct) '描画高を算出 TextBoxHeihgt = rct.Bottom - rct.Top 'デバイスコンテキストのハンドルを取得 hTextBoxDC = Api_GetDC(Edit1.GethWnd) '使用しているフォントのハンドルを取得 hFont = Api_SendMessage(Edit1.GethWnd, WM_GETFONT, 0, ByVal CLng(0)) 'システムフォント以外のとき If hFont <> 0 Then 'フォントオブジェクトを選択 Ret = Api_SelectObject(hTextBoxDC, hFont) End If 'テキストボックスのテキストメトリック構造体を取得 Ret = Api_GetTextMetrics(hTextBoxDC, tm) 'デバイスコンテキストのハンドルを開放 Ret = Api_ReleaseDC(Edit1.gethWnd, hTextBoxDC) 'テキストボックス全体の行数を取得 TextboxLineCount = Api_SendMessage(Edit1.GethWnd, EM_GETLINECOUNT, 0, ByVal CLng(0)) '取得した情報から表示されている行数を算出 VisibleLineCount = TextBoxHeihgt \ tm.tmHeight '算出された行数よりも全体の行数が少ないとき If VisibleLineCount > TextboxLineCount Then 'テキストボックス全体の行数が表示されている行 VisibleLineCount = TextboxLineCount End If '結果を表示 Text2.SetWindowText Str$(VisibleLineCount) & "行" End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End