【发布时间】:2011-12-14 22:54:43
【问题描述】:
我希望在屏幕外将控件渲染到某个位图,以便我可以快速访问它。
不幸的是Control.DrawToBitmap 似乎绘制了调用它的整个控件,包括它的所有子控件。在内部,它向位图发出带有自备 DC 的 WM_PRINT 消息。然后将该临时位图传送到用户提供的位图。对我来说无法接受,我宁愿根据需要更新此位图,以便在需要位图时将性能损失降至最低。
在理想情况下,我希望表单表现得好像它在屏幕上可见(但它不能)。这意味着,如果某个控件的Text 属性发生了更改,那么表单将部分失效。捕获相关的消息/事件之后,我可以指定我自己的 DC 以用于绘制表单,或者简单地将表单 DC BitBlt 到我自己的。
我看过的一些方向:
-
OnPaint中的PaintEventArgs参数似乎保存了一个成员 savedGraphicsState,也许它可以用来找出不需要失效的东西 - 使表单可见但在屏幕区域之外。但是,控件不会被绘制。
- 在窗口上手动调用 RedrawWindow(),同样的情况
【问题讨论】:
-
我不完全清楚为什么
DrawToBitmap(WM_PRINT消息)不适合您使用。您是否担心性能?绘制到位图不会比绘制到屏幕上慢。 -
我需要一个缓冲机制。 DrawToBitmap 从头开始绘制整个控件,而在普通窗口上使用的无效系统只会更新实际更改的区域。
-
@Frank,你考虑过使用 Bitblt 吗? codeproject.com/KB/GDI-plus/Bitblt_wrapper_class.aspx
-
是的,但如果窗口实际上在屏幕上不可见,它就不起作用。
-
@FrankRazenberg 似乎正在尝试创建一个控件以在单独的 LCD 上显示。大概他有一个 API 允许他将位图发送到该 LCD,但它不是 Windows 识别的显示器,因此他不能简单地在该屏幕上显示控件。为此,他尝试获取屏幕外控件的图像,并在需要更新时收到通知,因此他可以将位图的更新部分发送到单独的屏幕。大概它是带宽受限的,因此每次发送整个位图都不是一种选择。 对吗???如果是这样,那才是真正的问题。
标签: c# winapi off-screen wm-paint