【问题标题】:Is it possible to set TVS_EX_DOUBLEBUFFER without using p/invoke?是否可以在不使用 p/invoke 的情况下设置 TVS_EX_DOUBLEBUFFER?
【发布时间】:2013-12-21 23:48:24
【问题描述】:

我正在尝试通过使用双缓冲来减少 TreeView 控件中的闪烁。使用此处概述的建议似乎有效,它设置了自 Vista 以来可用的 TVS_EX_DOUBLEBUFFER 扩展窗口样式: Treeview flickering?

但是,我更希望不要对 user32.dll 有额外的依赖,因为该项目也设置为在 Mono 上运行。是否可以在不使用 P/Invoke 的情况下设置 TVS_EX_DOUBLEBUFFER 扩展窗口样式?

我曾希望我可以使用 CreateParams 来执行此操作,但它似乎不起作用。这是我尝试过的:

const int TVS_NOHSCROLL = 0x8000;
const int TVS_EX_DOUBLEBUFFER = 0x0004;

protected override CreateParams CreateParams
{
    get
    {
        var parameters = base.CreateParams;
        parameters.Style |= TVS_NOHSCROLL;
        parameters.ExStyle |= TVS_EX_DOUBLEBUFFER;
        return parameters;
    }
}

TVS_NOHSCROLL 只是为了演示使用 CreateParams 设置窗口样式,它确实有效。根据文档,您可以使用 ExStyle 设置扩展窗口样式,但不幸的是,这似乎不适用于 TreeView。

有什么想法吗?

【问题讨论】:

  • 这不可能,TVM_SETEXTENDEDSTYLE 是必需的。避免对 user32.dll 的依赖是没有意义的,它是 Windows 操作系统的核心 DLL 之一。 TreeView 本身需要它。
  • 我知道它在 Windows 上是完全可以接受的解决方案。但是,在 Mono 下使用 Windows 窗体时,您不能 P/Invoke 本机系统库。他们使用其他一些后端重新实现了 TreeView。
  • 不知何故我已经担心没有其他方法可以解决它......我只是不明白为什么 CreateParams.ExStyle 不起作用。我已经看到其他非 TreeView 示例代码将各种扩展样式从按钮传递到列表视图,甚至从官方文档来看,它似乎是正确的地方。哦,好吧...

标签: c# winforms treeview


【解决方案1】:

.NET Windows Forms 控件中的双缓冲可以通过同名属性设置:

yourControl.DoubleBuffered = true;

您可以使用控件的SetStyle方法来设置额外的样式。

【讨论】:

  • 这是一种完全不同的双缓冲,Winforms 不参与其中。
  • 这绝对不适用于 TreeView。这是我尝试的第一件事;没有效果,甚至看起来他们已经竭尽全力避免让人们使用它,因为该属性甚至对派生类都是隐藏的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多