2012-11-04 52 views
5

嗨我已经将组合框控件的flatstyle设置为平面。组合框边框

是否有可能围绕此控件绘制边框?

该控件没有边框属性。任何建议,将不胜感激。附注:如果可能,我希望保持flatstyle平坦。

+2

控制的母公司可以在它的Paint事件处理程序周围画一个边框。 –

回答

6

放在一个面板,面板上设置边框,把中巴箱面板,设置中巴箱码头填充和边框样式flat.simple但不那么优雅的解决方案。

+0

这足以满足我的目的thanx太多了! – p0enkie

13

创建自定义组合框控件,并覆盖它的方法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并寻找非客户端的paint消息。当然,它会闪烁相当难看。 – LarsTech

+2

在发布之前尝试一下代码。 –

+0

@LarsTech你是对的,我的坏,修复 –