减少闪烁时使用C#Listview模糊文本

时间:2012-09-28 10:51:33

标签: c# .net winforms listview

我有一个包含大量项目的System.Windows.Forms.ListView。 它无法忍受地闪烁(似乎经常是这样)所以经过一些搜索我决定在“ListViewLessFlicker”类中做这两件事。

        this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.Opaque, true);

DoubleBuffering没有太大的影响,即使它最常被作为这些主题的解决方案,但将样式设置为不透明真实大大减少了闪烁。
http://www.virtualdub.org/blog/pivot/entry.php?id=273

然而,它有副作用,我似乎无法找到解决方法。 当我将鼠标悬停在ListView中的某个项目上时,它现在使文本变为粗体并且非常模糊(除非opaque为true,否则不会发生这种情况)。

这是一个非常放大的例子。

enter image description here

如果有人有解决方法或者知道为什么会这样做,我很想知道!

2 个答案:

答案 0 :(得分:4)

我通常这样做 - 在调整控件大小时减少闪烁。在批量添加项目时,您需要使用BeginUpdate() / EndUpdate()来减少闪烁。我不知道是什么原因可能导致模糊,所以我无法提供相关建议 - 更新你的视频驱动程序可能有所帮助,但不能保持你的希望。

[System.ComponentModel.DesignerCategory ( "" )]
public partial class ListViewEx : ListView
{
    private const int WM_ERASEBKGND = 0x14;

    public ListViewEx ()
    {
        InitializeComponent ();

        // Turn on double buffering.
        SetStyle ( ControlStyles.OptimizedDoubleBuffer |
            ControlStyles.AllPaintingInWmPaint, true );

        // Enable the OnNotifyMessage to filter out Windows messages.
        SetStyle ( ControlStyles.EnableNotifyMessage, true );
    }

    protected override void OnNotifyMessage ( Message oMsg )
    {
        // Filter out the WM_ERASEBKGND message to prevent the control
        // from erasing the background (and thus avoid flickering.)
        if ( oMsg.Msg != WM_ERASEBKGND )
            base.OnNotifyMessage ( oMsg );
    }
}

答案 1 :(得分:3)

我遇到了与您相同的问题,我在此页面的评论中找到了解决方案: http://www.virtualdub.org/blog/pivot/entry.php?id=273

你必须创建这样的新类:

public class BufferedListView : ListView
{
    public BufferedListView() : base()
    {
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    }
}

然后将ListView定义为BufferedListView,如下所示:

ListView myListView = new BufferedListView();

之后模糊的文字不再是问题;)