2

我想对列表框项目进行一些视觉更改,所以我将 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();  
}

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

4

2 回答 2

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)); 
        }
    }
于 2012-09-08T12:47:28.033 回答
2

您应该使用 TextRenderer.DrawText() 使文本外观与表单中其他控件呈现文本的方式一致。这很容易,它已经有一个重载,可以接受一个 Rectangle 并将该矩形内的文本居中。只需通过 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();
    }
于 2012-09-08T13:43:48.720 回答