ContextMenuStrip, ToolStripProfessionalRenderer und ProfessionalColorTable
Frank Dzaebel, erstellt am: 27.3.2006, zuletzt geändert: 27.3.2006
Kategorie: Windows Forms, .NET-Version: 2.0
Man kann das Kontext-Menü (allgemeiner ToolStrips) unter .NET 2.0 sehr differenziert beeinflussen. Es ist nur eine korrekte Ableitung der Klassen ContextMenuStrip, ToolStripProfessionalRenderer und ProfessionalColorTable notwendig. Hier ein Beispiel:

Fügen Sie folgenden ContextMenuStrip in die leere Form1 hinzu:

Weitere Literatur:
MSDN: Gewusst wie: Erstellen eines professionellen ToolStrip-Steuerelements
MSDN: Gewusst wie: Festlegen des ToolStrip-Renderers zur Laufzeit
MSDN: Übersicht über das ToolStrip-Steuerelement (Windows Forms)
MSDN: Architektur des ToolStrip-Steuerelements
using System.Windows.Forms;
using System;
using System.Drawing;
namespace ContextMenuRender
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender,EventArgs e)
{
MyColorTable pct = new MyColorTable();
contextMenuStrip1.Renderer = new MyTSPRenderer(pct);
this.ContextMenuStrip = contextMenuStrip1;
}
}
class MyTSPRenderer : ToolStripProfessionalRenderer
{
public MyTSPRenderer(ProfessionalColorTable pct) : base(pct) { }
//protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
//{
// e.Item.BackColor = Color.White;
// base.OnRenderMenuItemBackground(e);
//}
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
{
//// Text-Farbe für ausgewählte und nicht ausgewählte Einträge
if (e.Item.Selected) e.TextColor = Color.White;
else e.TextColor = Color.Black;
//******* Farbwechsel würde nicht klappen ************
//******* Hier also wie unten "MenuItemSelected" benutzen!
// if (e.Item.Selected) e.Item.BackColor = Color.SteelBlue; // else e.Item.BackColor = Color.White;
e.Item.BackColor = Color.White;
//*********************************************
//e.Graphics.DrawImage(..., ...);
e.TextFormat = TextFormatFlags.VerticalCenter | TextFormatFlags.Right;
e.TextRectangle = new Rectangle(e.Item.Bounds.X + 70,
e.Item.ContentRectangle.Y - 2,(int)e.Graphics.MeasureString(e.Text,e.TextFont).Width,22);
base.OnRenderItemText(e);
}
}
class MyColorTable : ProfessionalColorTable // Beispiel
{
public override Color MenuItemSelected
{
get { return Color.Blue; }
}
}
}