2016-01-19 35 views
6

W mojej aplikacji dodaliśmy Combobox jak pokazano na rysunku poniżejJak zastosować obramowanie do combobox w aplikacji formularza w systemie Windows?

enter image description here

mam ustawić właściwość combobox jak

cmbDatefilter.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 

a teraz moje pytanie jest jak ustawić styl obramowania do combobox tak że będzie ładnie wyglądać.

I zweryfikowane w linku poniżej

Flat style Combo box

Moje pytanie jest różna od dołu LINK.

Generic ComboBox in Windows Forms Application

How to override UserControl class to draw a custom border?

+0

Możliwy duplikat [Jak zastąpić klasę UserControl, aby narysować niestandardową ramkę?] (Http://stackoverflow.com/questions/3908384/how-to-override-usercontrol-class-to-draw-a- obramowanie niestandardowe) – CodingGorilla

+0

Przeczytaj uważnie to pytanie. –

+0

Formanty formularzy systemu Windows nie mają stylów obramowania, więc jeśli chcesz zachować styl płaskiego, musisz go narysować samodzielnie. – CodingGorilla

Odpowiedz

3

CodingGorilla ma właściwą odpowiedź, czerpią swoją kontrolę z ComboBox, a następnie pomalować granicy samodzielnie.

Oto przykład roboczych, które maluje 1 piksel ciemnoszarą granicę:

class ColoredCombo : ComboBox 
{ 
    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     base.OnPaintBackground(e); 
     using (var brush = new SolidBrush(BackColor)) 
     { 
      e.Graphics.FillRectangle(brush, ClientRectangle); 
      e.Graphics.DrawRectangle(Pens.DarkGray, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1); 
     } 
    } 
} 

Custom combobox border example
Normalna po lewej stronie, mój przykład z prawej strony.

3

można dziedziczyć ComboBox i zastąpić WndProc i uchwyt WM_PAINT wiadomość i wyciągnąć granicy do pola kombi:

enter image description here enter image description here

public class FlatCombo:ComboBox 
{ 
    private const int WM_PAINT = 0xF; 
    private int buttonWidth= SystemInformation.HorizontalScrollBarArrowWidth; 
    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if (m.Msg == WM_PAINT) 
     { 
      using (var g = Graphics.FromHwnd(Handle)) 
      { 
       using (var p = new Pen(this.ForeColor)) 
       { 
        g.DrawRectangle(p, 0, 0, Width - 1, Height - 1); 
        g.DrawLine(p, Width - buttonWidth, 0, Width - buttonWidth, Height); 
       } 
      } 
     } 
    } 
} 

Uwaga:

  • w powyżej exampl e Wcześniej używałam koloru do obramowania, możesz dodać właściwość BorderColor lub użyć innego koloru.
  • Jeśli nie podoba ci się lewa krawędź przycisku, możesz skomentować tę metodę DrawLine.
  • Musisz narysować linię, gdy kontrola jest RightToLeft z (0, buttonWidth) do (Height, buttonWidth)
  • Aby dowiedzieć się więcej o tym, jak uczynić pole kombi płaski, można zapoznać się z kodem źródłowym wewnętrznej ComboBox.FlatComboAdapter klasy .NET Framework.
+1

Lepsza odpowiedź, ponieważ tak naprawdę działa. – Bitterblue