2012-11-04 72 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你是對的,我的壞,修復 –