Search code examples
c#.netwinformstoolstripmenustrip

Prevent showing border of a disabled menu item on mouse hover


When I hover over a ToolStripMenuItem, it shows a border around it even when it is disabled. Is there any property to remove this?

I've looked for properties like Hover or Border but haven't found anything of use.


Solution

  • ToolStripProfessionalRenderer draws the border by default using MenuItemBorder property of ProfessionalColorTable.

    To make the border just visible for enabled menu items, you can create your custom ProfessionalColorTable and your custom ToolStripProfessionalRenderer and add a new MenuItemEnabledBorder returning the default border color, and also overriding MenuItemBorder to return Color.Transparent.

    Then in your custom renderer, it's enough to override OnRenderMenuItemBackground and draw the border using MenuItemEnabledBorder when the item is highlighetd.

    Code

    public class MyColorTable : ProfessionalColorTable
    {
        public override Color MenuItemBorder { get { return Color.Transparent; } }
        public Color MenuItemEnabledBorder { get { return base.MenuItemBorder; } }
    }
    
    public class MyRenderer : ToolStripProfessionalRenderer
    {
        public MyRenderer() : base(new MyColorTable()) { }
        protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
        {
            base.OnRenderMenuItemBackground(e);
            if (e.Item.Enabled && e.Item.Selected)
            {
                using (var pen = new Pen(((MyColorTable)ColorTable).MenuItemEnabledBorder))
                {
                    var r = new Rectangle(2, 0, e.Item.Width - 4, e.Item.Height - 1);
                    e.Graphics.DrawRectangle(pen, r);
                }
            }
        }
    }
    

    Then to use the renderer, it's enough to set it as renderer of your tool strip:

    this.toolStrip1.Renderer = new MyRenderer();
    

    enter image description here