我最近开始使用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)以及源代码目录中,但它仍然没有看到它。
答案 0 :(得分:5)
你的工作目录是什么?
如果您正在使用visual studio并使用界面(F5或ctrl-F5或工具栏中的小运行按钮)运行,那么您的工作目录是包含项目文件的文件夹。因此,请尝试将图像文件复制到那里。
或者打开一个命令窗口,cd到你的一个构建目录,然后从命令行运行你的应用程序。
一般来说,为了避免这种问题,我改变了项目属性,以便可执行文件不存储在其中一个构建文件夹中,而是存储在一个新文件夹中(我通常称之为'bin' - 我的unix根目录是显示!)并更改调试属性,以便工作目录是bin文件夹。
这项技术有几个优点:
恕我直言,这非常值得维护非默认项目属性。
答案 1 :(得分:1)
首先,为了避免wxToolBar
内部的问题,请始终检查LoadFile()
的返回代码,或者使用wxBitmap::IsOk()
检查位图是否已成功加载。
其次,虽然像你一样明确地添加处理程序是完全正常的,但我建议只调用wxInitAllImageHandlers()因为它更简单并且没有真正的缺点,除非你想要创建尽可能小的程序。
最后,为了解决您的真实问题,该文件显然不存在于您加载它的路径中。当然,您可以通过小心不要在程序中直接更改工作(或在更改后恢复它)并将文件放在正确的位置来解决这个问题。但是,正如您所发现的那样,这容易出错,因此更好的想法是始终使用资源的完整路径。要构建它们,您会发现wxStandardPaths 非常有用,尤其是GetResourcesDir()方法。