【问题标题】:wxWidgets include image during compile timewxWidgets 在编译时包含图片
【发布时间】:2018-08-10 04:11:34
【问题描述】:

我一直在尝试用一个带有图片的按钮制作一个简单的 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

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

【问题讨论】:

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


    【解决方案1】:

    两种可能性...第 1 种是最简单的。看代码写了好久,所以细节比较模糊。

    1. 在 Visual Studio 的解决方案资源管理器中,将图像添加到 resource files。假设资源的名称是sample.rc。然后就可以这样设置主图标了……

      SetIcon(wxICON(sample));
      

    必须使用方法 1 才能让 MS Windows Explorer 显示主图标。我不记得如何将 .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”,Explorer 不会使用它们。为了避免这种情况, 确保将用作主应用程序的图标 图标的名称按字母顺序在“wxICON”之前。

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

    【讨论】:

    • 谢谢,但是您将如何在程序中中包含图像? (不是程序的图标)我已将 PNG 添加到资源文件中(据我所知),但程序在运行时仍然需要图像。
    • 使用 wxBITMAP_PNG(sample_pic)
    【解决方案2】:

    你应该这样做:

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

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

    【讨论】:

    • 谢谢!我从来没有考虑过将 .xpm 放在源代码文件而不是资源文件中的想法。这会将图像嵌入到 .exe 中并解决问题!
    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多