2

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

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

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

例如,如果我可以使顶层窗口被双缓冲,这样顶层窗口的所有子窗口也被自动绘制成双缓冲。一个更好的选择是能够在任意窗口上引入双缓冲,并让它的所有子窗口继承它。

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

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

非常感谢所有帮助。如果我可以为您澄清任何事情,请告诉我。

4

2 回答 2

3

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

于 2013-05-13T16:22:17.670 回答
0

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

滚动时如何消除Windows.Forms自定义控件中的闪烁?

于 2013-05-13T16:00:24.733 回答