ComboBox の行の高さを変更する

最近更新が止まってますが、ネタはあっても書く暇のない日が続く今日この頃です。
本日は、以前 Yahoo のブログで書いた記事を、少し修正して公開したいと思います。



.NET の ComboBox は、標準の仕様だと行間がなくて大変見づらて仕方ありません。


そこで行の高さを ItemHeight プロパティで設定しようとするのですが、規定値(この場合 12)から変更出来ません。どうやら DrowMode プロパティが Normal のままだと ItemHeight の値は変更できないようです。


しかしオーナードローを有効にするとアイテムが表示されなくなるため、アイテムを描画するのにかなり面倒な処理が必要になります。

そこでオーナードローを使わずに ItemHeight を変更するために、SendMessage を使い CB_SETITEMHEIGHT メッセージをコンボボックスに投げてやります。この方法が一番簡単だと思います。

SendMessage(comboBox1.Handle, CB_SETITEMHEIGHT, 0, 30);


以下、C# の例です。とりあえず高さを30ピクセルに設定してみました。

using System.Runtime.InteropServices;

・・・・・・

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

private const int CB_SETITEMHEIGHT = 0x153;

private void Form1_Load(object sender, EventArgs e) {
    SendMessage(comboBox1.Handle, CB_SETITEMHEIGHT, 0, 30);
}


VB.NET だとこうなります。

Imports System.Runtime.InteropServices

・・・・・・

<DllImport("user32.dll")> _
Private Shared Function SendMessage _
        (ByVal hWnd As IntPtr, ByVal Msg As Integer, _
         ByVal wParam As Integer, ByVal lParam As Integer) As Integer
End Function

Private Const CB_SETITEMHEIGHT As Integer = &H153

Private Sub Form2_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    SendMessage(Me.ComboBox1.Handle, CB_SETITEMHEIGHT, 0, 30)
End Sub


実行結果です。