Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0174: Dropdownhöhe bei einer ComboBox ändern

 von 

Beschreibung 

Die Dropdownhöhe einer Combobox ist in der Regel durch das System vorgegeben. Es gibt aber einen Möglichkeit selbst Hand anzulegen, in dem der ScaleMode des Trägers den neuen Vorgaben angepaßt wird.

Änderung am 15.11.2003:
Jetzt muss der Container von Combo1 nicht mehr eine ScaleMode-Eigenschaft haben

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

MoveWindow

Download:

Download des Beispielprojektes [2,18 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Textfeld "Text1"
' Steuerelement: Kombinationsliste "Combo1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Declare Function MoveWindow Lib "user32" (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 Sub Form_Load()
  Dim x%
   
  With Combo1
      For x = 0 To 10
        .AddItem "Gurken"
        .AddItem "Tomaten"
        .AddItem "Kartoffeln"
        .AddItem "Zwiebeln"
      Next x
  End With
End Sub

Private Sub Command1_Click()
  Call SetDropDown(Abs(CLng(Text1.Text)))
End Sub

'Änderung am 15.11.2003:
'Jetzt muss der Container von Combo1 nicht mehr eine ScaleMode-Eigenschaft haben
Private Sub SetDropDown(Yn&)
  Dim Ys&
  
  Ys = Screen.Height / Screen.TwipsPerPixelY
  If Yn > Ys / 2 Then Yn = Ys / 2
 
  With Combo1
      MoveWindow .hwnd, .Left / Screen.TwipsPerPixelX, .Top / Screen.TwipsPerPixelY, _
        .Width / Screen.TwipsPerPixelY, Yn, 1
  End With
    
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 4 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Marc Weinberger am 03.03.2006 um 14:16

Hallo,

ich wollte eine ComboBox in PowerPoint darstellen mit einer Liste incl. mehreren Funtionen/Links zur Auswahl. Leider ist diese Anleitung hier für einen Anfänger nur wenig verständlich .

Gruss

Kommentar von Werner Fink am 01.03.2002 um 08:52

Zu den beiden Kommentaren:
Wenn bei MoveWindow der Parameter nWidth geändert wird, stellt sich die Breite der gesamten ComboBox (inkl. Eingabefeld) ein. Um nur die Breite der DropDown-Liste zu ändern, kann die API-Funktion SendMessage verwendet werden (siehe dazu auch Tip#145).
Wenn die ComboBox z.B. in einer ToolBar eingesetzt wird, dann ergibt sich bei der Funktion MoveWindow tatsächlich das Problem wie im Kommentar von Rob beschrieben. Das liegt daran, dass die ToolBar (oder andere Container) keine ScalMode-Eigenschaft besitzen und als Parent über die Eigenschaft Combo1.Parent immer die Form ermittelt wird. Wenn man nun die ComboBox in ein Picturefeld einbettet (das hat eine ScalMode-Eigenschaft) und dieses dann in die ToolBar aufnimmt, geht das Ganze einwandfrei, wenn statt Me.Combo1.Parent.ScaleMode in dem Fall z.B. Me.Picture1.ScaleMode verwendet wird (also der Parent fest vorgegeben wird und nicht über Combo1.Parent ermittelt wird). MoveWindow muss natürlich trotzdem auf die ComboBox angewendet werden.
Kleiner Hinweis am Rand noch: oft ist es ja so, dass, wenn der Anwender eine Höhe einstellen können soll, dieser nicht mit Pixelwerten konfrontiert werden sollte sondern einfach die Anzahl der maximal sichtbaren Zeilen eingeben soll. Um das auflösungsunabgängig zu machen, muss erst die Höhe eines Eintrag ermittelt werden. Auch hierzu kann SendMessage verwendet werden.
Const CB_GETITEMHEIGHT = &H154
itemHeight = SendMessage(Me.ComboBox.hwnd, CB_GETITEMHEIGHT, 0, 0)
Der dritte Parameter (wParam), in dem Fall 0, gibt an, welche Höhe ermittelt werden soll (-1: Höhe des Eintrags des Eingabefelds, 0: Normaler Eintrag, Nr: Index eines bestimmten Eintrags bei UserDefined Listen). Der Rückgabewert der Funktion ist dann die gesuchte Höhe in Pixeln.
Nachdem mit MoveWindow das ganze Fenster (Eingabefeld und Liste, auch wenn nur die Liste sichtbar ist) berechnet wird, muss man noch die Höhe des Eingabefelds dazuzählen (in Pixel) und schon kann man z.B. so die benötigte Höhe berechnen:
listHeight = NoOfLines * itemHeight + boxHeight
listHeight ist die endgültige Höhe des Liste, die MoveWindow übergeben werden muss
NoOfLines ist die übergebene Anzahl von Zeilen
itemHeight ist die ermittelte Höhe eines Listeneintrag
boxHeight ist die Höhe des Eingabefeldes.

Kommentar von Manfred Gutwald am 11.02.2002 um 11:23

Hallo Profis
Ich suche nach einer Funktion in welcher ich die Parameter für die HÖHE und die BREITE der Combobox gleichzeitig übergeben kann.
Kann mir bitte jemand weiterhelfen
Danke
Manfred

Kommentar von Rob am 27.11.2000 um 08:30

Dieses Beispiel funktioniert bei mir nicht, wenn die Combobox auf einem Frame oder Panel plaziert ist.... Sie verschwindet dann einfach.