如何在所有者绘制模式下将列表框项目中的文本居中

时间:2012-09-08 12:44:57

标签: c# winforms listboxitems

我想对列表框项目进行一些视觉上的更改,所以我将DrawMode设置为“OwnerDrawFixed” 我希望文本是项目的中间部分 通过这样做很容易:

private void listTypes_DrawItem(object sender, DrawItemEventArgs e)
{
   e.DrawBackground();
   e.Graphics.DrawString(listTypes.Items[e.Index].ToString(),
                e.Font, Brushes.Black, e.Bounds.Left, e.Bounds.Top + e.Bounds.Height/4
                , StringFormat.GenericDefault);  
   e.DrawFocusRectangle();  
}

但是为了使文本居中,我需要知道文本宽度 如何获得它或有更好的方法来做到这一点

2 个答案:

答案 0 :(得分:3)

您可以尝试使用代码

    void listTypes_DrawItem(object sender, DrawItemEventArgs e)
    {
        ListBox list = (ListBox)sender;
        if (e.Index > -1)
        {
            object item = list.Items[e.Index];
            e.DrawBackground();
            e.DrawFocusRectangle();
            Brush brush = new SolidBrush(e.ForeColor);
            SizeF size = e.Graphics.MeasureString(item.ToString(), e.Font);
            e.Graphics.DrawString(item.ToString(), e.Font, brush, e.Bounds.Left + (e.Bounds.Width / 2 - size.Width / 2), e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2)); 
        }
    }

答案 1 :(得分:2)

您应该使用TextRenderer.DrawText()使文本外观与表单中其他控件呈现文本的方式一致。这使得它很容易,它已经有一个重载,接受一个矩形并将文本居中在该矩形内。只需通过e.Bounds。您还需要注意项目状态,为所选项目使用不同的颜色。像这样:

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e) {
        e.DrawBackground();
        if (e.Index >= 0) {
            var box = (ListBox)sender;
            var fore = box.ForeColor;
            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) fore = SystemColors.HighlightText;
            TextRenderer.DrawText(e.Graphics, box.Items[e.Index].ToString(),
                box.Font, e.Bounds, fore);
        }
        e.DrawFocusRectangle();
    }