3

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

运行时错误窗口

这是代码:

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

任何帮助表示赞赏。

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

第二个错误

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

4

2 回答 2

5

你的工作目录是什么?

如果您正在使用 Visual Studio 并使用界面(F5 或 ctrl-F5 或工具栏中的小运行按钮)运行,那么您的工作目录就是包含项目文件的文件夹。所以尝试在那里复制你的图像文件。

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

通常,为了避免此类问题,我更改了项目属性,以便可执行文件不存储在构建文件夹之一中,而是存储在一个新文件夹中(我通常称之为“bin”——我的 unix 根目录正在显示!)并更改调试属性,使工作目录为 bin 文件夹。

这种技术有几个优点:

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

恕我直言,这在维护非默认项目属性方面是非常值得的。

于 2013-06-13T14:51:18.393 回答
1

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

其次,虽然像您一样显式添加处理程序非常好,但我建议您只调用wxInitAllImageHandlers(),因为它更简单并且没有真正的缺点,除非您希望创建尽可能小的程序。

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

于 2013-06-13T18:11:15.790 回答