Frage

Ich schreibe ein benutzerdefiniertes Verhalten für a ToolStripDropDown Kontrolle.Ich möchte auch das ändern ToolStripDropDownButton selbst, um eine farbige Form anzuzeigen.

Ich sehe, dass ich damit umgehen kann Paint event und zeichne was ich will.Gibt es jedoch eine Möglichkeit, die Schaltfläche den Standardhintergrund malen zu lassen, bevor ich die Form male?Es wäre schwierig, den Hintergrund genau richtig zu machen, insbesondere bei zukünftigen Versionen von .NET und Windows.

In einfachen alten Fenstern könnte ich den Standard-Proc-Handler vor oder nach meinem Malcode aufrufen.Ich sehe keine Möglichkeit, dies in .NET zu erreichen.Oder gibt es eine Möglichkeit, die Schaltfläche anzuweisen, nur den Hintergrund zu malen?

War es hilfreich?

Lösung

Wenn Sie mit dem umgehen Paint Veranstaltung (im Gegensatz zum Überschreiben der OnPaint Methode in einer abgeleiteten Klasse) wird die Basisklasse (Standard-Proc-Handler) bereits aufgerufen.Alles wird wie gewohnt gezeichnet, und dann zeichnen Sie im Wesentlichen obendrein in der Paint Veranstaltung.Das können Sie hier deutlich sehen:

     Lime rectangle drawn over part of the drop-down button, clearly showing the default contents underneath

Der Trick besteht darin, sicherzustellen, dass Sie genügend vom Beschneidungsrechteck des Steuerelements frei lassen Karte das Teil, das du willst.Der e.ClipRectangle eigenschaft ruft die gesamte button's Kundenbereich, also wenn Sie nur
füllen Sie das mit einem Farbfeld, Sie werden auch den Dropdown-Pfeil und den Standardhintergrund verdecken.Die obige Demonstration wurde mit dem folgenden hässlichen Beispielcode erstellt:

private void ToolStripDropDownButton1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(Brushes.Chartreuse,
                             e.ClipRectangle.X + 3, e.ClipRectangle.Y + 3,
                             e.ClipRectangle.Width - 12,
                             e.ClipRectangle.Height - 12);
}

Abgesehen davon glaube ich nicht, dass es eine Möglichkeit gibt, anzupassen, was genau von der Basisklasse gezeichnet wird.Eigentümerzeichnung (zumindest in WinForms) ist in der Regel eine Alles-oder-Nichts-Angelegenheit.Sie erhalten die vollständige Kontrolle,
aber es hat den Preis, dass man alles selbst umsetzen muss.


Natürlich, falls Sie es noch nicht bemerkt haben, die ToolStrip Kontrolle bereits sieht nicht wie ein natives Windows-Steuerelement aus.Und noch schlimmer, es ist immer wird genauso aussehen wie jetzt,
auch in zukünftigen Windows-Versionen, die die Benutzeroberfläche komplett überarbeiten.(Der MenuStrip wird geplagt von
dasselbe Phänomen und der Unterschied sind in Windows Vista / 7 sehr sichtbar, wo sich die Standard-API-Menüs dramatisch geändert haben).Der Grund dafür ist, dass beide Steuerelemente vollständig in C # -Code gezeichnet sind, der in ihren WinForms-Implementierungen geschrieben ist.Persönlich finde ich, dass es lächerlich kitschig aussieht und würde es nicht in einer meiner Anwendungen für eine Wette verwenden.

Sie können weisen Sie einen benutzerdefinierten Renderer zu, der die UXTheme-API verwendet, um die Schaltflächen zu zeichnen, die angezeigt werden viel näher an der Annäherung an das Aussehen der nativen Menüs und Symbolleisten.Eine ziemlich gründliche Probe ist verfügbar hier.Ich habe etwas sehr Ähnliches für die WinForms-Entwicklung geschrieben, das ich durchgeführt habe und das die zusätzlichen Funktionen des erfordert ToolStrip klasse (z. B. Einbettung von Kombinationsfeldern), die von der nicht angeboten werden
alte Schule MainMenu und ToolBar Steuerelemente, die einfach ihre Windows-API-Äquivalente umschließen.Wenn Sie sich für diese Vorgehensweise entscheiden, haben Sie mehr Kontrolle darüber, welche Teile des Basisklassen-Renderers Sie aufrufen möchten, da Sie den Code explizit selbst geschrieben haben.Sehr zu empfehlen, wenn Sie
der Typ, der sich überhaupt um Benutzeroberfläche, natives Gefühl oder Benutzererfahrung kümmert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top