- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
谁能解释一下它们之间的区别和关系
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/
我正在尝试将 Sqllite 内存数据库与 ServiceStack 一起运行。 Visual Studio .net 4.6.1 中的控制台应用程序 (如果我在 LinqPad 中运行相同的代码,它
我想避免应用程序面板中的闪烁,在4个月前进行谷歌搜索之后,在尝试子类化面板之后,在此处询问两三次之后,在其他论坛询问之后......没有人有解决方案,但今天我在最后一个答案中奇迹般地找到了解决方案:I
我正在动态创建一个覆盖 CreateParams 的表单,以便我可以将其显示在任务栏上。从动态创建的表单中,我调用 TColorDialog,但一旦显示,我的表单将进入 MainForm 下方,而 C
以前,当我想创建一个点击表单时,我是 tempted to use platform invokes to set the extended window styles (user32.dll 中的G
我正在尝试此操作,但出现错误ADODB.Recordset错误'800a0e78'关闭对象时不允许操作。在带有此代码的行If ScopeID.EOF Then 请不要回答使用CreateParam方法
我found NoBugz ( Hans Passant ) 编写的一些旧代码,据我所知,它强制 richtextbox 使用 RTF 5.0 而不是 4.0。基本上它只是一个继承 RichTextB
完整的源代码可以在这里找到: http://www.eyeClaxton.com/download/delphi/SkinProject.zip 我正在尝试创建一个没有“标题或边框”的皮肤表单,但仍然
在我继承并迁移到 XE5 的一些遗留 D7 代码中,我发现了下面的代码。 注释指出,如果它是从非 WinControl 创建的,它会欺骗 Windows 认为它是子窗体。代码库中有一个地方调用 C
谁能解释一下它们之间的区别和关系 SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint |
我是一名优秀的程序员,十分优秀!