Fra*_*erg 11 c# winapi off-screen wm-paint
我想在屏幕外渲染一个控件到一些位图,以便我可以快速访问它.
不幸的是,Control.DrawToBitmap似乎绘制了它所调用的整个控件,包括它的所有子控件.在内部,它向位图发出带有自提供DC的WM_PRINT消息.然后将此临时位图blitting到用户提供的位图.对我来说不可接受,我宁愿根据需要更新这个位图,以便在需要位图时最小化我的性能.
在理想情况下,我希望表单的行为就像它在屏幕上可见(但它不可能).这意味着,如果某个控件的Text属性发生了变化,则表单将部分失效.然后,捕获相关的消息/事件将允许我为要绘制的表单指定我自己的DC,或者简单地将表单DC BitBlt到我自己的DC.
我看过的一些方向:
PaintEventArgs参数OnPaint似乎举行成员savedGraphicsState,也许它可以用来找出不需要无效小智 1
我认为有两个问题:
对于第一个问题,我认为你很大程度上要靠自己。您应该跟踪哪些控件发生变化,并记录哪些需要更新。
对于第二个问题,您可以尝试自己发送WM_PRINT消息,并提供仅引用小位图的DC。原始的 DC API 允许您偏移和剪切 HDC 的有效绘图区域。如果你很幸运,Windows 将从 HDC 推断出渲染区域,如果没有,则大多数完全不在位图之外的渲染命令应该相当便宜,因为没有需要更改的像素。
您应该能够通过打印到 1x1 位图来验证这一点,并测试它是否更快,和/或验证 WM_PAINT 中发送的剪辑区域是否缩小到位图大小。