gpt4 book ai didi

c# - ListView 控件中的闪烁(OwnerDraw、Virtual)

转载 作者:可可西里 更新时间:2023-11-01 08:21:01 26 4
gpt4 key购买 nike

这个问题可能被认为是 Flickering in listview with ownerdraw and virtualmode 的后续问题.

我在虚拟模式 中有一个ListView 控件,我尝试执行自定义绘图。项目渲染是通过以下方法覆盖完成的:

protected override void OnDrawItem(DrawListViewItemEventArgs eventArgs) 

如引用问题中所述,自定义绘图会在鼠标悬停事件时引入闪烁。调试器告诉我发生这种情况是因为触发了过多 自定义绘制事件。


现在 - 所引用问题的公认答案告诉我们:

This is a bug in .NET's ListView and you cannot get around it by double buffering.

  • 那么,该信息的可靠性如何?这真的是一个错误吗?或者我们可能只是试图切断一部分消息并希望它不会改变可见的行为吗?

  • 如果我在 Virtual Mode 中有自己的 ListView 绘图例程,我是否可以抑制这些 Custom Draw 事件并仅在 WM_PAINT 中执行我的绘图,或者,这在某些情况下可能不正确?

  • System.Windows.Forms 控件要能够在 WM_PAINT 中完成所有绘画而不改变其初始行为的先决条件是什么?

最佳答案

至少对于OnDrawItem的双缓冲来说,有一个错误是不正确的,但它有点愚蠢:你可以设置一个 protected 属性,但你需要重写ListView。我创建了这种类:

public class MyListView : ListView
{
public MyListView()
: base()
{
DoubleBuffered = true;
}
}

然后在我的 MyForm.Designer.cs 文件中,我使用以下行更改 ListView 的实例化:

private ListView myListView;

this.myListView = new MyListView();

而且 OnDrawItem 会像魅力一样工作!

关于c# - ListView 控件中的闪烁(OwnerDraw、Virtual),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10484265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com