AdjustHScrollBar()

リストボックスコントロールは、自動的に水平スクロールバーを表示してはくれないので、入りきらないような長い文字列をアイテムとして追加した場合、ユーザーはその内容を見ることが出来なくなってしまいます。
そこで、各アイテムの長さを測定し、一番長いアイテムに合わせて水平スクロールバーを付加する関数を作りました。プロポーショナルフォントにも対応しています。

'標準モジュールに記述します。

Option Explicit

Private Type Size
    cx As Long
    cy As Long
End Type

Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" _
    (ByVal hDC As Long, _
     ByVal lpsz As String, _
     ByVal cbString As Long, _
     lpSize As Size) As Long
Private Declare Function GetDC Lib "user32" _
    (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" _
    (ByVal hwnd As Long, _
     ByVal hDC As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     lParam As Any) As Long
Private Declare Function SelectObject Lib "gdi32" _
    (ByVal hDC As Long, _
     ByVal hObject As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32" _
    (ByVal nIndex As Long) As Long

Private Const SM_CXBORDER = 5
Private Const WM_GETFONT = &H31
Private Const LB_SETHORIZONTALEXTENT = &H194

Public Sub AdjustHScrollBar(ListCtrl As ListBox)
'ListBox 内の Item の最大横幅を計算し、水平スクロールバーを丁度いい大きさで表示する

    Dim hDC As Long
    Dim hFont As Long
    Dim i As Long
    Dim s As Size
    Dim lngMaxWidth As Long

    'デバイスコンテキストハンドル取得
    hDC = GetDC(ListCtrl.hwnd)
    'フォントハンドル取得
    hFont = SendMessage(ListCtrl.hwnd, WM_GETFONT, 0, 0)
    'デバイスコンテキストにフォントを関連付ける
    Call SelectObject(hDC, hFont)

    '各リストアイテム毎に長さを測定し、その最大値を求める
    lngMaxWidth = 0
    For i = 0 To ListCtrl.ListCount - 1
        Call GetTextExtentPoint32(hDC, _
                                  ListCtrl.List(i), _
                                  LenB(StrConv(ListCtrl.List(i), vbFromUnicode)), _
                                  s)
        If lngMaxWidth < s.cx Then lngMaxWidth = s.cx
    Next
    
    'デバイスコンテキストハンドル解放
    Call ReleaseDC(0, hDC)
    '長さの最大値に、コントロールの境界線分の幅を足したものを基準値にして
    '水平スクロールバーを作成
    Call SendMessage(ListCtrl.hwnd, _
                     LB_SETHORIZONTALEXTENT, _
                     lngMaxWidth + GetSystemMetrics(SM_CXBORDER) * 4, _
                     0)

End Sub

実行例:

'フォームにリストボックス(List1)を配置して、以下のプロシージャを記述します。

Private Sub Form_Load()

    With List1
        .AddItem "じゅげむじゅげむごこうのすりきれ"
        .AddItem "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwx"
        .AddItem "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix"
    End With
    
    Call AdjustHScrollBar(List1)

End Sub

実行画面
実行画面実行画面

戻る