|
Visual Basic verwehrt Ihnen die Möglichkeit, die Höhe einer ComboBox bzw. die Höhe des Eingabefeldes zu ändern - sie ist immer abhängig von der gewählten Schriftgröße. Allerdings lässt sich die Höhe zur Laufzeit über die Nachricht CB_SETITEMHEIGHT und die API-Funktion SendMessage setzen.
Am besten verpacken Sie den Aufruf in eine Hilfs-Funktion (ComboHeight). Sie können dann ein paar weitere Kleinigkeiten gleich mit erledigen und erhalten die vorhergehende Höhe als Rückgabewert, so dass Sie später die ursprüngliche Höhe jederzeit wieder herstellen können.
Sie übergeben im ersten Parameter die betreffende ComboBox und im zweiten Parameter die gewünschte Höhe. Im weiteren optionalen Parameter ScaleMode können Sie angeben, welche Maßeinheit für die Höhenangabe gelten soll. Wenn Sie die Voreinstellung -1 belassen, wird versucht, über die ScaleMode-Einstellung des Containers zu ermitteln. Sollte dies fehlschlagen, werden TWIPS angenommen.
In jedem Fall muss die Höhenangabe in Pixels umgerechnet werden. Sollte das Parent-Objekt der ComboBox nicht über die dazu benötigte ScaleY-Methode verfügen, wird für den Fall, dass Sie in ScaleMode explizit Pixels (Konstante vbPixels) gewünscht haben sollten, der Wert im Parameter Height als bereits in Pixels vorliegend betrachtet und verwendet. Anderenfalls wird von der VB-Standard-Maßeinheit TWIPS ausgegangen.
Da sich die an die Funktion SendMessage zu übergebende Höhe direkt auf die Höhe des Eingabefeldes ohne den Rahmen der ComboBox bezieht, ist von der zuvor errechneten Pixelhöhe noch die Differenz abzuziehen. Um den Betrag dieser Differenz zu ermitteln, muss zunächst die tatsächliche Höhe der ComboBox ermittelt werden.
Dazu werden vor der Änderung durch einen Aufruf von SendMessage mit der Nachricht CB_GETITEMHEIGHT die Höhe des Eingabefeldes und mittels der API-Funktion GetWindowRect das Rechteck der ComboBox ermittelt. Die Höhe der ComboBox in Pixels ergibt sich aus der Differenz der Elemente Bottom und Top des Rechtecks. Die abzuziehende Differenz zur Setzung der Höhe des Eingabefeldes ergibt sich dann aus der Differenz der ermittelten Eingabefeldhöhe und der Höhe der ComboBox.
Damit Sie die Höhe der ComboBox gegebenenfalls wieder auf die ursprüngliche Höhe zurück setzen können, gibt die Funktion ComboHeight die zu Beginn ermittelte Höhe zurück - wieder dem ScaleMode entsprechend umgerechnet.
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 SendMessageLong Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Public Function ComboHeight(Combo As ComboBox, _
ByVal Height As Single, Optional ByVal ScaleMode = -1) _
As Single
Dim nHeight As Long
Dim nScaleMode As Integer
Dim nHeightDiff As Long
Dim nRect As RECT
Dim nOldHeight As Long
Dim nOldComboHeight As Long
Const CB_GETITEMHEIGHT = &H154
Const CB_SETITEMHEIGHT = &H153
With Combo
GetWindowRect .hwnd, nRect
nOldHeight = SendMessageLong(.hwnd, CB_GETITEMHEIGHT, -1, 0)
nOldComboHeight = nRect.Bottom - nRect.Top
nHeightDiff = nOldComboHeight - nOldHeight
If ScaleMode = -1 Then
On Error Resume Next
nScaleMode = .Container.ScaleMode
If Err.Number Then
nScaleMode = vbTwips
End If
On Error GoTo 0
Else
nScaleMode = ScaleMode
End If
On Error Resume Next
nHeight = .Parent.ScaleY(Height, nScaleMode, vbPixels)
If Err.Number Then
If ScaleMode = vbPixels Then
nHeight = Height
ComboHeight = nOldComboHeight
Else
nHeight = Height \ Screen.TwipsPerPixelY
ComboHeight = nOldComboHeight * Screen.TwipsPerPixelY
End If
Else
ComboHeight = _
.Parent.ScaleY(nOldComboHeight, vbPixels, nScaleMode)
End If
On Error GoTo 0
SendMessageLong .hwnd, CB_SETITEMHEIGHT, -1, _
nHeight - nHeightDiff
End With
End Function
|