【发布时间】:2012-03-04 20:12:33
【问题描述】:
如何更改 Windows 应用程序菜单的 Hover(鼠标悬停)颜色?
C# 中的任何方法?
或
有什么方法可以使用 Windows API (DllImport) 吗?
看图:
【问题讨论】:
如何更改 Windows 应用程序菜单的 Hover(鼠标悬停)颜色?
C# 中的任何方法?
或
有什么方法可以使用 Windows API (DllImport) 吗?
看图:
【问题讨论】:
您正在使用 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 的其他属性控制其他颜色元素。
【讨论】:
我有类似的问题,我浏览了许多文章、许多论坛,但没有找到我问题的完美答案。我不仅遇到了下拉菜单元素悬停的问题,还有背景和整体布局以及如何以编程方式添加子元素的问题。然后我发现如何在 Stackoverflow 论坛中轻松自定义 MenuStrip,但我仍然遇到下拉菜单的问题。然后我自己发现 ContextMenuStip 具有实现目标的属性。很容易将任何 MenuStrip 添加为 ContextMenuStrip 作为下拉菜单。哦,是的:这样做的美妙之处在于您不需要使用任何特殊组件。
所以,步骤如下:
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);
在我的情况下,结果如下:
这可能对其他人有用。谢谢阅读!快乐编码! :)
【讨论】:
要更改鼠标悬停边框颜色(在项目上),请使用:
public override Color MenuItemBorder
{
get { return Color.Green; }
}
【讨论】:
你也可以让它透明(不可见):
get { return Color.Transparent; }
【讨论】: