gpt4 book ai didi

c# - 无效化为自己的位图

转载 作者:可可西里 更新时间:2023-11-01 08:49:51 28 4
gpt4 key购买 nike

我希望在屏幕外将控件渲染到某个位图,以便我可以快速访问它。

不幸的是,Control.DrawToBitmap 似乎绘制了调用它的整个控件,包括它的所有子控件。它在内部向位图发出带有自提供 DC 的 WM_PRINT 消息。这个临时位图然后被 blits 到用户提供的位图中。这对我来说是 Not Acceptable ,我宁愿根据需要更新这个位图,这样当需要位图时我的性能影响就会最小化。

在理想情况下,我希望表单的行为就像在屏幕上可见一样(但它不可能)。这意味着,如果某些控件的 Text 属性发生更改,则表单将部分失效。捕获相关的消息/事件将允许我为要绘制的表单指定我自己的 DC,或者简单地将表单 DC BitBlt 到我自己的。

我看过的一些方向:

  • OnPaint 中的PaintEventArgs 参数似乎包含一个成员 savedGraphicsState,也许它可以用来找出不需要无效的内容
  • 使表单可见但在屏幕区域之外。不过,控件不会被绘制。
  • 在窗口上手动调用 RedrawWindow(),同样的故事

最佳答案

我认为有两个问题:

  1. 找出控件的无效区域(无需windows帮助)
  2. 只渲染无效的部分。

对于第一个问题,我认为你主要是靠自己。您应该跟踪哪些控件发生变化,并记录需要更新的内容。

对于第二个问题,您可以尝试自己发送WM_PRINT消息,并提供一个仅引用小位图的DC。原始 DC API 允许您偏移和裁剪 HDC 的有效绘图区域。如果您非常幸运,Windows 将从 HDC 推断出渲染区域,如果没有,则大多数完全脱离位图的渲染命令应该非常便宜,因为没有像素需要更改。

您应该能够通过打印到 1x1 位图来验证这一点并测试它是否更快,和/或验证在 WM_PAINT 中发送的剪辑区域是否缩小到位图大小。

关于c# - 无效化为自己的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512928/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com