2014-02-22 28 views
0
使用位圖

我在書中給出的「跨平臺GUI編程wxWidgets的」下面的代碼,我正在讀:在wxWidgets中

BEGIN_EVENT_TABLE(MyWindow, wxWindow) 
    EVT_ERASE_BACKGROUND(MyWindow::OnErase) 
END_EVENT_TABLE() 

void MyWindow::OnErase(wxEraseEvent& event) 
{ 
    wxClientDC* clientDC = NULL; 
    if (!event.GetDC()) 
     clientDC = new wxClientDC(this); 

    wxDC* dc = clientDC ? clientDC : event.GetDC() ; 

    wxSize sz = GetClientSize(); 
    wxEffects effects; 
    effects.TileBitmap(wxRect(0, 0, sz.x, sz.y), *dc, m_bitmap); 

    if (clientDC) 
     delete clientDC; 
} 

此代碼不顯示我該怎麼辦加載一個位圖,這樣後谷歌一些搜索,我想出了:

wxBitmap m_bitmap; 
bool result = m_bitmap.LoadFile("D:\image.png", wxBITMAP_TYPE_PNG); 

但這返回false這意味着功能LoadFile是無法加載文件中的布爾結果。我也嘗試加載一個失敗的BMP文件。

我遇到的另一個問題是wxEffects被編譯器警告標記爲不贊成使用。

回答

1

您需要註冊PNG圖像處理程序才能加載PNG位圖。最簡單的方法是在應用程序初始化期間的某個時候調用wxInitAllImageHandlers()函數,例如在你重寫的MyApp::OnInit()

至於wxEffects被棄用,這僅僅是因爲這本書是相當古老的,從那以後不少事情發生了變化。如果您使用的是wxWidgets 3.0,我強烈建議您閱讀overview of important changes。如果你不這樣做,我建議你使用它更強。

+0

你可以評論爲什麼'MyApp :: OnInit()'是一個覆蓋函數嗎?例如。即使我刪除了'虛擬',那麼程序看起來仍然工作得很好。 – cpx

+0

這是C++,'virtual'是可選的。如果可以,我推薦使用C++ 11'override'。 –