使用LargeIcon视图时ListView OwnerDraw伪像

时间:2013-04-15 15:48:59

标签: c# winforms listview ownerdrawn

我在C#WinForms项目中有一个ListView,OwnerDraw设置为true。我正在填充LargeIcon和List视图,以及LargeImageListSmallImageList属性(两者都只有一个图像,因为所有项目都显示相同的图标)。

列表视图没有问题:

ListView in View mode

最初正确显示LargeIcon视图:

ListView in LargeIcon mode, nothing selected

但在所选项目发生更改时会留下背景瑕疵(如果单击或使用箭头键无关紧要):

enter image description here

另外,如图所示,如果文本被切断太长时间会出现问题,但这是次要问题。

这是我的DrawItem事件(ORANGEWHIE是在其他地方声明的颜色常量值):

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多年前,但我想我现在生锈了,因为我的生活不能让它发挥作用。任何指针都将非常感激。

0 个答案:

没有答案