如何用ToolStripProfessionalRenderer自定义WinForms菜单边框颜色?
自定义WinForms菜单边框(ToolStripProfessionalRenderer)

我使用ToolStripProfessionalRenderer实现了自定义WinForms菜单,现希望自定义菜单边框以适配当前样式。当前显示的是WinForms默认边框颜色,因黑色背景显得更浅。菜单背景为常规颜色时,首个菜单项和子项的背景色与边框色一致,上边框不可见;但我将菜单背景改为黑色后,需至少把上边框颜色改为黑色。我曾尝试设置单个菜单项背景色解决,却发现下拉菜单边框不属于单个菜单项,请问该如何实现?
解决方法
下拉菜单的边框由ToolStripProfessionalRenderer统一绘制,不属于单个菜单项,因此需要重写渲染器的边框绘制方法来实现自定义。
1. 创建自定义渲染器类
继承ToolStripProfessionalRenderer,重写OnRenderToolStripBorder方法,针对性处理下拉菜单的边框绘制逻辑:
public class CustomMenuRenderer : ToolStripProfessionalRenderer { protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) { // 仅对下拉菜单控件处理边框 if (e.ToolStrip is ToolStripDropDown dropDown) { // 自定义边框颜色为黑色 using (Pen borderPen = new Pen(Color.Black)) { // 绘制完整边框,若仅需上边框则替换为DrawLine e.Graphics.DrawRectangle(borderPen, 0, 0, dropDown.Width - 1, dropDown.Height - 1); } } else { // 其他ToolStrip控件保留默认渲染逻辑 base.OnRenderToolStripBorder(e); } } // 若需统一设置黑色背景,可重写背景渲染方法 protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) { if (e.ToolStrip is ToolStripDropDown) { using (SolidBrush bgBrush = new SolidBrush(Color.Black)) { e.Graphics.FillRectangle(bgBrush, e.AffectedBounds); } } else { base.OnRenderToolStripBackground(e); } } }
2. 为菜单控件应用自定义渲染器
在窗体初始化时,将菜单的渲染器替换为自定义类:
public YourForm() { InitializeComponent(); // 给主菜单设置自定义渲染器 menuStrip1.Renderer = new CustomMenuRenderer(); // 上下文菜单同样需要设置 contextMenuStrip1.Renderer = new CustomMenuRenderer(); }
可选:仅修改上边框
如果只需要调整上边框颜色,可将DrawRectangle替换为单一线条绘制:
e.Graphics.DrawLine(borderPen, 0, 0, dropDown.Width - 1, 0);
内容的提问来源于stack exchange,提问作者Roberto D V Leonardo
相关产品推荐
相关产品推荐

