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
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:
C#-Code: |
ToolStripComboBox tsBox;
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)
{
if (e.Index < 0 || e.Index >= boxFontColor.Items.Count)
return;
e.DrawBackground();
if ((e.State & DrawItemState.Focus) != 0)
e.DrawFocusRectangle();
Brush b = null;
string colorName = (string)boxFontColor.Items[e.Index];
if (e.Index == 0)
b = new SolidBrush(Color.Black);
else
b = new SolidBrush(Color.FromName(colorName));
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;
|