WxWidgets - 无法加载图像

时间:2013-06-13 14:32:18

标签: c++ wxwidgets

我最近开始使用WxWidgets(2.9.4)并正在处理我发现的教程,但似乎我无法加载任何图像。我已经正确使用了处理程序(用于PNG),问题发生在运行时。下面是尝试运行程序时显示的弹出窗口的图像。

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));

感谢任何帮助。

编辑:我忘了提到当我点击取消时,会发生这种情况:

Second Error

我将exit.png文件放在构建目录(/ Debug或/ Release)以及源代码目录中,但它仍然没有看到它。

2 个答案:

答案 0 :(得分:5)

你的工作目录是什么?

如果您正在使用visual studio并使用界面(F5或ctrl-F5或工具栏中的小运行按钮)运行,那么您的工作目录是包含项目文件的文件夹。因此,请尝试将图像文件复制到那里。

或者打开一个命令窗口,cd到你的一个构建目录,然后从命令行运行你的应用程序。

一般来说,为了避免这种问题,我改变了项目属性,以便可执行文件不存储在其中一个构建文件夹中,而是存储在一个新文件夹中(我通常称之为'bin' - 我的unix根目录是显示!)并更改调试属性,以便工作目录是bin文件夹。

这项技术有几个优点:

  • 发行版和版本调试版都使用相同的文件夹,因此您只需要一个额外文件的副本,例如图像文件。
  • 很容易看到工作目录中的可执行文件和额外文件,而不会被最终位于构建文件夹中的所有.obj文件分心。

恕我直言,这非常值得维护非默认项目属性。

答案 1 :(得分:1)

首先,为了避免wxToolBar内部的问题,请始终检查LoadFile()的返回代码,或者使用wxBitmap::IsOk()检查位图是否已成功加载。

其次,虽然像你一样明确地添加处理程序是完全正常的,但我建议只调用wxInitAllImageHandlers()因为它更简单并且没有真正的缺点,除非你想要创建尽可能小的程序。

最后,为了解决您的真实问题,该文件显然不存在于您加载它的路径中。当然,您可以通过小心不要在程序中直接更改工作(或在更改后恢复它)并将文件放在正确的位置来解决这个问题。但是,正如您所发现的那样,这容易出错,因此更好的想法是始终使用资源的完整路径。要构建它们,您会发现wxStandardPaths 非常有用,尤其是GetResourcesDir()方法。