2013-06-13 3 views
3

Недавно я начал работать с WxWidgets (2.9.4) и работал над учебником, который я нашел, но мне кажется, что я не могу загрузить изображения. Я уже правильно использовал обработчик (для PNG), и проблема возникает во время выполнения. Ниже приведено изображение всплывающего окна, которое отображается при попытке запустить программу.WxWidgets - Не удалось загрузить изображения

Run-time error window

Вот код:

wxPNGHandler *handler = new wxPNGHandler; 
wxImage::AddHandler(handler); 

wxBitmap exit; 

exit.LoadFile(wxT("exit.png"), wxBITMAP_TYPE_PNG); 

wxToolBar *toolbar = CreateToolBar(); 
toolbar->AddTool(wxID_EXIT, exit, wxT("Exit")); 
toolbar->Realize(); 

Connect(wxID_EXIT, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(mainWindow::exitProg)); 

Любая помощь приветствуется.

EDIT: Я забыл упомянуть, что, когда я нажимаю Отмена, это происходит:

Second Error

Я поместил файл exit.png в директории сборки (/ Debug/или выпуска), а также исходный код, но он все еще должен его видеть.

+0

Это звучит как проблема пути, ссылающаяся на изображения - первая ошибка указывает на то, что формат недействителен, что довольно легко объяснить, если не найти файл. – Petesh

+0

Обратите внимание, что вы можете нажать 'Ctrl + C' в любом из сообщений Windows, включая поле подтверждения, показанное wxWidgets, для копирования его текста в буфер обмена. Нет необходимости делать скриншоты для вас - и текст гораздо читабельнее для других. –

+0

@VZ. Хорошо, я этого не знал. Спасибо за совет. –

ответ

5

Какой у вас рабочий каталог?

Если вы используете визуальную студию и работаете с интерфейсом (F5 или ctrl-F5 или маленькая кнопка запуска на панели инструментов), то ваш рабочий каталог представляет собой папку, содержащую файл проекта. Поэтому попробуйте скопировать файл изображения.

Или откройте окно команд, cd в один из ваших каталогов сборки и запустите приложение из командной строки.

В общем, чтобы избежать такого рода проблем, я изменяю свойства проекта, чтобы исполняемый файл НЕ хранился в одной из папок сборки, а в новой папке (которую я обычно называю «bin» - мои корни unix покажут!), а также измените свойства отладки, чтобы рабочий каталог был папкой bin.

Есть несколько преимуществ этого метода:

  • Оба выпуска и trhe отладки версии использовать ту же папку, так что вам нужно только одну копию любого дополнительного файла, как файл изображения.
  • Легко видеть исполняемый файл и дополнительные файлы в рабочем каталоге, не отвлекаясь на все .obj файлы, которые в конечном итоге в сборки папки

ИМХО это хорошо стоит немного больше неприятностей в поддержании нестандартные свойства проекта.

+0

Большое спасибо! Я не знал, что VS работает в каталоге проекта, я думал, что он запущен в каталоге сборки (/ Debug,/Release и т. Д.). Теперь он отлично работает! –

1

Прежде всего, чтобы избежать проблем, глубоко внутри wxToolBar, всегда проверять код возврата LoadFile() или, в качестве альтернативы, используйте wxBitmap::IsOk(), чтобы проверить, был успешно загружен растровый.

Во-вторых, при добавлении обработчика в явном виде, как и вы, это прекрасно, я бы рекомендовал просто позвонить wxInitAllImageHandlers(), поскольку он проще и не имеет реальных недостатков, если вы не хотите создать самую маленькую возможную программу.

Наконец, чтобы решить вашу реальную проблему, файл явно не существует на пути, по которому вы его загружаете. Разумеется, вы можете решить эту проблему, не изменяя свою работу напрямую (или восстанавливая ее после ее изменения) в своей программе и помещая файл в нужное место. Но это, как вы обнаружили, подвержено ошибкам, поэтому лучше всего всегда использовать полные пути к вашим ресурсам.Чтобы построить их, вы найдете wxStandardPaths полезным, в частности его метод GetResourcesDir().

Смежные вопросы