C# ListBox控制每行显示不同的内容

已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();
            }
        }
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值