< MakeSureDirectoryPathExists を VB6 でシミュレートする | デスクトップの作業領域 >

February 10, 2005

ListBox に水平スクロールバーを表示する

VB6のリストボックスは、項目が長くても横スクロールできない。横スクロールバーを出すには、LB_SETHORIZONTALEXTENT メッセージを送る必要がある。

項目追加するたびに横スクロールバーを調整するのはこんな感じ

Option Explicit
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 Const LB_GETHORIZONTALEXTENT    As Long = &H193
Private Const LB_SETHORIZONTALEXTENT    As Long = &H194&

'------------------------------------------------------------------
'プロシージャ名:  :AddItemAndSetScrollBar
'説明:            :リストボックスに項目を追加し、必要に応じて横スクロールバーを表示する
'引数:            :pListBox           I   リストボックス
'                 :pItem              I   追加する文字列
'                 :pIndex             I   追加位置
'------------------------------------------------------------------
Private Sub AddItemAndSetScrollBar(pListBox As VB.ListBox, pItem As String, Optional pIndex As Variant)
Dim sngTextWidth        As Single
Dim lngCurPixels        As Long
Dim lngNewPixels        As Long
    
    
    '' ここは説明は不要でしょう
    Call pListBox.AddItem(pItem, pIndex)
    
    '' 現在の幅を取得
    lngCurPixels = SendMessage(pListBox.hWnd, LB_GETHORIZONTALEXTENT, 0&, ByVal 0&)
    
    '' テキストの幅から必要なスクロール幅を計算
    '' 計算方法は適宜修正のこと
    '' リストボックスのフォントとフォームのフォントが同じならこんな感じで求められる
    With pListBox.Parent
        sngTextWidth = .TextWidth(pItem)                            '' 文字列の幅
        lngNewPixels = .ScaleX(sngTextWidth, .ScaleMode, vbPixels)  '' ピクセルに変換
    End With
    
    '' 余白分を足す
    '' ここでは適当に4ピクセル足してるが、システム標準の値とかあるのかしら
    '' GetSystemMetrics( SM_CXEDGE ) * 2 あたりがに合わしておくといいかも
    lngNewPixels = lngNewPixels + 4&
    
    '' 現在の幅がちっちゃければ設定します。
    If (lngNewPixels > lngCurPixels) Then
        Call SendMessage(pListBox.hWnd, LB_SETHORIZONTALEXTENT, lngNewPixels, ByVal 0&)
    End If
End Sub

フォームにテキストボックスとリストボックス、コマンドボタンをはっつけて、ボタンを押下したらテキストボックスの文字列をリストボックスに追加するようにして、確認してみる。

Private Sub Command1_Click()
    Call AddItemAndSetScrollBar(List1, Text1.Text)
End Sub

20050211lb_sethorizontalextent1.png
"ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"と入力してボタンを押したところ。
20050211lb_sethorizontalextent2.png

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/813

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?