我希望能够将一个控件呈现到位图中,以便快速访问它。
不幸的是,Control.DrawToBitmap
似乎会将调用它的整个控件(包括所有子控件)都绘制出来。在内部,它使用自己提供的 DC 发送 WM_PRINT 消息到一个临时位图上,然后将这个位图复制到用户提供的位图上。这对我来说是不可接受的,我宁愿在需要更新位图时进行操作,以尽量减少性能影响。
在理想的情况下,我希望窗体的行为就像它在屏幕上是可见的(但它实际上是看不见的)。这意味着如果某个控件的 Text
属性被更改,窗体就会部分失效。捕获相关的消息/事件将允许我指定窗体要绘制的 DC 或者简单地将窗体的 DC 复制到我的 DC 上。
我已经尝试了一些方法:
OnPaint
中的PaintEventArgs
参数似乎保存了一个成员 savedGraphicsState,也许可以用它来找出哪些部分不需要失效。- 将窗体显示在屏幕之外。这样控件就不会被绘制,但是这种方法不够可靠。
- 手动调用窗口的 RedrawWindow(),效果与上一种类似。
DrawToBitmap
(即WM_PRINT
消息)对您的使用不可接受。您是担心性能吗?将绘图输出到位图中的速度几乎不可能比绘制到屏幕上慢。 - Cody Gray