问题涉及:Drawing on a paintbox - How to keep up with mouse movements without delay?
我正要问一个问题,即如何只重绘一部分绘画框而又不使整个绘画框无效,这在进行大量绘制时或在我的情况下在绘制许多图块时很慢屏幕。
在Peter Kostov上方的链接中,他的评论之一简要地谈到了该主题:
您可以部分使用BitBlt屏幕外位图(仅在更改了它的区域内)。这将大大提高性能。
我的图形技能有限,并且以前从未真正使用过BitBlt
,但是在发布此问题后,我将阅读有关它的更多信息。
话虽如此,我想知道您如何确定位图的区域是否已更改?这是否涉及一些简单的事情,或者说在确定哪些区域发生了变化方面还有更多的魔力?
现在,我仍然直接在绘画盒上绘画,但是一旦绘制到屏幕外缓冲区位图,我的下一步就是优化绘画,上面的注释听起来完全符合我的需要,只有确定的区域才使我有些困惑。
当然,如果还有其他方法可以这样做,请随时发表评论。
谢谢。
最佳答案
如果绘制到屏幕外的BitBlt()
则不必直接使用TBitmap
,而可以使用TCanvas.CopyRect()
代替(内部使用StretchBlt()
)。但是,无论哪种方式,当您只需要使TPaintBox
的一部分(与您绘制的屏幕外位图的部分相对应)无效时,可以直接使用InvalidateRect()
指定TPaintBox
的适当矩形。 >,而不是调用TControl.Invalidate()
(后者会在InvalidateRect()
参数设置为NULL的情况下调用lpRect
)。每当触发TPaintBox.OnPaint
事件时,InvalidateRect()
都会在画布中建立一个裁剪矩形,您在该矩形之外进行的任何绘制都将被忽略。如果要手动优化图形,还可以使用TCanvas.ClipRect
属性确定需要绘制的TPaintBox
矩形,然后从屏幕上的位图复制该部分。
唯一的陷阱是TPaintBox
是TGraphicControl
的后代,因此它没有自己的HWND,您可以将其传递给InvalidateRect()
。您将不得不使用其Parent.Handle
HWND。这意味着您需要在需要时将TPaintBox
相对坐标转换为Parent
相对坐标,反之亦然。