エディットボックス(複数行入力)の表示行数取得          <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