[Tips][ComboBox] オーナードローを使用する

本記事はWindowsアプリケーションのTipsです。


オーナードローを使用することで、コンボボックスのアイテムを自由に描画することができます。
ここではフォントの一覧を、そのフォントを使用して描画する例を紹介します。
1)まず、オーナードローを使用するために、コンボボックスのDrawMode をOwnerDrawFixed に設定します。
2)OwnerDrawFixedに設定した場合は、DrawItemイベントが発生するようになります。このイベント内で描画を行うことでオーナードローが可能になります。
3)DrawItemイベントは、コンボボックスの項目1つを描画するときに1回発生します。引数 System.Windows.Forms.DrawItemEventArgs で現在描画する項目のインデックスをIndexプロパティで取得することができます。
サンプルではComboBox1.Items.Item(e.Index).ToStringとしてコンボボックスのフォント名を取得して、そのフォントで描画を行っています。

オーナードローの例

 

VBの例

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ComboBox1.DrawMode = DrawMode.OwnerDrawFixed

    'InstalledFontCollectionオブジェクトの取得
    Dim InstalledFont As New System.Drawing.Text.InstalledFontCollection

    'インストール済みフォントを取得してコンボボックスに表示する
    Dim FontFamilies As FontFamily() = InstalledFont.Families
    For Each f As FontFamily In FontFamilies
        ComboBox1.Items.Add(f.Name)
    Next f
End Sub

Private Sub ComboBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) _
    Handles ComboBox1.DrawItem

    Dim FontF As FontFamily
    Dim fnt As Font
    Dim fs As FontStyle

    '現在のインデックスのフォントファミリを取得
    FontF = New FontFamily(ComboBox1.Items.Item(e.Index).ToString)

    'フォントによってはFontStyle.Regularをサポートしていない場合があるので
    '描画するフォントのスタイルを取得しておく
    If FontF.IsStyleAvailable(FontStyle.Regular) Then
        fs = FontStyle.Regular
    ElseIf FontF.IsStyleAvailable(FontStyle.Italic) Then
        fs = FontStyle.Italic
    Else
        fs = FontStyle.Bold
    End If

    '取得しておいたフォントスタイルを使用してフォントを作成
    fnt = New Font(FontF, 9, fs)

    '適切な色で背景を描画
    e.DrawBackground()

    e.Graphics.DrawString( _
        ComboBox1.Items.Item(e.Index).ToString, _
        fnt, _
        New SolidBrush(Color.Black), _
        e.Bounds.X, _
        e.Bounds.Y)

    'フォントの破棄
    fnt.Dispose()
    FontF.Dispose()
End Sub

 

C#の例

private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DrawMode = DrawMode.OwnerDrawFixed;

    //InstalledFontCollectionオブジェクトの取得
    System.Drawing.Text.InstalledFontCollection InstalledFont = 
        new System.Drawing.Text.InstalledFontCollection();

    //インストール済みフォントを取得してコンボボックスに表示する
    FontFamily[] FontFamilies = InstalledFont.Families;

    foreach ( FontFamily f in FontFamilies )
        comboBox1.Items.Add(f.Name);
}

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    FontFamily FontF;
    Font fnt;
    FontStyle fs;

    //現在のインデックスのフォントファミリを取得
    FontF = new FontFamily(comboBox1.Items[e.Index].ToString());

    //フォントによってはFontStyle.Regularをサポートしていない場合があるので
    //描画するフォントのスタイルを取得しておく
    if (FontF.IsStyleAvailable(FontStyle.Regular))
        fs = FontStyle.Regular;
    else if (FontF.IsStyleAvailable(FontStyle.Italic))
        fs = FontStyle.Italic;
    else
        fs = FontStyle.Bold;

    //取得しておいたフォントスタイルを使用してフォントを作成
    fnt = new Font(FontF, 9, fs);

    //適切な色で背景を描画
    e.DrawBackground();

    e.Graphics.DrawString(
        comboBox1.Items[e.Index].ToString(),
        fnt,
        new SolidBrush(Color.Black),
        e.Bounds.X,
        e.Bounds.Y);

    //フォントの破棄
    fnt.Dispose();
    FontF.Dispose();
}

 

[Tips][ComboBox] インストール済みフォント一覧を表示する

本記事はWindowsアプリケーションのTipsです。


インストール済みフォントをコンボボックスのアイテムにするサンプルを紹介します。

インストール済みフォントを取得するには、InstalledFontCollectionを使用することで簡単に行えます。

1)InstalledFontCollectionからFontFamilyを取得
2)取得したFontFamilyオブジェクトのNameプロパティにフォント名が格納されているので、For Each(C#はforeach)で1つずつ取り出しながらコンボボックスに追加。

インストール済みフォントを表示する

VBの例

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'InstalledFontCollectionオブジェクトの取得
    Dim InstalledFont As New System.Drawing.Text.InstalledFontCollection

    'インストール済みフォントを取得してコンボボックスに表示する
    Dim FontFamilies As FontFamily() = InstalledFont.Families
    For Each f As FontFamily In FontFamilies
        ComboBox1.Items.Add(f.Name)
    Next f
End Sub

C#の例

private void Form1_Load(object sender, EventArgs e)
{
    //InstalledFontCollectionオブジェクトの取得
    System.Drawing.Text.InstalledFontCollection InstalledFont = 
        new System.Drawing.Text.InstalledFontCollection();

    //インストール済みフォントを取得してコンボボックスに表示する
    FontFamily[] FontFamilies = InstalledFont.Families;

    foreach ( FontFamily f in FontFamilies )
        comboBox1.Items.Add(f.Name);
}

[Tips][ComboBox] オートコンプリート機能を実装する

本記事はWindowsアプリケーションのTipsです。


オートコンプリート機能を実装する方法はいくつかありますが、ここではAutoCompleteModeプロパティとAutoCompleteSourceプロパティを使用する方法を紹介します。

1)コンボボックスにアイテムを追加します
2)オートコンプリートモードの設定をします
ここでは、SuggestAppendを指定
3)オートコンプリートの候補として、コンボボックスの値が使用されるようにするため、AutoCompleteSource.ListItemsを指定

オートコンプリートの例

 

VBの例

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim strData() As String = {"Apple", "Banana", "Big Apple", "Candy", "Drink", "Elephatnt", "Fruit"}

    'コンボボックスにアイテムを追加
    ComboBox1.Items.AddRange(strData)

    'オートコンプリートモードの設定
    ComboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend
    'コンボボックスのアイテムをオートコンプリートの選択候補とする
    ComboBox1.AutoCompleteSource = AutoCompleteSource.ListItems
End Sub

 

C#の例

private void Form1_Load(object sender, EventArgs e)
{
    string[] strData = { "Apple", "Banana", "Big Apple", "Candy", "Drink", "Elephatnt", "Fruit" };

    //コンボボックスにアイテムを追加
    comboBox1.Items.AddRange(strData);

    //オートコンプリートモードの設定
    comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
    //コンボボックスのアイテムをオートコンプリートの選択候補とする
    comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;
}