VB-Homepage Tipp 175

Combobox / Auswahlanzeige modifizieren

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.


Tipp-Download

Quelle : Matt Hart - http://www.webczar.com/defcon/mh/vbhelp.html

Zurück zur Übersichtsseite