我正在考虑创建一个带有图层的绘图程序,并使用GDI+来显示它们。我想使用GDI+,因为它支持透明性。
问题是,绘制线条到DC非常快,但是直接绘制到位图非常慢。只有在锁定这些位并开始设置像素的情况下,它才会很快。我可以在WM_PAINT事件中绘制多个DC,然后对MemDC的每一层执行DrawBitmap吗?做这件事最好的方法是什么?
谢谢
发布于 2010-05-01 20:46:50
对于绘图程序来说,GDI+当然足够快了。我使用它(来自C#)来制作高速动画(>30fps)。
看起来你想要能够操作单个像素。这在LockBits中非常快,尽管在C#中使用它有点笨拙(需要指针和unsafe标记),但在C++中似乎没有那么难。
您可能不希望从多个层直接复制到paint事件内的控制曲面。相反,此呈现应在屏幕外缓冲区(B1)中完成。在完成所有复制/绘制操作的情况下绘制B1后,将其复制到第二个屏幕外缓冲区(B2),然后使控制曲面无效/刷新。在控件的paint事件中,从B2复制到可见表面。
您不希望使用多步骤绘制操作直接在可见表面上绘制,因为会产生一种闪烁形式(有时屏幕会重新绘制自己,而您的代码只完成了多步操作的一半,因此用户偶尔会看到一个完成了一半的框架)。
可以渲染到单个屏幕外缓冲区,并从该缓冲区复制到paint事件中的可见曲面。这里的主要复杂之处在于,您必须以某种方式处理“流浪”绘制事件,即事件不是由您故意使控件无效引起的,而是由其他原因引起的(比如用户将另一个窗口拖到您的窗口上)。如果你从屏幕外的缓冲区复制到表面,并且缓冲区只绘制了一半,你会得到闪烁。如果在缓冲区绘制完成之前阻塞paint事件,您将在控件上看到“表单拖尾”,这看起来更糟。
解决方案是上面描述的双缓冲方法。流浪(或无效时的非流浪)绘制事件将从B2复制,它始终是完全渲染的并且是最新的-因此没有闪烁。双缓冲确实使用了更多的内存,但是在一个有多个层的绘图程序中,这并不是什么大问题。
https://stackoverflow.com/questions/2749736
复制相似问题