head.WriteLine()

Dienstag, April 04, 2006

VisualStyles und VisualStylesRenderer, Teil 2

Wie in Teil 1 beschrieben, können die Klassen VisualStyles und VisualStylesRenderer verwendet werden, um grafische Standardelemente im aktuellen Theme zu zeichnen. Doch was passiert eigentlich, wenn der Code unter Windows 2000 läuft, oder die Visual Styles deaktiviert wurden? Die Antwort ist einfach: Es kommt zu einer Exception.

Um zu prüfen, ob Visual Styles verfügbar sind, können Sie die IsSupported-Eigenschaft der VisualStylesRenderer-Klasse abfragen.

if (VisualStylesRenderer.IsSupported)
{
    ...
}

Jetzt kann es aber auch sein, dass die Anwendung, in der das eigene Control läuft, die Visual Styles abgeschaltet hat. Bekanntlich kann dies ja über Application.EnableVisualStyles() gesteuert werden. Das Control kann nun über

Application.RenderWithVisualStyles

abfragen, ob die Anwendung Visual Styles unterstützt. Darüber hinaus kann über Application.VisualStyleState auch noch festgestellt werden, für welche Bereiche die Visual Styles aktiviert wurden (Client-/NonClient-Area).

Kommen wir zum nächsten Problem: Manche Themes unterstützten nicht den vollständigen Satz an Windows-Elementen. Daher sollte vor dem Rendern eines Elements explizit geprüft werden, ob dieses vom aktiven Theme unterstützt wird. Und dies geschieht über

VisualStylesRenderer.IsElementDefined

Die vollständige Prüfung könnte somit wie folgt aussehen:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    if (VisualStyleRenderer.IsSupported &&
        Application.RenderWithVisualStyles)
    {
        if (VisualStyleRenderer.IsElementDefined(VisualStyleElement.Button.PushButton.Normal))
        {
            VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Button.PushButton.Normal);
            renderer.DrawBackground(
                e.Graphics,
                new Rectangle(100, 100, 100, 100));
        }
    }
}

Doch wie male ich denn eigentlich meine Oberfläche, wenn die Visual Styles deaktiviert wurden? Dies erfahren Sie im 3 Teil.