ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 15.11.2002

Diese Seite wurde zuletzt aktualisiert am 15.11.2002
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Ungerahmte ComboBox

Zurück...


Anzeige

(-hg) mailto:hg_comboborderless@aboutvb.de

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.

ComboBox wahlweise mit oder ohne 3-D-Rahmen

ComboBox wahlweise mit oder ohne 3-D-Rahmen

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.


Beispiel-Projekt und Modul modComboBorderless (comboborderless.zip - ca. 3 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer