首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用平面样式更改ToolStripComboBox的边框

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

Stack Overflow用户
提问于 2012-03-05 10:05:28
回答 3查看 4.4K关注 0票数 5

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

在ToolStrips之外,我见过一种在ComboBoxes上修复边框颜色的常见解决方案,那就是创建ComboBox的子类,覆盖WndProc,然后手动绘制边框。这不适用于ToolStripComboBox控件,因为内部ComboBox控件是它自己的ComboBox的私有子类,我看不出有什么方法可以替换该控件的实例。

我正在考虑的另一个解决方案是将一个扩展的ComboBox对象放到一个ToolStripControlHost中,这样我就可以绘制一个边框,但是我不得不放弃一些专业的渲染器调整。我注意到的第二个缺点是,我在鼠标悬停时偶尔会闪烁。

将我的设计切换到WPF不是一个可接受的解决方案。在绘图边框的父控件中包装控件也是不可接受的,因为这与ToolStripControlHost替代方案相比没有任何好处。

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

EN

回答 3

Stack Overflow用户

发布于 2013-12-15 04:40:04

这里有一个让它工作的方法。某种程度上:)

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

代码语言:javascript
复制
    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的高度,以防止绘制的边框被切断):

票数 3
EN

Stack Overflow用户

发布于 2014-05-07 20:01:58

improvement:检查工具条项目的类型,这样如果是toolstipLabel,程序就不会崩溃。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-06-28 04:51:31

代码语言:javascript
复制
toolStrip1.ComboBox.FlatStyle = FlatStyle.System;

这将在组合框周围设置默认的OS样式的边框。在Windows10上,它是一个浅灰色的细边框。不过,根据背景的不同,它可能不会显示出来。在这种情况下,您可以尝试其他选项,如FlatStyle.Popup

如果预设不是您要查找的内容,则其他答案允许您绘制自定义边框。但是,由于矩形是在组合框周围使用+1像素大小绘制的,因此边框比组合框大1像素。删除+1s和-1s也不起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9560812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档