0

OwnerDrawtrueに設定された C# WinForms プロジェクトに ListView があります。私は、LargeIcon ビューと List ビューの両方、LargeImageListおよびSmallImageListプロパティ (すべてのアイテムが同じアイコンを表示するため、どちらも 1 つの画像しか持たない) に値を設定しています。

リスト ビューは問題なく描画されます:

表示モードの ListView

LargeIcon ビューは最初は正しく表示されます。

何も選択されていない、LargeIcon モードの ListView

ただし、選択したアイテムが変更されると背景のアーティファクトが残ります (矢印キーをクリックするか使用するかは関係ありません)。

ここに画像の説明を入力

また、示されているように、テキストが長すぎると途切れるという問題がありますが、それは二次的な問題です。

これが私の 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 を最後に作成しましたが、今は錆びていると思います。私の人生では、それを機能させることはできません。任意のポインタをいただければ幸いです。

4

0 に答える 0