- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题涉及:Drawing on a paintbox - How to keep up with mouse movements without delay?
我打算在某个时候问一个问题:如何仅重新绘制油漆箱的一部分而不使整个油漆箱失效,当正在进行大量绘图时或者在我的情况下,当有大量绘图时,这会很慢在屏幕上绘制的图 block 。
来自上面的链接Peter Kostov在他的评论中确实简短地谈到了这个主题:
you can partly BitBlt the offscreen bitmap (only regions where it is changed). This will improve the performance dramatically.
我的图形技能有限,之前从未真正使用过 BitBlt
,但在发布此问题后我将阅读更多相关内容。
话虽如此,我想知道如何确定位图的区域是否已更改?这是否涉及一些简单的事情,或者是否有更多的魔力可以说涉及确定哪些区域发生了变化?
现在我仍然直接在油漆箱上绘画,但是一旦我绘制到离屏缓冲区位图,我的下一步就是优化绘画,上面的注释听起来完全符合我的需要,只有已更改的确定区域已经混淆我稍微。
当然,如果还有其他方法,请随时发表评论。
谢谢。
最佳答案
您不必使用 BitBlt()
如果您直接绘制到屏幕外的 TBitmap
,则可以使用 TCanvas.CopyRect()
(内部使用 StretchBlt()
)。但无论哪种方式,当您需要仅使 TPaintBox 的一部分(与您绘制的离屏位图部分相对应的部分)无效时,您可以使用 InvalidateRect()
直接指定 TPaintBox
的适当矩形,而不是调用 TControl.Invalidate()
(它使用 调用
参数设置为 NULL)。每当触发 InvalidateRect()
lpRectTPaintBox.OnPaint
事件时,InvalidateRect()
都会在 Canvas 内建立一个剪切矩形,您在该矩形之外进行的任何绘制都将被忽略。如果您想手动优化您的绘图,您可以使用 TCanvas.ClipRect 属性来确定需要绘制的 TPaintBox 的矩形,然后复制该矩形屏幕上位图的一部分。
唯一的问题是 TPaintBox
是 TGraphicControl
后代,因此它没有自己的 HWND 可以传递给 InvalidateRect()
。您必须使用其 Parent.Handle
HWND。这意味着您必须在需要时将 TPaintBox
相对坐标转换为 Parent
相对坐标,反之亦然。
关于delphi - 如何仅使油漆盒/位图的一部分无效以优化其性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25534907/
我需要一个在 Windows-Mobile 上运行的获取签名示例。 (油漆) 如何在 Windows-Mobile 屏幕上绘图 - 并保存图片? 我可以获得示例代码 (C#) 吗? 最佳答案 Open
我是一名优秀的程序员,十分优秀!