VB Tips Vol.62
リストボックスの表示数を設定する


リストボックスの項目を選択するとき、通常は8項目しか表示されませんが、10、20項目などこれ以上多くの項目数を一度に表示させることができます。ただし、3項目など8項目以下はできないようです。

Option Explicit

Private Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function MoveWindow Lib "User32.dll" (ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Private Declare Function GetWindowRect Lib "User32.dll" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function ScreenToClient Lib "User32.dll" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long

Private Const CB_SHOWDROPDOWN = &H14F
Private Const CB_GETITEMHEIGHT = &H154

Private Type POINTAPI
x As Long
y As Long
End Type


Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type


Private Sub Form_Load()
Dim i As Integer

For
i = 1 To 100
Combo1.AddItem CStr(i) & " 項目"
Next i

End Sub

Private Sub Command1_Click()
Dim pt As POINTAPI
Dim
rc As RECT
Dim
oldScaleMode As Long
Dim
ComboWidth As Long
Dim
newHeight As Long
Dim
numItems As Long
Dim
itemHeight As Long

' numItemsに設定した数だけ一度に表示されます
' 通常は8項目ですがそれ以下はできないようです

numItems = 20
Label1 = numItems & "項目が一度に表示されます。"

'ScaleModeを記憶してからピクセルに切り替えます
oldScaleMode = Form1.ScaleMode
Form1.ScaleMode = vbPixels

ComboWidth = Combo1.Width

'1項目の高さを取得します
itemHeight = SendMessage(Combo1.hWnd, CB_GETITEMHEIGHT, 0, ByVal 0)

'変更後のコンボボックスの高さを計算します。
newHeight = itemHeight * (numItems + 2)

Call GetWindowRect(Combo1.hWnd, rc)
pt.x = rc.Left
pt.y = rc.Top

Call ScreenToClient(Form1.hWnd, pt)

Call MoveWindow(Combo1.hWnd, pt.x, pt.y, Combo1.Width, newHeight, True)

'次の行を実行するとコンボボックスの項目を自動的に表示できます
'Call SendMessage(Combo1.hWnd, CB_SHOWDROPDOWN, True, ByVal 0)


Form1.ScaleMode = oldScaleMode

End Sub

サンプルプログラムのダウンロード(6KB)
※このページの内容とサンプルプログラムのコードは多少異なる場合があります。


戻る ホーム