wxWidgets包括编译期间的图像

时间:2018-03-02 00:06:49

标签: c++ visual-c++ runtime wxwidgets compile-time

我一直试图制作一个简单的wxWidgets程序,只需一个带有图片的按钮。我已经能够轻松地制作带有图像的按钮了,但是包含它时我的问题就出现了。

到目前为止,我只能在运行时获取图像(图像必须与.exe文件位于同一文件夹中;否则,我收到错误2:系统无法找到文件指定)。使用这种方法,我没有问题 - 程序运行正常。但是,我尝试做的是#include文件,以便在编译时嵌入它,这样它就不需要在运行时可用。

我已尝试#include该文件(包括.png和.xpm),我也尝试将其添加到资源包含(这是在Visual Studio 2017上)。这些都不起作用 - 第一种方法仍然要求图像在同一文件夹中,第二种方法在编译期间失败(据我所知,它无法读取.xpm文件)。 / p>

以下是相关代码,如果有帮助:

/*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

很抱歉,如果我没有提供足够的信息;如有必要,我可以提供更多。我真的很感激任何帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

两种可能性......数字1最简单。我编写我正在查看的代码已经有很长一段时间了,所以细节很模糊。

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

    SetIcon(wxICON(sample));
    
  2. 必须使用方法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)
           {}
      };
      
    2. 另见Embedding PNG Images into Windows RC Files

      我找到了一些其他文档。

        

      资源和应用程序图标使用wxMSW的所有应用程序都应该   有一个Windows资源文件(.rc扩展名),这个文件应该   include include / wx / msw / wx.rc文件,它定义了所使用的资源   wxWidgets本身。

           

      除此之外,wx.rc定义了一些标准图标,所有这些图标都是如此   名称以“wx”前缀开头。这通常可以确保   之前在应用程序自己的资源文件中定义的任何图标   它们按字母顺序排列,这很重要,因为Explorer   (Windows shell)按字母顺序选择第一个图标以用作   查看其中的文件时显示的应用程序图标   文件管理器。因此,如果应用程序中定义的所有图标都会启动   使用“x”,“y”或“z”时,Explorer不会使用它们。要避免这种情况,   确保用作主要应用程序的图标   icon按字母顺序在“wxICON”之前有一个名称。

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

答案 1 :(得分:1)

您应该如何做到这一点:

#include "happyFace.xpm"
wxBitmap bitmap = wxBitmap( happyFace ); // assuming the variable name is "happyFace" inside the xpm

然后你将像往常一样使用位图对象。假设文件happyFace.xpm可用于编译。