2012-08-29 80 views
0

我對wxWidgets相當陌生,所以請耐心等待。假設我有一個10Kx10K的圖像,而我的wxScrolledWindow的大小爲640x480。我將整個圖像加載到我在繪圖函數中使用的wxBitmap中。如何正確繪製一個巨大的圖像

現在,在我的OnPaint功能我剛纔說

wxPaintDC dc(this); 
dc.DrawBitmap(_Bitmap, 0, 0); 

這一定程度上適用於前幾個油漆但很快窗口內容是無序和文物出現。當我非常快速地來回移動滾動條時,發生的速度非常快。

我在Windows 7機器上使用最新的wxWidgets。

那麼,我該如何改進自己的繪畫代碼呢?

非常感謝, 基督教

回答

0

由於Ravenspoint好心指出,對wxWidgets的文章'維基。所以根據這篇文章,有兩件事情需要發生。首先用一個空函數覆蓋EVT_ERASE_BACKGROUND。

void Canvas::EraseBackground(wxEraseEvent& WXUNUSED(event)) 
{ 
} 

第二個實現一個基本的雙緩衝方案。這是我如何做到的。

void Canvas::OnPaint(wxPaintEvent& WXUNUSED(event)) 
{ 
    int x, y; 
    GetViewStart(&x, &y); 
    wxRect Client_Area = GetClientRect(); 

    int width = Client_Area.width; 
    int height = Client_Area.height; 

    wxBitmap Current = _Bitmap.GetSubBitmap(wxRect(x * 10, y * 10, width, height)); 

    wxPaintDC dc(this); 
    dc.DrawBitmap(Current, 0, 0, false); 
} 

我對x和y的滾動速率設置爲10.這就是爲什麼我乘以視圖起始座標。

任何更多的見解是非常受歡迎的。

感謝, 基督教

+0

這看起來像可能工作。但是,似乎您正在爲每個油漆複製位圖兩次 - 一次是「當前」,然後是「當前」,然後是顯示上下文。如果您使用wxBufferedPaintDC,則可能會看到改進,並減少代碼量。 – ravenspoint

+0

當我只是做wxBufferedPaintDC dc(this); dc.DrawBitmap(_Bitmap,0,0,false);它不起作用。你能告訴我什麼是錯的嗎?謝謝! – chhenning

3

使用10000x10000 wxBitmap是本身就是一個壞主意,它可能只是不能被一個較舊的系統上創建(這是視頻RAM 400MiB!)。完全繪製它純屬瘋狂。

我不知道您的數據來自哪裏,但在典型的例如一張要顯示在屏幕上的地圖,你應該把它分解成多個tile,將屏幕上當前可見的tile轉換爲wxBitmap(或其中的幾個),然後只繪製這些地圖。

然後您可以通過使用雙緩衝優化繪圖(這是Windows 7中相對無用的是雙緩衝的一切對自己)否則,但你應該使用一個合理大小的後備存儲位圖。