web-dev-qa-db-ja.com

WindowsフォームでComboBoxの境界線の色を変更する

私のアプリケーションでは、下の写真に示すようにコンボボックスを追加しました

enter image description here

コンボボックスのプロパティを次のように設定しました

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

そして今、私の質問は、ボーダースタイルをコンボボックスに設定して見栄えを良くする方法です。

以下のリンクで確認しました

フラットスタイルのコンボボックス

私の質問は以下のリンクとは異なります。

Windowsフォームアプリケーションの汎用コンボボックス

serControlクラスをオーバーライドしてカスタム境界線を描画する方法は?

9

ComboBoxから継承し、 WndProc をオーバーライドして、 WM_Paint メッセージを処理し、コンボボックスの境界線を描画できます。

enter image description hereenter 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);
                }
            }
        }
    }
}

注:

  • 上記の例では、境界線に前の色を使用しました。BorderColorプロパティを追加するか、別の色を使用できます。
  • ドロップダウンボタンの左の境界線が気に入らない場合は、そのDrawLineメソッドにコメントを付けることができます。
  • コントロールがRightToLeftのときに(0, buttonWidth)から(Height, buttonWidth)まで線を引く必要があります
  • フラットコンボボックスをレンダリングする方法の詳細については、.Net Frameworkの内部 ComboBox.FlatComboAdapter クラスのソースコードを参照してください。
7
Reza Aghaei

CodingGorillaには正しい答えがあり、ComboBoxから独自のコントロールを取得してから、自分で境界線をペイントします。

これは、1ピクセル幅の濃い灰色の境界線をペイントする実際の例です。

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
左側が通常、右側が私の例です。

2
Equalsk

もう1つのオプションは、親コントロールのペイントイベントで自分で境界線を描画することです。

    Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint
        Panel1.CreateGraphics.DrawRectangle(Pens.Black, ComboBox1.Left - 1, ComboBox1.Top - 1, ComboBox1.Width + 1, ComboBox1.Height + 1)
    End Sub

-OO-

1
PKanold