C和Windows GDI中的双缓冲*框架*

时间:2013-05-13 15:56:18

标签: c windows winapi gdi+ gdi

背景:我的客户端有一个非常广泛的专有表单库,它在C中有效实现(实际上,它是一种专有的面向对象语言,基本上包装Windows控件并与{{1}进行交互},SendMessage()等。)

我想解决的问题:每当我在上述框架中实现的应用程序中拖动/调整顶级窗口(或拖动拆分器)时,都会出现大量闪烁。顶级窗口重新绘制,其中包含的任何控件都会重新绘制。

问题1 :有没有办法通过手术将双缓冲引入表单库。特别是,我想知道我是否可以使用标准的Windows GDI函数实现双缓冲。

对于示例,如果我可以使顶级窗口被双重缓冲,那么顶级窗口的所有子窗口也会自动被双重缓冲。一个更好的选择是能够在任意窗口上引入双缓冲并让其所有子节点继承它。

最佳解决方案会以某种方式导致子控件的SetStyle()函数返回屏幕后缓冲区DC的句柄,这样我就不必为每个单独的控件类编写特殊代码。

问题2 :是否有一种方法(例如一组标志)导致通用Windows控件(EDIT,BUTTON等)自己绘制双缓冲?这将是一个比更通用的方法更糟糕的解决方案,它可以无缝地为它们提供后台缓冲区,但它也可以接受。

所有帮助非常感谢。如果我能为您澄清任何内容,请告诉我。

2 个答案:

答案 0 :(得分:2)

查看WS_EX_COMPOSITED,这是一种扩展窗口样式,可为窗口启用双缓冲。在控件的父级上设置此样式可能就足够了。

答案 1 :(得分:0)

您实际上可以使用执行C#的C包装所有窗口绘图代码,这样就已经有了双缓冲实现。

How to eliminate flicker in Windows.Forms custom control when scrolling?