【问题标题】:Blurry Text with C# Listview when reducing flicker减少闪烁时使用 C# Listview 模糊文本
【发布时间】:2012-09-28 10:51:33
【问题描述】:

我有一个 System.Windows.Forms.ListView 包含许多项目。 它闪烁得令人无法忍受(似乎经常发生这种情况),所以经过一番搜索后,我决定在“ListViewLessFlicker”类中做这两件事。

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

DoubleBuffering 尽管在这些主题中最常作为解决方案给出,但效果并不大,但将样式 opaque 设置为 true 会大大减少闪烁。
http://www.virtualdub.org/blog/pivot/entry.php?id=273

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

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

如果有人有修复或知道它为什么会这样做,我很想知道!

【问题讨论】:

  • 闪烁是什么时候发生的?什么时候添加项目?
  • 一个建议 - 不是答案 - 更新您的图形驱动程序。
  • 在刷新列表视图时会发生闪烁,这必须经常进行,即在 listview1.endUpdate() 上

标签: c# .net winforms listview


【解决方案1】:

我通常这样做 - 在调整控件大小时减少闪烁。批量添加项目时需要使用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 );
    }
}

【讨论】:

  • 这基本上也是我的课,除了我的课不透明,奇怪的是我发现了一个 if(oMsg.Msg != 0x14) 等...而不是十进制 14。
  • @user1001328 嗯,让我仔细检查一下WM_ERASEBKGND 的值 - 这是真正的代码复制并粘贴在这里,所以我很确定这应该可以工作。让我再确认一下。
  • @user1001328 你是对的,它是0x14 - 我确定了答案。奇怪,因为我确定我使用此代码来消除闪烁。请注意,闪烁是由控件擦除其背景然后在默认灰色上重新绘制其白色背景引起的。如果不过滤掉WM_ERASEBKGND,设置其他控件样式实际上是没有效果的。
  • 确实很奇怪,大多数人说这有帮助,但它并没有减少我的闪烁,至少很明显......是的,这就是 opaque 有用的原因,因为它应该使它不需要重新绘制.
  • @user1001328 拆分容器是您的问题 - 可能是闪烁和模糊效果。我也尝试过使用它,最终放弃了。我想不出任何办法让它正常工作。试一试,用上面的代码将ListView 放在一个可调整大小的表单上,我很确定你不会有闪烁(或者至少不会有那么多)。这就是为什么我改用选项卡而不是拆分容器的原因 - TabControl 具有 DoubleBuffered 属性。我想知道这是否也取决于所使用的 .NET 框架的版本...
【解决方案2】:

我遇到了和你一样的问题,我在这个页面的 cmets 中找到了解决方案: 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();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 2016-05-30
    • 2011-08-26
    • 2015-07-15
    • 2017-08-10
    • 1970-01-01
    • 2015-02-25
    • 2011-03-27
    相关资源
    最近更新 更多