使用GDI +的图层

时间:2010-05-01 11:29:34

标签: c++ gdi+ bitmap

我正在考虑使用图层创建绘图程序,并使用GDI +来显示它们。我想使用GDI +,因为它支持透明度。

问题是,向DC绘制线条非常快,但直接绘制到位图非常慢。只有锁定位并开始设置像素才会很快。我可以在我的WM_PAINT事件中绘制到多个DC,然后只为每个层执行DrawBitmap到MemDC吗?什么是最好的解决方法?

由于

1 个答案:

答案 0 :(得分:3)

GDI +对于绘图程序来说肯定足够快。我使用它(来自C#)进行高速动画(> 30 fps)。

您似乎希望能够操纵单个像素。使用LockBits,这非常快,虽然在C#中使用它有点笨重(需要一个指针和unsafe标签),但在C ++中似乎并不那么困难

您可能不希望在绘图事件中直接从多个图层复制到控制界面。相反,应该对屏幕外缓冲区(B1)进行此渲染。完成所有复制/绘制操作后绘制B1后,将其复制到第二个屏幕外缓冲区(B2),然后使控制界面无效/刷新。在控件的绘制事件中,您从B2复制到可见表面。

您不希望通过多步绘制操作直接在可见表面上绘制,因为会产生一种闪烁形式(有时屏幕将重新绘制,而您的代码只是在多步操作的中途,所以用户偶尔看到半成品框架)。

您可以渲染到单个屏幕外缓冲区,并从中复制到paint事件中的可见表面。这里的主要复杂因素是你必须以某种方式处理“流浪”油漆事件,即不是由你故意使控件无效而是由其他东西引起的事件(比如用户将另一个窗口拖到你的上面)。如果从屏幕外缓冲区复制到表面并且缓冲区只是中途绘制,则会出现闪烁。如果您在绘制事件中阻塞,直到缓冲区绘制完成,您将在控件上看到“表单轨迹”,这看起来更糟。

解决方案是上述双缓冲方法。当你失效时,杂散(或非杂散的)绘制事件将从B2复制,它总是完全呈现并且是最新的 - 因此没有闪烁。双缓冲确实会占用更多内存,但在绘图程序中无论如何都有多层,这不是什么大问题。