DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ComboBoxの高さを変える

ComboBoxのDropDownStyleがSimple以外の場合、ComboBoxの高さは、HeightやIntegralHeightプロパティの値を変えても変わりません。

ComboBoxの高さを変えるには、ComboBoxをオーナードローする必要があります。ComboBoxのオーナードローについては、「コンボボックスの項目を自分で描画する」で紹介しています。

以下にサンプルを示します。ここではComboBox1の項目の高さ(ItemHeightプロパティ)を20としています。

VB.NET
コードを隠すコードを選択
'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    'オーナードローを指定
    ComboBox1.DrawMode = DrawMode.OwnerDrawFixed
    '項目の高さを設定
    ComboBox1.ItemHeight = 20
    'DrawItemイベントハンドラの追加
    AddHandler ComboBox1.DrawItem, AddressOf ComboBox1_DrawItem

    'ComboBox1のリストに項目を追加する
    ComboBox1.Items.Add("おはよう。")
    ComboBox1.Items.Add("こんにちは。")
    ComboBox1.Items.Add("こんばんは。")
End Sub

'DrawItemイベントハンドラ
'項目を描画する
Private Sub ComboBox1_DrawItem(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.DrawItemEventArgs)
    '背景を描画する
    '項目が選択されている時は強調表示される
    e.DrawBackground()

    Dim cmb As ComboBox = CType(sender, ComboBox)
    '項目に表示する文字列
    Dim txt As String
    If (e.Index > -1) Then
        txt = cmb.Items(e.Index).ToString()
    Else
        txt = cmb.Text
    End If

    '使用するブラシ
    Dim b As Brush = New SolidBrush(e.ForeColor)
    '文字列を描画する
    Dim ym As Single = (e.Bounds.Height - _
        e.Graphics.MeasureString(txt, cmb.Font).Height) / 2
    e.Graphics.DrawString(txt, cmb.Font, b, _
        e.Bounds.X, e.Bounds.Y + ym)
    b.Dispose()

    'フォーカスを示す四角形を描画
    e.DrawFocusRectangle()
End Sub
C#
コードを隠すコードを選択
//Form1のLoadイベントハンドラ
private void Form1_Load(object sender, System.EventArgs e)
{
    //オーナードローを指定
    ComboBox1.DrawMode = DrawMode.OwnerDrawFixed;
    //項目の高さを設定
    ComboBox1.ItemHeight = 20;
    //DrawItemイベントハンドラの追加
    ComboBox1.DrawItem +=
        new DrawItemEventHandler(ComboBox1_DrawItem);

    //ComboBox1のリストに項目を追加する
    ComboBox1.Items.Add("おはよう。");
    ComboBox1.Items.Add("こんにちは。");
    ComboBox1.Items.Add("こんばんは。");
}

//DrawItemイベントハンドラ
//項目を描画する
private void ComboBox1_DrawItem(object sender, 
    System.Windows.Forms.DrawItemEventArgs e)
{
    //背景を描画する
    //項目が選択されている時は強調表示される
    e.DrawBackground();

    ComboBox cmb = (ComboBox) sender;
    //項目に表示する文字列
    string txt = e.Index > -1 ?
        cmb.Items[e.Index].ToString() : cmb.Text;
    //使用するブラシ
    Brush b = new SolidBrush(e.ForeColor);
    //文字列を描画する
    float ym = 
        (e.Bounds.Height - e.Graphics.MeasureString(
            txt, cmb.Font).Height) / 2;
    e.Graphics.DrawString(
        txt, cmb.Font, b, e.Bounds.X, e.Bounds.Y + ym);
    b.Dispose();

    //フォーカスを示す四角形を描画
    e.DrawFocusRectangle();
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。