组合框边框样式

6

嗨,我已经将组合框控件的flatstyle设置为flat。

是否可能在此控件周围绘制边框?

该控件没有borderstyle属性。任何建议都将不胜感激。附注:如果可能的话,我希望保持flatstyle为flat。


2
控件的父级可以在其Paint事件处理程序中绘制其周围的边框。 - Hans Passant
2个回答

15

创建自定义的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方法,可以设置边框宽度。如果需要的话,请使用它。


1
这个可行吗?在绘画事件中不能重写ComboBox边框。我认为您必须覆盖WndProc并查找非客户机绘画消息。当然,那样会闪烁得相当难看。 - LarsTech
@HansPassant 不好意思,之前没有能力在VS上运行它。现在已经验证并且工作正常。 - Sergey Berezovskiy

7
将其放在一个面板中,为面板设置边框,将cmb框放在面板中,将cmb框设置为填充和边框样式flat。这是一个简单但不太优雅的解决方案。

这对我的目的来说已经足够了,非常感谢! - p0enkie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接