已Form为例:向ListBox添加字体的名字
public partial class Form1 : Form
{
/// <summary>
/// 要绘制的文本的字体大小
/// </summary>
const float FONT_SIZE = 16f;
public Form1()
{
InitializeComponent();
this.Load += (s, e) =>
{
// 向ListBox添加字体的名字
foreach (FontFamily family in FontFamily.Families)
{
listBox1.Items.Add(family.Name);
}
};
}
private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
// 取出项中的文本
string itemText = (sender as ListBox).Items[e.Index] as string;
// 创建相应的字体
using (Font font = new Font(itemText, e.ItemHeight * 1.0F /*FONT_SIZE*/))
{
// 计算出要绘制的文本的大小(宽度与高度)
SizeF size = e.Graphics.MeasureString(itemText, font);
// 设置项的高度
e.ItemHeight = Convert.ToInt32(size.Height);
}
}
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
// 取出与当前项相关的文本
string itemText = (sender as ListBox).Items[e.Index] as string;
// 创建用于绘制文本的字体对象
using (Font font = new Font(itemText, e.Font.Height * 1.0F /*FONT_SIZE*/))
{
// 创建用于设置文本格式的对象
StringFormat sf = new StringFormat();
// 文本在水平方向上左对齐
sf.Alignment = StringAlignment.Near;
// 文本在垂直方向上居中对齐
sf.LineAlignment = StringAlignment.Center;
// 绘制默认背景
e.DrawBackground();
// 绘制文本
// 以下两种方法都可以检测标记位
//if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
if(e.State.HasFlag(DrawItemState.Selected))
{
// 当前项被选中
e.Graphics.DrawString(itemText, font, SystemBrushes.HighlightText, e.Bounds, sf);
}
else
{
// 当前项未选中
e.Graphics.DrawString(itemText, font, SystemBrushes.ControlText, e.Bounds, sf);
}
// 释放资源
sf.Dispose();
}
}
}