myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Knowledge Base (https://www.mycsharp.de/wbb2/board.php?boardid=68)
-- Artikel (https://www.mycsharp.de/wbb2/board.php?boardid=69)
--- [Gewusst wie] ToolStrips: enthaltene ComboBox, TextBox, ProgressBar anpassen (https://www.mycsharp.de/wbb2/thread.php?threadid=33657)


Geschrieben von juetho am 13.03.2007 um 12:32:
  [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 Bitte schau in die SDK-/MSDN-Doku SDK-Doku nicht existiert. Solche Verfahren sind in gleicher Weise möglich für: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:

C#-Code:
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:


C#-Code:
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):

C#-Code:
this.ActiveControl = toolStripTextBox1.TextBox;


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 17.11.2019 16:01