腰が重いIT雑記帳

重い腰をあげたエンジニアの色々溜め込んだメモ帳です。開発について諸々書く予定。

ComboBoxの要素の描画を実装する

ComboBoxでユーザーに入力制限したい場合、DropDownStyleプロパティでDropDownListを選択すれば簡単です。

しかし、デフォルトでは背景を変更することができず、FlatStyleをFlatに変更すると、レイアウトが「コレジャナイ」となってしまいます。

そこで、見た目をDropDown(DropDownStyle=DropDown)風にしてみます。
※OSのバージョンによって、異なる場合があります。今回はWindows10で確認しています。

ComboBoxのプロパティ変更

DrawModeプロパティをNormalからOwnerDrawFixedに変更するだけです。
これにより、内容の描画を自分で行います。

変更前

プロパティ名
BackColor Window
DropDownStyle DropDownList
DrawMode Normal
FlatStyle Standard
ForeColor Window Text

変更後

プロパティ名
BackColor Window
DropDownStyle DropDownList
DrawMode OwnerDrawFixed
FlatStyle Standard
ForeColor Window Text

ComboBoxの内容の描画

DrawModeをNormal以外にした場合は、DrawItemイベントで内容を描画する必要があります。

public Form1()
{
    InitializeComponent();

    string[] items = new string[] { "1", "2", "3" };
    comboBox1.Items.AddRange(items);
}

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index < 0) return;

    e.DrawBackground();

    // 選択時は青い背景となるので、文字を白くする
    bool selected = DrawItemState.Selected == (e.State & DrawItemState.Selected);
    var brush = (selected) ? Brushes.White : Brushes.Black;

    e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), e.Font, brush, e.Bounds, StringFormat.GenericDefault );

    e.DrawFocusRectangle();
}

結果

Before

f:id:skysan:20170801072530p:plain

After

f:id:skysan:20170801073243g:plain

参考