【问题标题】:Change transparency for ToolStrip submenu更改 ToolStrip 子菜单的透明度
【发布时间】:2020-05-20 23:07:42
【问题描述】:

到目前为止,我正在篡改 ToolStrip 的修改,并试图使子菜单也像 MenuStrip 一样透明。我无法使子菜单的属性与菜单本身一样。

我该怎么做?

这是我的修改代码:

    public class ArrowRenderer : ToolStripProfessionalRenderer
    {
        public ArrowRenderer() : base(new LeftMenuColorTable())
        {

        }
        protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
        {
            var tsMenuItem = e.Item as ToolStripMenuItem;
            if (tsMenuItem != null)
                e.TextColor = Color.White;
            base.OnRenderItemText(e);
        }

        protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
        {
            var tsMenuItem = e.Item as ToolStripMenuItem;
            if (tsMenuItem != null)
                e.ArrowColor = Color.White;
            base.OnRenderArrow(e);
        }
        protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
        {
            var tsMenuItem = e.Item as ToolStripMenuItem;
            if (tsMenuItem != null)
                e.Item.BackColor = Color.Black;
            base.OnRenderMenuItemBackground(e);
        }
    }
    public class LeftMenuColorTable : ProfessionalColorTable
    { 
        public override Color MenuItemSelected
        {
            // when the menu is selected
            get { return ColorTranslator.FromHtml("#494f52");  }
        }

        public override Color ToolStripBorder
        {
            get { return ColorTranslator.FromHtml("#FFFFFF"); }
        }
        public override Color ToolStripDropDownBackground
        {
            get { return Color.White; }
        }
    }

    internal void SetTrayMenu()
    {
        if (m_menu != null)
            if (notifyIcon.ContextMenuStrip != null)
                notifyIcon.ContextMenuStrip.Refresh();

        m_menu = new ContextMenuStrip();
        m_menu.Renderer = new ArrowRenderer();
        m_menu.AllowTransparency = true;
        m_menu.Opacity = 0.8;

        m_menu.BackColor = Color.Black;
}

【问题讨论】:

    标签: c# winforms toolstrip contextmenustrip


    【解决方案1】:

    因为托管/列出子项的ToolStripDropDownMenu 或DropDownItems 与ContextMenuStrip 继承的对象不同。因此,您需要为每个子菜单或DropDown 应用相同的设置。

    SetTrayMenu() 应该这样做:

    internal void SetTrayMenu()
    {
        if (m_menu != null && notifyIcon.ContextMenuStrip != null)
            //Why?
            notifyIcon.ContextMenuStrip.Refresh();
        else
        {
            m_menu = new ContextMenuStrip
            {
                Renderer = new ArrowRenderer(),
                AllowTransparency = true,
                Opacity = 0.8,
            };
    
            foreach (var dd in m_menu.Items.OfType<ToolStripMenuItem>()
                .Where(x => x.HasDropDown))
            {
                var ddm = dd.DropDown as ToolStripDropDownMenu;
    
                if (ddm != null)
                {
                    ddm.AllowTransparency = true;
                    ddm.Opacity = 0.8;
                }
            }
    
            m_menu.BackColor = Color.Black;
        }
    }
    

    之前

    之后

    注意:此处不透明度 = 0.5。

    【讨论】:

    • 感谢您的回答。但是如何更改子菜单的边框颜色?
    • @TerribleDog 最欢迎的朋友。您还需要在 LeftMenuColorTable 类中覆盖 MenuBorder。例如public override Color MenuBorder =&gt; ColorTranslator.FromHtml("#FFFFFF");
    • @TerribleDog 不,它会改变。只需设置另一种颜色,如Color.Red 即可查看。至于ToolStripSeparator,是的,它忽略了背面颜色。您需要从中派生一个新类并改写OnPaint 方法。检查this。你也可以从ToolStripMenuItem 派生一个新类来画出更好的东西。在这种情况下,我已经发布了类似this 的内容。它虽然是 VB.NET。我相信你可以做到这一点:)
    • @TerribleDog 这需要覆盖ArrowRenderer 类中的OnRenderToolStripBorder 方法以检查e.ToolStrip 的类型并相应地绘制e.AffectedBounds。例如if (e.ToolStrip is ContextMenuStrip) { //draw the border }; else if (e.ToolStrip is ToolStripDropDownMenu) { }; else base.OnRenderToolStripBorder(e); 并忘记覆盖我上面提到的 MenuBorder 属性。您可能需要将 e.AffectedBounds 矩形的宽度和高度都减小 1。
    • 我使用 ImageMarginGradientBegin 做到了这一点。非常感谢
    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2013-02-26
    • 2018-12-07
    • 2019-12-03
    • 2013-03-04
    • 2017-02-21
    相关资源
    最近更新 更多