Laden...

[Gewusst wie] ToolStrips: enthaltene ComboBox, TextBox, ProgressBar anpassen

Erstellt von juetho vor 17 Jahren Letzter Beitrag vor 17 Jahren 28.084 Views
J
juetho Themenstarter:in
3.331 Beiträge seit 2006
vor 17 Jahren
[Gewusst wie] ToolStrips: enthaltene ComboBox, TextBox, ProgressBar anpassen

Gewusst wie: für ToolStrips ComboBox, TextBox, ProgressBar anpassen

In diesem Beitrag wird beschrieben, wie für eine ToolStripComboBox das DrawItem-Ereignis genutzt werden kann, obwohl dies laut :rtfm: SDK-Doku nicht existiert. Solche Verfahren sind in gleicher Weise möglich für:*ToolStrip, MenuStrip, StatusStrip *die Elemente ComboBox, TextBox, ProgressBar *Eigenschaften, Methoden und Ereignisse, die es laut Doku für diese Elemente nicht gibt

Bei anderen ToolStrip-Elementen ist der kleine Umweg nicht erforderlich.

Problemstellung: Die Items einer ToolStripComboBox sollen in einer jeweils eigenen Farbe angezeigt werden.

ComboBox-Lösung: Das Control wird als OwnerDrawFixed bzw. OwnerDrawVariable festgelegt; die DrawItem-Methode wird selbst erstellt. Dieses Verfahren wird oft beschrieben, z.B. über die Suche nach ComboBox AND DrawItem oder bei CodeProject.

Nicht möglich: Die "normale" ComboBox-Lösung kann nicht direkt übernommen werden, weil die ToolStripComboBox nicht von ComboBox abgeleitet ist, sondern von ToolStripControlHost und ToolStripItem.

Unpassende Notlösung: Anstelle einer ToolStripComboBox wird eine normale ComboBox in das ToolStrip eingebettet. Dies hat idontwantaname gemacht, aber als ungeeignet beschrieben.

Einfaches und praktisches Verfahren: Die ToolStripComboBox bietet einen public-Zugriff auf die eingebettete ComboBox. Damit stehen deren Eigenschaften und Ereignisse im Designer nur beschränkt zur Verfügung, zur Laufzeit kann sie jedoch problemlos für OwnerDraw(Fixed/Variable) genutzt werden.

1. Registriere die eingebettete ComboBox für die Draw-Methode:

ToolStripComboBox tsBox;
//  im Konstruktor nach InitializeComponents() einfügen:
tsBox.ComboBox.DrawMode = DrawMode.OwnerDrawFixed;
tsBox.ComboBox.DrawItem += new DrawItemEventHandler(tsBox_DrawItem);

2. Die eingebettete ComboBox kann wie jede andere ComboBox selbst gezeichnet werden:

private void tsBox_DrawItem(object sender, DrawItemEventArgs e)
{
    //  der folgende Code wurde im Prinzip übernommen von:
    //  Managed Font Combobox by Martin Cook
    //  [URL]http://www.codeproject.com/cs/miscctrl/CGFontCombo.asp[/URL]

    // If the index is invalid then simply exit.
    if (e.Index < 0 || e.Index >= boxFontColor.Items.Count)
        return;

    e.DrawBackground();

    // Should we draw the focus rectangle?
    if ((e.State & DrawItemState.Focus) != 0)
        e.DrawFocusRectangle();

    // zeichne den Inhalt wie unter den gegebenen Umständen gewünscht
    Brush b = null;
    string colorName = (string)boxFontColor.Items[e.Index];
    // Create a new background brush.
    if (e.Index == 0)
        b = new SolidBrush(Color.Black);
    else
        b = new SolidBrush(Color.FromName(colorName));

    // Draw the item.
    e.Graphics.DrawString(colorName, e.Font, b, e.Bounds);
}

Für die anderen oben genannten ToolStripItems habe ich das Verfahren (noch) nicht genutzt. Ich wüsste aber keinen Grund, warum es nicht klappen sollte. Wer es ausprobiert hat, kann sich hier oder über eine persönliche Nachricht melden.

Viel Erfolg! Jürgen

Nachtrag 1: ActiveControl kann auf diese Weise ebenfalls gesetzt werden, z.B. (selbst getestet):

this.ActiveControl = toolStripTextBox1.TextBox;