|
Eine ComboBox ist leider nicht mit "normalen" Mitteln dazu zu bewegen, sich ohne Rahmen darzustellen. Wenn Sie ihre Appearance-Eigenschaft auf "0 - 2D" setzen, bleibt sie stur dreidimensional. Auch mit dem ansonsten bei vielen Steuerelementen hilfreichen Mittel, per API-Funktionen den Rahmen-Stil des Fensters zu ändern, (siehe beispielsweise "Gerahmte ListBoxen") ist nichts zu erreichen, da die ComboBox ihren Rahmen offensichtlich in eigener Regie zeichnet.
Per API bieten sich allerdings noch weitere Möglichkeiten. Sie können nämlich der ComboBox ihren sichtbaren Darstellungsbereich beschneiden.
Die dazu benötigte API-Technik heißt "Clipping", zu Deutsch in etwa: "Zuschnitt". Jedes Fenster kann in der Regel die Fläche seines Rechtecks nach Belieben selbst bemalen. Die erste und häufigste Abweichung von dieser Regel wendet Windows selber an, um den Darstellungsbereich eines teilweise verdeckten Fensters (oder Steuerelements, das ja auch ein Fenster ist) zu beschneiden, so dass dieses bei der Selbstdarstellung nicht in den Bereich des überdeckenden Fensters hinein malt. Ein solcher beschnittener Bereich wird "Region" genannt. Eine solche Region braucht noch nicht einmal rechteckig zu sein - denken Sie etwa an zwei versetzt mit etwas Abstand zueinander liegende Fenster, die ein drittes, dahinter liegendes Fenster teilweise überdecken. Selbst Fenster mit völlig unregelmäßigen und kurvigen Konturen sind möglich (etwa in Form eines Puzzle-Steines). Solche Regions (ja, es handelt sich hier um den englischsprachigen Begriff, daher diese Form des Plurals) können nach Bedarf erstellt und einem Geräte-Kontext (in dem die API-Zeichenvorgänge stattfinden) zugewiesen werden. Eine Region kann aber auch einem Fenster direkt zugewiesen werden und somit eine absolute, äußere Kontur für das Fenster dauerhaft festlegen.
Doch ehe wir zu weit in die im Detail ziemlich komplexe Materie der Regions einsteigen, besinnen wir uns auf unsere Aufgabe, einer ComboBox den Rahmen wegzunehmen. Für unseren Zweck reicht die zuletzt genannte Anwendung einer Region aus. Das Grundrezept ist einfach: Rundherum zwei Pixel weniger - und die ComboBox zeichnet ihren Rahmen gewissermaßen "ins Leere".
Das Ganze haben wir wie immer in eine Hilfsfunktion verpackt. Ihr übergeben Sie die betreffende ComboBox und im ersten Parameter optional die Angabe, ob die ComboBox einen Rahmen haben soll oder nicht. Lassen Sie den Parameter weg, wird sie rahmenlos. Im zweiten optionalen Parameter (Deflate) können Sie gegebenenfalls einen größeren oder kleineren Beschnitt als die vorgegebenen 2 Pixels verlangen.
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function CreateRectRgnIndirect Lib "gdi32" _
(lpRect As RECT) As Long
Private Declare Function GetClientRect Lib "user32" _
(ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function InflateRect Lib "user32" _
(lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" _
(ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Public Sub ComboBorderless(Combo As ComboBox, _
Optional ByVal Border As Boolean, _
Optional ByVal Deflate As Long = 2)
Dim nRect As RECT
Dim nRgn As Long
With Combo
If Not Border Then
Wenn die ComboBox keinen Rahmen haben soll, ermitteln wir zunächst über die API-Funktion GetClientRect die Abmessungen des Fensters der ComboBox:
GetClientRect .hwnd, nRect
Die API-Funktion InflateRect verkleinert das Rechteck jeweils links und rechts und oben und unten um den gewünschten Betrag:
InflateRect nRect, -Deflate, -Deflate
Nun erstellen wir anhand dieses verkleinerten Rechtecks eine Region
nRgn = CreateRectRgnIndirect(nRect)
und weisen diese dem Fenster der ComboBox zu:
SetWindowRgn .hwnd, nRgn, True
Else
Soll die ComboBox (wieder) einen Rahmen haben, weisen wir ihrem Fenster einfach eine Null-Region zu:
SetWindowRgn .hwnd, 0, True
End If
End With
End Sub
Beachten Sie aber, dass dadurch tatsächlich nur der sichtbare Bereich der ComboBox reduziert wird. Weder die Abmessungen noch die Position des Steuerelements selbst werden verändert! Beim genauen Positionieren der ComboBox müssen Sie daher die optische Verschiebung in der Maßeinheit (ScaleMode) des Containers entsprechend berücksichtigen.
|