wxWidgets包括编译期间的图像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wxWidgets包括编译期间的图像相关的知识,希望对你有一定的参考价值。

我一直试图用一个带有图片的按钮制作一个简单的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号是最简单的。自从我编写我正在查看的代码以来已经很长时间了,所以细节很模糊。

  1. 在Visual Studio,Solution Explorer中,将图像添加到resource files中。假设资源的名称是sample.rc。然后可以像这样使用它来设置主图标...... SetIcon(wxICON(sample));

必须使用方法1才能使MS Windows资源管理器显示主图标。我不记得如何将.rc资源用于其他事情,但它应该很容易理解。

  1. 在我发现VS资源(.rc)文件之前,我就这样做了。 “手动”将文件图像编译到程序中。换句话说,编写一个程序,它将读取一个图像文件,并在.cpp文件中产生逐位复制。然后将.cpp编译到程序中。在这里,我将内存中的文件图像作为名为dj :: main_cursor的对象。请注意,内存中的版本是.cur文件的逐位副本。 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”之前。

http://docs.wxwidgets.org/3.1.0/page_port.html

以上是关于wxWidgets包括编译期间的图像的主要内容,如果未能解决你的问题,请参考以下文章

在创建视图的片段期间为项目列表中的每个项目设置图像[重复]

Visual Studio 2015编译wxWidgets

在Code::Blocks中编译和使用wxWidgets3.0.0教程

Win7 VS2015编译wxWidgets-3.1.0

使用 wxWidgets 库在 linux 中使用 codelite 进行 arm 交叉编译时出错

编译wxWidgets —— windowsvc71bcc32MinGW与命令行