ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 使用平面样式更改ToolStripComboBox的边框

2019-06-26 07:53:15  阅读:868  来源: 互联网

标签:c net winforms combobox toolstrip


我希望能够在我的一些工具条中更改ToolStripComboBox控件的边框颜色,因为与平面样式一起使用时,ComboBox的默认边框颜色是SystemColors.Window,它对于工具条的默认控件颜色基本上是不可见的.在Reflector中进行了大量的挖掘后,我没有看到任何明显的方法,因为ComboBox渲染背后的所有基础设施都受到内部和私有接口的高度保护.

在ToolStrips之外,我见过用于修复ComboBox上边框颜色的常用解决方案是子类ComboBox,覆盖WndProc,并手动绘制边框.这对于ToolStripComboBox控件不起作用,因为内部ComboBox控件是它自己的ComboBox的私有子类,我无法看到替换控件的实例.

我正在考虑的另一种解决方案是将一个扩展的ComboBox对象放入ToolStripControlHost中,这允许我绘制边框,但后来我不得不放弃一些专业的渲染器调整.我注意到的第二个缺点是我在鼠标悬停期间偶尔会出现闪烁现象.

将我的设计切换到WPF是不可接受的解决方案.用于绘制边框的父控件中的包装控件也是不可接受的,因为这对ToolStripControlHost替代方案没有任何好处.

有没有人有一个聪明的解决方案来解决这个问题,或者是否存在现有的(允许许可的)ComboBox平面式渲染堆栈的重新实现,这解决了现有实现中的一些缺点?

解决方法:

这是一种让它工作的方法……有点:)

ToolStripPaint事件创建一个事件处理程序.然后循环遍历所有ToolStripComboBoxes并在它们周围绘制一个矩形.

    private Color cbBorderColor = Color.Gray;
    private Pen cbBorderPen = new Pen(SystemColors.Window);

    private void toolStrip1_Paint(object sender, PaintEventArgs e)
    {            
        foreach (ToolStripComboBox cb in toolStrip1.Items)
        {
            Rectangle r = new Rectangle(
                cb.ComboBox.Location.X - 1,
                cb.ComboBox.Location.Y - 1,
                cb.ComboBox.Size.Width + 1,
                cb.ComboBox.Size.Height + 1);

            cbBorderPen.Color = cbBorderColor;
            e.Graphics.DrawRectangle(cbBorderPen, r);
        }
    }

这是它的样子(请注意,您可能需要调整ToolStrip的高度以防止被绘制的边框被切掉):

标签:c,net,winforms,combobox,toolstrip
来源: https://codeday.me/bug/20190626/1291656.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有