2010-05-01 75 views
2

我正在考慮創建一個圖層程序,並使用GDI +來顯示它們。我想使用GDI +,因爲它支持透明度。圖層與GDI +

事情是,繪製直流線是非常快的,但直接繪製到位圖是非常緩慢的。只有鎖定位並開始設置像素,速度纔會很快。我可以在WM_PAINT事件中繪製多個DC,然後對每個層執行DrawBitmap到MemDC?這是怎麼回事?

謝謝

回答

2

GDI +對繪圖程序來說肯定足夠快。我使用它(來自C#)進行高速動畫(> 30 fps)。

看來你希望能夠操縱單個像素。這是非常與LockBits快速,雖然它在C#中使用稍微笨重(需要一個指針和unsafe標籤),但它似乎並不像在C++中那麼困難。

您可能不希望從繪圖事件中的多個圖層直接複製到控制界面。相反,這個渲染應該完成到一個離屏緩衝區(B1)。在完成所有複製/繪製操作後繪製B1後,將其複製到第二個屏幕外緩衝區(B2),然後使控制界面無效/刷新。在控件的繪畫事件中,您從B2複製到可見曲面。

由於會形成閃爍形式(有時候屏幕會重新繪製自己,而您的代碼只是通過多步操作的一部分),所以您不想直接在多步驟繪圖操作中直接繪製可見曲面,所以用戶看到一個偶爾的半完成幀)。

您可以渲染到單個屏幕外的緩衝區,並將其複製到paint事件中的可見表面。這裏的主要難題是你必須以某種方式處理「流浪」的繪畫事件,即不是由你故意使控件失效而是由其他東西(比如用戶拖拽另一個窗口)造成的事件。如果您從屏幕外緩衝區複製到表面,並且緩衝區只是一半繪製的,則會出現閃爍。如果您在繪畫事件中阻塞,直到緩衝區繪製完成,您會在控件上看到「窗體路徑」,這看起來更糟糕。

該解決方案是上述雙緩衝方法。雜散(或無效時,無效)繪製事件將從B2中複製,該B2總是完全呈現並且是最新的 - 因此不會閃爍。雙緩衝確實使用了更多的內存,但是在一個有多層的繪圖程序中,這並不是什麼大問題。