C# 组合框边框样式

C# 组合框边框样式,c#,winforms,combobox,C#,Winforms,Combobox,嗨,我已经将组合框控件的flatstyle设置为flat 是否可以在此控件周围绘制边框? 控件没有borderstyle属性。如有任何建议,将不胜感激。旁注:我希望尽可能使flatstyle保持平坦。创建自定义组合框控件,并覆盖它的WndProc方法。您可以使用以下方法轻松绘制边框: 顺便说一句,还有重载的DrawBorder方法,它允许设置边框的宽度。如果需要,可以使用它。将其放置在面板中,在面板上设置边框,将cmb框放置在面板中,将cmb框设置为停靠填充并将边框样式设置为平面。简单但不太优雅

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

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


控件没有borderstyle属性。如有任何建议,将不胜感激。旁注:我希望尽可能使flatstyle保持平坦。

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


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

将其放置在面板中,在面板上设置边框,将cmb框放置在面板中,将cmb框设置为停靠填充并将边框样式设置为平面。简单但不太优雅的解决方案。

控件的父控件可以在其绘制事件处理程序中在其周围绘制边框。这是否有效?组合框边框不能在绘制事件中被覆盖。我认为您必须重写WndProc并查找非客户端绘制消息。当然,它会闪烁得很难看。@HansPassant抱歉,没有能力在VS上运行它。现在所有的都被验证了,并且工作正常。这对于我来说已经足够了!
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();
        }
    }     
}