У меня есть следующий код, приведенный в книге "Кросс-платформенное графическое программирование с помощью 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;
}
Этот код не показывает, как загрузить растровое изображение, поэтому после некоторого поиска в google я придумал:
wxBitmap m_bitmap;
bool result = m_bitmap.LoadFile("D:\image.png", wxBITMAP_TYPE_PNG);
Но это возвращает логический результат false
что означает, что функция LoadFile
не смогла загрузить файл. Я также попытался загрузить файл BMP, который тоже не работает.
Еще одна проблема, с которой я wxEffects
заключается в том, что wxEffects
отмечен устаревшим предупреждением.
Вам нужно зарегистрировать обработчик изображения PNG, чтобы иметь возможность загружать растровые изображения PNG. Самый простой способ - вызвать функцию wxInitAllImageHandlers() в какой-то момент во время инициализации вашего приложения, например, в переопределенном MyApp::OnInit()
.
Что касается устаревших wxEffects
, это происходит только потому, что книга довольно старая, и с тех пор изменилось немало вещей. Я настоятельно рекомендую вам ознакомиться с обзором важных изменений, если вы используете wxWidgets 3.0. И если вы этого не сделаете, я рекомендую вам еще сильнее использовать его.
MyApp::OnInit()
является функцией переопределения? Например, даже если я удаляюvirtual
программа все равно работает отлично.virtual
не обязателен. Я рекомендую использоватьoverride
C ++ 11, если можете.