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

时间:2012-03-05 02:05:28

标签: c# .net winforms combobox toolstrip

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

这是一种让它起作用的方法......有点:)

PaintToolStrip事件创建事件处理程序。然后循环遍历所有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的高度以防止被绘制的边框被切断):

enter image description here

答案 1 :(得分:1)

<强>改善: 检查工具条项的类型, 因此,如果它是toolstipLabel,程序不会粉碎。

foreach (var item in toolStrip1.Items)
{
      var asComboBox = item as ToolStripComboBox;
      if (asComboBox != null)
      {
          var location = asComboBox.ComboBox.Location;
          var size = asComboBox.ComboBox.Size;
          Pen cbBorderPen = new Pen(Color.Gray);
          Rectangle rect = new Rectangle(
                  location.X - 1,
                  location.Y - 1,
                  size.Width + 1,
                  size.Height + 1);

          e.Graphics.DrawRectangle(cbBorderPen, rect);
       }

}

答案 2 :(得分:0)

toolStrip1.ComboBox.FlatStyle = FlatStyle.System;

这将在组合框周围设置默认的操作系统样式边框。在Windows 10上,它是浅灰色和薄边框。尽管根据背景,可能不会显示。在这种情况下,您可以尝试使用其他选项,例如FlatStyle.Popup

如果预设不是您想要的预设,则其他答案可让您绘制自定义边框。但是,由于在组合框周围以+1像素大小绘制了矩形,因此边框比组合框大1像素。删除+1和-1也不起作用。