我想对列表框项目进行一些视觉上的更改,所以我将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();
}
但是为了使文本居中,我需要知道文本宽度 如何获得它或有更好的方法来做到这一点
答案 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();
}