C# MenuStrip面板视觉异常

标签 c# winforms menuitem menustrip

我正在为菜单条着色以匹配我的应用程序主题。然而,每次我尝试它时,我都会在面板分隔符(白色矩形)的左侧看到这种奇怪的视觉异常,复选框的位置也有一些奇怪的位置(可能相关?)。

造成这种情况的原因是什么?如何消除它?

谢谢

Menu Strip Issue

enter image description here

示例代码:

private Color MainColor = Color.FromArgb(39, 40, 34);

public class MenuStripRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
    {
        Rectangle rect = new Rectangle(Point.Empty, e.Item.Size);

        if (e.Item.Selected)
        {
            Color color = Color.FromArgb(24, 25, 19);
            using (SolidBrush brush = new SolidBrush(color))
                e.Graphics.FillRectangle(brush, rect);
        }
        else
        {
            using (SolidBrush brush = new SolidBrush(MainColor))
                e.Graphics.FillRectangle(brush, rect);
        }
    }

    protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
    {
        e.Item.ForeColor = Color.White;
        base.OnRenderItemText(e);
    }

    protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
    {
        base.OnRenderSeparator(e);
    }

    public MenuStripRenderer() : base(new MenuStripColors()) { }
}

public class MenuStripColors : ProfessionalColorTable
{
    public override Color ToolStripDropDownBackground
    {
        get { return MainColor; }
    }

    public override Color ToolStripContentPanelGradientBegin
    {
        get { return MainColor; }
    }

    public override Color ToolStripContentPanelGradientEnd
    {
        get { return MainColor; }
    }

    public override Color MenuItemSelected
    {
        get { return MainColor; }
    }

    public override Color MenuItemBorder
    {
        get { return MainColor; }
    }

    public override Color MenuItemSelectedGradientBegin
    {
        get { return MainColor; }
    }

    public override Color MenuItemSelectedGradientEnd
    {
        get { return MainColor; }
    }

    public override Color MenuBorder
    {
        get { return MainColor; }
    }
}

// In the forms Load()
this.menuStrip1.Renderer = new MenuStripRenderer();
this.menuStrip1.BackColor = MainColor;
this.menuStrip1.ForeColor = Color.White;

最佳答案

我相信您也必须覆盖 ImageMargin 绘图:

protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) {
  //base.OnRenderImageMargin(e);
  using (SolidBrush brush = new SolidBrush(MainColor)) {
    e.Graphics.FillRectangle(brush, e.AffectedBounds);
  }
}

我不知道是什么导致了您的复选标记问题,因为我无法在我的计算机上复制该问题。我猜这可能是您 Windows 中的图形 DPI 设置。

关于C# MenuStrip面板视觉异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42231265/

相关文章:

c# - smtp - 每封邮件都有超时

c# - Active Directory 中的搜索过滤器无效

c# - 如何换出主窗体?

c# - Windows 窗体中的圆形单选按钮列表

java - JMenuItem 的 ActionListener 不起作用

c# - 对 MenuItem 使用 DataTemplate 会导致左侧出现额外空间吗?

C# WinForms trayapp MenuItem 鼠标悬停检测

c# - Entity Framework 代码优先 : cycles or multiple cascade paths

C# control.find 解释

c# - WP7 ListBox 选中的项目没有改变颜色