2

I am programming a Backup Tool. On top of my tool I have a menustrip containing two toolstripmenuitems. I changed the colors a little bit to my expectations. Not focused the menu looks great:

Unclicked Menu Item

When I now click on the menu item "File" to open the context menu, the color changes to white and I am not able to read the text anymore:

Clicked Menu Item

Can anyone please tell me where I can change that behavior? I use Visual Studio 2013 Ultimate, Windows Forms Application, Code is in C#.

Here is the code:

// // initializing menuStrip1 // this.menuStrip1.BackColor = System.Drawing.Color.MediumBlue; this.menuStrip1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; this.menuStrip1.Font = new System.Drawing.Font("Segoe UI Semilight", 15.75F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem, this.helpToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.MinimumSize = new System.Drawing.Size(0, 40); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(1056, 40); this.menuStrip1.TabIndex = 77; this.menuStrip1.Text = "menuStrip1"; // // initializing fileToolStripMenuItem and adding to menuStrip1 // this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.saveToolStripMenuItem, this.saveAsToolStripMenuItem, this.loadToolStripMenuItem}); this.fileToolStripMenuItem.Font = new System.Drawing.Font("Calibri Light", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.fileToolStripMenuItem.ForeColor = System.Drawing.SystemColors.ControlLightLight; this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; this.fileToolStripMenuItem.Size = new System.Drawing.Size(54, 36); this.fileToolStripMenuItem.Text = "File"; this.fileToolStripMenuItem.Click += new System.EventHandler (this.fileToolStripMenuItem_Click); // // initializing saveToolStripMenuItem and adding to fileToolStripMenuItem // this.saveToolStripMenuItem.BackColor = System.Drawing.Color.MediumBlue; this.saveToolStripMenuItem.ForeColor = System.Drawing.SystemColors.ControlLightLight; this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; this.saveToolStripMenuItem.Size = new System.Drawing.Size(166, 30); this.saveToolStripMenuItem.Text = "Save"; this.saveToolStripMenuItem.Click += new System.EventHandler (this.saveToolStripMenuItem_Click);
//

schmelzer-daniel
  • 23
  • 1
  • 1
  • 4

2 Answers2

15

You can create your own ProfessionalColorTable and override it's properties:

namespace WindowsFormsApplication1
{
     public partial class Form1 : Form
     {
         public Form1()
         {
             InitializeComponent();
             menuStrip1.Renderer = new ToolStripProfessionalRenderer(new MyColorTable());
         }
     }

     public class MyColorTable : ProfessionalColorTable
     {
         public override Color ToolStripDropDownBackground
         {
             get
             {
                 return Color.Blue;
             }
         }

         public override Color ImageMarginGradientBegin
         {
             get
             {
                 return Color.Blue;
             }
         }

         public override Color ImageMarginGradientMiddle
         {
             get
             {
                 return Color.Blue;
             }
         }

         public override Color ImageMarginGradientEnd
         {
             get
             {
                 return Color.Blue;
             }
         }

         public override Color MenuBorder
         {
             get
             {
                 return Color.Black;
             }
         }

         public override Color MenuItemBorder
         {
             get
             {
                 return Color.Black;
             }
         }

         public override Color MenuItemSelected
         {
             get
             {
                 return Color.Navy;
             }
         }

         public override Color MenuStripGradientBegin
         {
             get
             {
                 return Color.Blue;
             }
         }

         public override Color MenuStripGradientEnd
         {
             get
             {
                 return Color.Blue;
             }
         }

         public override Color MenuItemSelectedGradientBegin
         {
             get
             {
                 return Color.Navy;
             }
         }

         public override Color MenuItemSelectedGradientEnd
         {
             get
             {
                 return Color.Navy;
             }
         }

         public override Color MenuItemPressedGradientBegin
         {
             get
             {
                 return Color.Blue;
             }
         }

         public override Color MenuItemPressedGradientEnd
         {
             get
             {
                 return Color.Blue;
             }
         }
     }
}

This is result of code above:

Custom menu

Paviel Kraskoŭski
  • 1,429
  • 9
  • 16
4

By default this feature is not available out of the box. You need to create a custom Renderer for you tool strip to achieve this.

Create a class that inherits from ToolStripProfessionalRenderer -

    private class BlueRenderer : ToolStripProfessionalRenderer
    {
        protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
        {
            Rectangle rc = new Rectangle(Point.Empty, e.Item.Size);
            Color c = Color.MediumBlue;
            using (SolidBrush brush = new SolidBrush(c))
                e.Graphics.FillRectangle(brush, rc);
        }
    }

And attach this renderer to your menu strip in your form constructor -

    public Form1()
    {
        InitializeComponent();
        menuStrip1.Renderer = new BlueRenderer();
    }
Yogi
  • 9,174
  • 2
  • 46
  • 61
  • Haha, works fine, thank you very much! Funny that you can change all colors by default but not that specific one... Microsoft logic?! – schmelzer-daniel Apr 21 '16 at 11:47
  • One further question. Now the Color is MediumBlue for all states. Can I have LightBlue when I clicked the item in menuStrip1? – schmelzer-daniel Apr 21 '16 at 11:49
  • 1
    @schmelzer-daniel - Just define your clocr like this: `Color c = e.Item.Selected ? Color.LightBlue : Color.MediumBlue; ` – Yogi Apr 21 '16 at 11:52