我在 C# WinForms 项目中有一个OwnerDraw
设置为 true 的 ListView。我正在填充 LargeIcon 和 List 视图,以及LargeImageList
andSmallImageList
属性(两者都只有一个图像,因为所有项目都显示相同的图标)。
列表视图绘制没有问题:
LargeIcon 视图最初正确显示:
但在所选项目更改时留下背景工件(单击或使用箭头键无关紧要):
此外,如图所示,如果太长,文本会被截断,但这是次要问题。
这是我的 DrawItem 事件(ORANGE
并且WHIE
是在其他地方声明的颜色常量值):
private void ListView_DrawItem( object sender, DrawListViewItemEventArgs e ) {
ListView list = sender as ListView;
if( e.Item.Selected ) {
e.Graphics.FillRectangle( new SolidBrush( ORANGE ), e.Bounds );
} else {
e.Graphics.FillRectangle( new SolidBrush( WHITE ), new Rectangle( e.Bounds.Location, e.Bounds.Size ) );
}
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
if( list.View == View.List ) {
e.Graphics.DrawImage( list.SmallImageList.Images[0], new Point( e.Bounds.Left + 4, e.Bounds.Top ) );
e.Graphics.DrawString( e.Item.Text, new Font( "SegoeUI", 10, FontStyle.Regular ), new SolidBrush( Color.Black ), new PointF( e.Bounds.Left + 22, e.Bounds.Top + 1 ) );
} else if( list.View == View.LargeIcon ) {
e.Graphics.DrawImage( list.LargeImageList.Images[0], new Point( e.Bounds.Left + ( ( e.Bounds.Width - 32 ) / 2 ), e.Bounds.Top ) );
e.Graphics.DrawString( e.Item.Text, new Font( "SegoeUI", 10, FontStyle.Regular ), new SolidBrush( Color.Black ), new RectangleF( new PointF( e.Bounds.Left, e.Bounds.Top + 34 ), new SizeF( e.Bounds.Width, e.Bounds.Height - 34 ) ), new StringFormat { Alignment = StringAlignment.Center } );
}
}
其中很多都是反复试验,包括几何计算和使用TextRenderingHint
,我这样做是为了使字体平滑,但我不确定我使用的是正确的值。
几年前我最后一次做了一个所有者绘制的 ListView,但我想我现在已经生锈了,我这辈子都无法让它工作。任何指针将不胜感激。