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

我希望能够在我的一些工具条中更改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的高度以防止被绘制的边框被切掉):

上一篇:Windows Server 2012远程默认端口3389的修改


下一篇:Windows10系统内置Linux