head.WriteLine()

Dienstag, April 04, 2006

VisualStyles und VisualStylesRenderer, Teil 3

Wie ich in Teil 2 beschrieben habe, funktioniert die VisualStyles API nur unter diesen Voraussetzungen:

  • Visual Styles sind in Windows aktiviert
  • Visual Styles sind in der Anwendung aktiviert
  • Der aktive Theme unterstützt das zu zeichnende Element

Doch wie male ich denn nun meine Oberfläche, wenn die Visual Styles deaktiviert wurden? Die Antwort ist einfach: So wie vorher. Dies bedeutet, ich muss entweder ControlPaint verwenden oder die Oberfläche mit GDI+ selbst zeichnen. Dies könnte im Falle eines Buttons zum Beispiel so aussehen:

ControlPaint.DrawButton(
    e.Graphics,
    new Rectangle(10, 10, 60, 40),
    ButtonState.Normal);

Es gibt jedoch eine Alternative: Für Standardelemente, wie Buttons und Check Boxen bietet das Framework vorgefertigte Renderer. Diese prüfen vor dem Zeichnen, ob Visual Styles aktiviert sind. Ist dies nicht so, verwenden Sie ControlPaint und GDI+-Methoden.

Um nun beispielsweise den oben gezeigten Button zu zeichnen, könnte ich auch wie folgt vorgehen:

ButtonRenderer.DrawButton(
    e.Graphics,
    new Rectangle(10, 10, 60, 40),
    PushButtonState.Normal);

Bei etwas komplexeren Controls müssen ggf. mehrere Methoden für die einzelnen Bestandteile der Oberfläche aufgerufen werden. In folgendem Beispiel wird eine Combo Box gezeichnet:

ComboBoxRenderer.DrawTextBox(
    e.Graphics,
    new Rectangle(10, 10, 130, 20),
    ComboBoxState.Normal);

ComboBoxRenderer.DrawDropDownButton(
    e.Graphics,
    new Rectangle(121, 11, 18, 18),
    ComboBoxState.Normal);

Die Renderer hilft hierbei nicht nur bei Berücksichtigung der Themes, sondern erleichtert vor allem das Zeichnen. Hierbei müssen nämlich einige Systemwerte, wie beispielsweise die im Betriebssystem eingestellte Fontgröße berücksichtigt werden. Die folgenden Renderer stehen standardmäßig zu Verfügung:

  • ButtonRenderer
  • CheckBoxRenderer
  • ComboBoxRenderer
  • GroupBoxRenderer
  • ProgressBarRenderer
  • RadioButtonRenderer
  • ScrollBarRenderer
  • TabRenderer
  • TextBoxRenderer
  • ToolStripRenderer
  • ToolStripSystemRenderer
  • ToolStripProfessionalRenderer
  • TrackBarRenderer
  • TextRenderer

Es gibt jedoch auch einen Haken: Nicht alle Renderer können auch bei deaktivierten Visual Styles verwendet werden. So löst beispielsweise der ComboBoxRenderer bei dem Versuch eine Exception aus. Allerdings bietet diese Klassen über die IsSupported-Eigenschaft die Möglichkeit dies zu prüfen.

Systemeinstellungen ermitteln
In manchen Fällen muss das Zeichnen der Oberfläche also auch weiterhin von Hand erfolgen. Hierbei sollten – wie bereits erwähnt - bestimmte Systemeinstellungen berücksichtigt werden. So kann beispielsweise die Höhe der Titelleiste je nach Konfiguration variieren.

Das Ermitteln solcher Informationen ist jedoch recht einfach über die SystemInformation-Klasse möglich. Sie bildet eine Reihe von Betriebssystemeinstellungen über statische Eigenschaften ab. Hier eine kleine Auswahl:

  • SystemInformation.CaptionHeight
  • SystemInformation.CaptionButtonSize
  • SystemInformation.FrameBorderSize
  • SystemInformation.IconSize
  • SystemInformation.IsFontSmoothingEnabled

1 Comments:

Kommentar veröffentlichen

<< Home