【问题标题】:Combobox borderstyle组合框边框样式
【发布时间】:2012-11-04 17:53:30
【问题描述】:

您好,我已将组合框控件的平面样式设置为平面。

可以在这个控件周围画边框吗?

该控件没有borderstyle 属性。任何建议,将不胜感激。旁注:如果可能的话,我希望保持扁平风格。

【问题讨论】:

  • 控件的父级可以在其 Paint 事件处理程序中围绕它绘制边框。

标签: c# winforms combobox


【解决方案1】:

创建自定义 ComboBox 控件,并覆盖它的 WndProc 方法。您可以使用ControlPaint.DrawBorder 方法轻松绘制边框:

public class ComboBoxWithBorder : ComboBox
{
    private Color _borderColor = Color.Black;
    private ButtonBorderStyle _borderStyle = ButtonBorderStyle.Solid;
    private static int WM_PAINT = 0x000F; 

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        if (m.Msg == WM_PAINT)
        {
            Graphics g = Graphics.FromHwnd(Handle);
            Rectangle bounds = new Rectangle(0, 0, Width, Height);
            ControlPaint.DrawBorder(g, bounds, _borderColor, _borderStyle);
        }
    }

    [Category("Appearance")]
    public Color BorderColor
    {
        get { return _borderColor; }
        set 
        { 
            _borderColor = value;
            Invalidate(); // causes control to be redrawn
        }
    }

    [Category("Appearance")]
    public ButtonBorderStyle BorderStyle
    {
        get { return _borderStyle; }
        set 
        { 
            _borderStyle = value;
            Invalidate();
        }
    }     
}

顺便说一句 还有一个重载的 DrawBorder 方法,它允许设置边框的宽度。如果需要,请使用它。

【讨论】:

  • 这行得通吗? ComboBox 的边框不能在绘制事件中被覆盖。我认为您必须覆盖 WndProc 并查找非客户端绘制消息。当然,然后它闪烁得相当难看。
  • @HansPassant 抱歉,无法在 VS 上运行它。现在一切都已验证并正常工作
【解决方案2】:

将其放在面板中,在面板上设置边框,将 cmb 框放在面板中,将 cmb 框设置为停靠填充和边框样式 flat.simple 但不是那么优雅的解决方案。

【讨论】:

  • 这对我的目的来说已经足够了!
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 2011-01-28
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
相关资源
最近更新 更多