本記事は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();
}
Please follow and like us:


コメント