gpt4 book ai didi

c# - 通过双缓冲区 : SetStyle vs. 覆盖 CreateParam 来减少闪烁

转载 作者:太空狗 更新时间:2023-10-29 17:49:24 26 4
gpt4 key购买 nike

谁能解释一下它们之间的区别和关系

SetStyle(ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer, true)

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}

需要它们来减少闪烁,但何时以及如何正确使用它们?它们可以单独使用,还是必须成对使用,原因是什么?

谢谢!

致谢:

第一个代码片段引用自 MSDN page ;第二个代码片段是在 How to fix the flickering in User controls 上找到的,原作者是@HansPassant。

最佳答案

感谢@terrybozzlo 的解释和@Caramiriel 澄清问题的精彩页面。

我想总结一下我在这里得到的一切。


为什么会出现闪烁

闪烁通常发生在您的窗体或容器控件(如 Panel)包含太多控件时(以及当 WS_CLIPCHILDREN 打开时,就是这种情况默认情况下)。根据@HansPassant:

It draws the BackgroundImage, leaving holes where the child control windows go. Each child control then gets a message to paint itself, they'll fill in the hole with their window content. When you have a lot of controls, those holes are visible to the user for a while. They are normally white, contrasting badly with the BackgroundImage when it is dark. Or they can be black if the form has its Opacity or TransparencyKey property set, contrasting badly with just about anything.

如何在控制层避免它们

您应该将控件的 DoubleBuffered 属性设置为 true。为此,您需要从基本类型派生控件(如果它不是用户控件)并在构造函数中设置它。

例如,要使 Panel 双缓冲,您需要执行以下操作:

public class BufferedPanel : Panel
{
public BufferedPanel()
{
DoubleBuffered = true;
}
}

或者,您可以使用:

SetStyle(ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer, true);

获得相同的效果,即它们是等价的

如何在表单级别避免它们

上述技术将减少控件级别的闪烁,这意味着当窗体重绘时,所有控件将不再闪烁。但最终的解决方案是从表单级别减少闪烁:当表单被重绘时,表单及其所有子项都是双缓冲的。

这需要重写 CreateParams:

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}

总结

SetStyle在控件层做工作,CreateParam在Form层做,实现了窗体内部所有控件的双缓冲。

学分:

@terrybozzlo,@Caramiriel,@HansPassant

关于c# - 通过双缓冲区 : SetStyle vs. 覆盖 CreateParam 来减少闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25872849/

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