如何删除 MenuStrip 控件下绘制的白线?

问题描述 投票:0回答:3

我读了一些其他文章,了解人们如何自定义 MenuStrip 的颜色和渐变。

我想要做的是删除渐变,以便 MenuStrip 与表单的其余部分具有相同的颜色,对我来说,这是创建新 WinForms 项目时使用的默认设置。我尝试将

RenderMode
更改为“系统”,它可以正常工作,但是当我构建并运行它时,它会留下一条与 MenuStrip 的长度相同的白线。我必须做一些绘画吗?或者有更简单的方法吗?

c# .net winforms gradient menustrip
3个回答
9
投票

这与这个one

基本上是同一个问题

答案引用了这个 Microsoft bug post

这似乎是从 2005 年开始就存在的问题。虽然评论说这是一个 MS 错误,不会被修复,但有一个解决方法,涉及实现你自己的渲染器:

public class MySR : ToolStripSystemRenderer
{
    public MySR()
    {
    }

    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
    {
        //base.OnRenderToolStripBorder(e);
    }
}

然后您所要做的就是将菜单条的渲染器设置为您刚刚实现的渲染器:

menustrip1.Renderer = new MySR();

我刚刚尝试了一下,看起来效果很好。


3
投票

我同意 Yetti 的观点,但如果你想维持你的边界,你可以尝试这个。将画笔替换为您的背景颜色

protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
  base.OnRenderToolStripBorder(e);
  e.Graphics.FillRectangle(Brushes.Black, e.ConnectedArea);
}

0
投票

@Yetti 的答案是正确的,但有一个小问题。它还删除了菜单下拉部分(单击某个项目时打开的菜单)的边框。为了避免这种情况,请在 OnRenderToolStripBorder 中执行以下操作:

public class MySR : ToolStripSystemRenderer
{
    public MySR()
    {
    }
    
    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
    {
        if (e.AffectedBounds == e.ToolStrip.Bounds) return;
        base.OnRenderToolStripBorder(e);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.