Wenn Sie in Ihrem Projekt Comboboxen verwenden, dann
haben Sie sicher schon bemerkt, daß egal wie viele Einträge die Box enthält, maximal 8
gleichzeitig angezeigt werden, wenn die Box aktiv aufklappt. Wenn Sie aber genügend Platz
haben und es für Sie günstiger erscheint, gleich mehr Einträge anzuzeigen, dann können
Sie dies mit folgendem Tipp realisieren. Für diese Funktionalität gehört aber einiges an
Definition, so das Sie überlegen sollten, ob sich dies für Ihr Projekt lohnt.
1. Für den Test benötigen Sie ein neues Projekt, eine Textbox (Text1),
einen Command Button (Command1) und eine Combobox (wer hätte das gedacht?!).
2. In den Abschnitt Allgemein/Deklarationen definieren Sie folgendes.
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd
As Long) As Long
Const GW_CHILD = 5
Const GW_HWNDNEXT = 2
Const SWP_NOMOVE = &H2
Const SWP_NOZORDER = &H4
Const SWP_NOREDRAW = &H8
Const SWP_NOACTIVATE = &H10 Private Declare
Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As
Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const CB_GETITEMHEIGHT = &H154
Const CB_GETDROPPEDWIDTH = &H15F
Const CB_SHOWDROPDOWN = &H14F
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect
As RECT) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal
hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As
Long, ByVal wFlags As Long) As Long
Private Type SIZE
cx As Long
cy As Long
End Type
Private Declare Function GetWindowExtEx Lib "gdi32" (ByVal hdc As Long, lpSize
As SIZE) As Long
3. Der Command Button erhält in der Aktion Click folgende Anweisungen.
Dim i As Long, l As Long, h As Long, w As Long, f As Long, lh As Long
Dim Rl As RECT, Rcb As RECT, S As SIZE
On Local Error Resume Next
w = SendMessage(Combo1.hwnd, CB_GETDROPPEDWIDTH, 0, 0)
lh = SendMessage(Combo1.hwnd, CB_GETITEMHEIGHT, 0, 0)
l = lh * (Val(Text1.Text) + 2)
h = GetWindow(hwnd, GW_CHILD)
i = GetWindowRect(Combo1.hwnd, Rcb)
Do While h
i = GetWindowRect(h, Rl)
If Rl.Left = Rcb.Left And Rl.Top = Rcb.Top Then
'i = GetWindowExtEx(h, S)
'If S.cx = w Then Exit Do
Exit Do
End If
i = GetWindow(h, GW_HWNDNEXT)
If i = 0 Then Exit Sub
h = i
Loop
f = SWP_NOMOVE + SWP_NOZORDER + SWP_NOREDRAW +
SWP_NOACTIVATE
i = SetWindowPos(h, Combo1.hwnd, 0, 0, w, l, f)
Combo1.SetFocus
i = SendMessage(Combo1.hwnd, CB_SHOWDROPDOWN, True, 0)
4. Füllen Sie zum Programmstart Ihre Combobox mit einer beliebigen
Anzahl an Einträgen.
for i = 1 to 50
combo1.additem "Das ist Eintrag " & i
next
5. Starten Sie Ihr Projekt und tragen in die Textbox die Anzahl der
Einträge ein, die beim aktivieren der Combobox gleichzeitig angezeigt werden sollen.
Klicken sie dann auf den Command Button um die Funktion auszuführen. |