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 ContextMenuStripToolStripProfessionalRenderer 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; } } } }