我一直试图用一个带有图片的按钮制作一个简单的wxWidgets程序。我已经能够轻松地制作带有图像的按钮了,但是在包含它时我的问题就出现了。
到目前为止,我只能在运行时获取图像(图像必须与.exe文件位于同一文件夹中;否则,我得到错误2:系统找不到指定的文件)。使用这种方法,我没有问题 - 程序运行正常。但是,我要做的是#include文件,以便在编译时嵌入它,这样它就不需要在运行时可用。
我已经尝试#include文件(包括.png和.xpm),我也尝试将它添加到资源包含(这是在Visual Studio 2017上)。这些都不起作用 - 第一种方法仍然要求图像在同一文件夹中,第二种方法在编译期间失败(据我所知,它无法读取.xpm文件)。
以下是相关代码,如果有帮助:
/*relevant includes*/
#include "happyFace.png" //this isn't working. the file is still needed
||
#include "happyFace.xpm" //ditto
/*I have also tried putting these lines in the resource includes.*/
/*code*/
wxInitAllImageHandlers();
wxBitmap bitmap("happyFace.xpm", wxBITMAP_TYPE_XPM); //only works in same directory at run-time
||
wxBitmap bitmap("happyFace.png", wxBITMAP_TYPE_PNG); //ditto
wxButton *button = new wxButton(this, ID_BMP_BUTTON);
button->SetBitmap(bitmap);
//the rest of the button programming and stuff
对不起,如果我没有提供足够的信息;如有必要,我可以提供更多。我真的很感激任何帮助。谢谢!
这是你应该怎么做的:
#include "happyFace.xpm"
wxBitmap bitmap = wxBitmap( happyFace ); // assuming the variable name is "happyFace" inside the xpm
然后你将像往常一样使用位图对象。假设文件happyFace.xpm可用于编译。
两种可能性...... 1号是最简单的。自从我编写我正在查看的代码以来已经很长时间了,所以细节很模糊。
resource files
中。假设资源的名称是sample.rc
。然后可以像这样使用它来设置主图标......
SetIcon(wxICON(sample));
必须使用方法1才能使MS Windows资源管理器显示主图标。我不记得如何将.rc资源用于其他事情,但它应该很容易理解。
dj::captured_file &c1file(dj::main_cursor);
wxMemoryInputStream cistr(c1file.contents, c1file.size);
cursor1 = wxCursor(wxImage(cistr, wxBITMAP_TYPE_CUR));
仅供参考,我定义了结构dj :: captured_file,如下所示:
struct captured_file {
const char *name;
const unsigned long size;
const void *contents;
captured_file(const char*fn, size_t sz, const void*c)
: name(fn)
, contents(c)
, size(sz)
{}
};
另见Embedding PNG Images into Windows RC Files
我找到了一些其他文档。
资源和应用程序图标使用wxMSW的所有应用程序都应该有一个Windows资源文件(.rc扩展名),该文件应该包含include / wx / msw / wx.rc文件,该文件定义了wxWidgets本身使用的资源。
除此之外,wx.rc定义了一些标准图标,所有标准图标的名称都以“wx”前缀开头。这通常可以确保应用程序自己的资源文件中定义的任何图标按字母顺序排在它们之前,这很重要,因为Explorer(Windows shell)按字母顺序选择第一个图标作为应用程序图标,在查看其中的文件时显示文件管理器。因此,如果应用程序中定义的所有图标都以“x”,“y”或“z”开头,则资源管理器将不会使用它们。为避免这种情况,请确保用作主应用程序图标的图标按字母顺序排在“wxICON”之前。