作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个包含一些“自定义控件”的库。本质上,我们有自己的按钮、圆角面板和一些带有一些自定义油漆的组框。尽管 OnPaint 方法中有“数学”,但控件非常标准。大多数时候,我们所做的只是绘制圆角并向背景添加渐变。我们使用 GDI+ 来做这一切。
这些控件没问题(我们的客户认为它们非常漂亮),但是尽管有 DoubleBuffer,您还是会看到一些重绘,尤其是当同一个表单上有 20++ 个按钮(例如)时。在加载表单时,您会看到按钮在绘制……这很烦人。
我很确定我们的按钮不是地球上最快的东西,但我的问题是:如果双缓冲区“打开”,所有重绘不应该在后台发生并且 Windows 子系统应该“立即”显示结果“?
另一方面,如果有“复杂”的 foreach 循环将创建标签,将它们添加到面板(双缓冲)并更改它们的属性,如果我们在循环之前暂停面板的布局并在循环时恢复面板的布局循环结束了,所有这些控件(标签和按钮)不应该“几乎立即”出现吗?这不是那样发生的,您可以看到面板被填充。
知道为什么这没有发生吗?我知道没有示例代码很难评估,但也很难复制。我可以用相机制作视频,但相信我,这并不快 :)
最佳答案
我们也遇到过这个问题。
我们已经看到“修复”它的一种方法是完全暂停控件的绘制,直到我们准备好开始。为此,我们向控件发送 WM_SETREDRAW 消息:
// Note that WM_SetRedraw = 0XB
// Suspend drawing.
UnsafeSharedNativeMethods.SendMessage(handle, WindowMessages.WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero);
...
// Resume drawing.
UnsafeSharedNativeMethods.SendMessage(handle, WindowMessages.WM_SETREDRAW, new IntPtr(1), IntPtr.Zero);
关于c# - Winforms:SuspendLayout/ResumeLayout 还不够吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835100/
我是一名优秀的程序员,十分优秀!