【问题标题】:How to change menu hover color如何更改菜单悬停颜色
【发布时间】:2012-03-04 20:12:33
【问题描述】:

如何更改 Windows 应用程序菜单的 Hover(鼠标悬停)颜色?

C# 中的任何方法?

有什么方法可以使用 Windows API (DllImport) 吗?

看图:

【问题讨论】:

    标签: c# winforms winapi


    【解决方案1】:

    您正在使用 MenuStrip 类。您可以覆盖其渲染器。这是一个示例,请选择您自己的颜色。

    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            menuStrip1.Renderer = new MyRenderer();
        }
    
        private class MyRenderer : ToolStripProfessionalRenderer {
            public MyRenderer() : base(new MyColors()) {}
        }
    
        private class MyColors : ProfessionalColorTable {
            public override Color MenuItemSelected {
                get { return Color.Yellow; }
            }
            public override Color MenuItemSelectedGradientBegin {
                get { return Color.Orange; }
            }
            public override Color MenuItemSelectedGradientEnd {
                get { return Color.Yellow; }
            }
        }
    }
    

    ProfessionalColorTable 的其他属性控制其他颜色元素。

    【讨论】:

      【解决方案2】:

      我有类似的问题,我浏览了许多文章、许多论坛,但没有找到我问题的完美答案。我不仅遇到了下拉菜单元素悬停的问题,还有背景和整体布局以及如何以编程方式添加子元素的问题。然后我发现如何在 Stackoverflow 论坛中轻松自定义 MenuStrip,但我仍然遇到下拉菜单的问题。然后我自己发现 ContextMenuStip 具有实现目标的属性。很容易将任何 MenuStrip 添加为 ContextMenuStrip 作为下拉菜单。哦,是的:这样做的美妙之处在于您不需要使用任何特殊组件。

      所以,步骤如下:

      1. 您需要有一个颜色表。
      2. 您必须在 MenuStrip 上使用它。
      3. MenuStrip 上的 ToolStripMenuItems 必须有一个 ContextMenuStrip 作为 DropDown。
      4. 通过 ToolStripMenuItems.Items[?].DropDownItems 函数,您可以轻松操作显示为下拉元素的子元素。

      1.- 颜色表:

          public class submenuColorTable : ProfessionalColorTable
          {
              public override Color MenuItemSelected
              {
                  get { return ColorTranslator.FromHtml("#302E2D"); }
              }
      
              public override Color MenuItemBorder
              {
                  get { return Color.Silver; }
              }
      
              public override Color ToolStripDropDownBackground
              {
                  get { return ColorTranslator.FromHtml("#21201F"); }
              }
      
              public override Color ToolStripContentPanelGradientBegin
              {
                  get { return ColorTranslator.FromHtml("#21201F"); }
              }
          }
      
          public class LeftMenuColorTable : ProfessionalColorTable
          {
              public override Color MenuItemBorder
              {
                  get { return ColorTranslator.FromHtml("#BAB9B9"); }
              }
      
              public override Color MenuBorder  //added for changing the menu border
              {
                  get { return Color.Silver; }
              }
      
              public override Color MenuItemPressedGradientBegin
              {
                  get { return ColorTranslator.FromHtml("#4C4A48"); }
              }
              public override Color MenuItemPressedGradientEnd
              {
                  get { return ColorTranslator.FromHtml("#5F5D5B"); }
              }            
      
              public override Color ToolStripBorder
              {
                  get { return ColorTranslator.FromHtml("#4C4A48"); }
              }
      
              public override Color MenuItemSelectedGradientBegin
              {
                  get { return ColorTranslator.FromHtml("#4C4A48"); }
              }
      
              public override Color MenuItemSelectedGradientEnd
              {
                  get { return ColorTranslator.FromHtml("#5F5D5B"); }
              }
      
              public override Color ToolStripDropDownBackground
              {
                  get { return ColorTranslator.FromHtml("#404040"); }
              }
      
              public override Color ToolStripGradientBegin
              {
                  get { return ColorTranslator.FromHtml("#404040"); }
              }
      
              public override Color ToolStripGradientEnd
              {
                  get { return ColorTranslator.FromHtml("#404040"); }
              }
      
              public override Color ToolStripGradientMiddle
              {
                  get { return ColorTranslator.FromHtml("#404040"); }
              }
          }
      

      2.- 在 MenuStrip 上使用它:

      menuStrip.Renderer = new ToolStripProfessionalRenderer(new LeftMenuColorTable());
      

      3.- 以编程方式将 ContextMenuStrip 添加到菜单元素

              ContextMenuStrip CMS = new ContextMenuStrip()
              {
                  Renderer = new ToolStripProfessionalRenderer(new submenuColorTable()),
                  ShowImageMargin = false
              };
      
              ToolStripMenuItem TSMI = new ToolStripMenuItem("Button name")
              {
                  BackColor = sampleMenuItem.BackColor,
                  ForeColor = sampleMenuItem.ForeColor,
                  Font = sampleMenuItem.Font,
                  Margin = sampleMenuItem.Margin,
                  Padding = sampleMenuItem.Padding,
                  Size = sampleMenuItem.Size,
                  TextAlign = sampleMenuItem.TextAlign,
                  DropDown = CMS 
              };
      
              menuStrip.Items.Add(TSMI);
      

      4.- 操作子元素

      您可以在此处操作(例如:添加)下拉菜单的元素。颜色,大小和其他属性只是以这种方式用于测试。您可以使用常量或不同的值。 (“i”是要添加子条目的菜单按钮索引)

              ToolStripMenuItem newItem = new ToolStripMenuItem("Button Name", null, ToolStripMenuItem_Click)
              {
                  Text = "Button Name",
                  BackColor = toolStripMenuItem01.BackColor,
                  ForeColor = toolStripMenuItem01.ForeColor,
                  Font = toolStripMenuItem01.Font,
                  Margin = toolStripMenuItem01.Margin,
                  Padding = toolStripMenuItem01.Padding,
                  Size = toolStripMenuItem01.Size
              };
      
              ((ToolStripMenuItem)menuStrip.Items[i]).DropDownItems.Add(newItem);
      

      在我的情况下,结果如下:

      这可能对其他人有用。谢谢阅读!快乐编码! :)

      【讨论】:

        【解决方案3】:

        要更改鼠标悬停边框颜色(在项目上),请使用:

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

        【讨论】:

        • 这部分很关键。谢谢
        【解决方案4】:

        你也可以让它透明(不可见):

        get { return Color.Transparent; }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-18
          • 2018-02-14
          • 2022-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多