C++ wxWidgets在编译时包含图像

C++ wxWidgets在编译时包含图像,c++,visual-c++,runtime,wxwidgets,compile-time,C++,Visual C++,Runtime,Wxwidgets,Compile Time,我一直在尝试制作一个简单的wxWidgets程序,只需一个带有图片的按钮。我已经能够很容易地制作带有图像的按钮,但是当包含它时,我的问题就出现了 到目前为止,我只能在运行时获取映像(映像必须与.exe文件位于同一文件夹中;否则,我会遇到错误2:系统找不到指定的文件)。使用这种方法,我没有问题——程序运行得很好。但是,我想做的是#包含该文件,以便在编译时嵌入它,这样它就不需要在运行时可用 我尝试了#包括该文件(作为.png和作为.xpm),也尝试了将其添加到资源包括中(这是在Visual Stud

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

到目前为止,我只能在运行时获取映像(映像必须与.exe文件位于同一文件夹中;否则,我会遇到错误2:系统找不到指定的文件)。使用这种方法,我没有问题——程序运行得很好。但是,我想做的是#包含该文件,以便在编译时嵌入它,这样它就不需要在运行时可用

我尝试了#包括该文件(作为.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

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

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

  • 在Visual Studio的解决方案资源管理器中,将图像添加到
    资源文件中。假设资源的名称为
    sample.rc
    。然后可以像这样使用它来设置主图标

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

  • 在发现VS资源(.rc)文件之前,我就是这样做的。“手动”将文件映像编译到程序中。换句话说,编写一个程序来读取映像文件并在.cpp文件中生成逐位拷贝。然后将该.cpp编译到程序中。在这里,我将文件图像作为一个名为dj::main\u cursor的对象保存在内存中。请注意,内存中的版本是.cur文件的逐位副本

    dj::captured_file &c1file(dj::main_cursor);
    wxMemoryInputStream cistr(c1file.contents, c1file.size);
    cursor1 = wxCursor(wxImage(cistr, wxBITMAP_TYPE_CUR));
    
    仅供参考,我定义了结构dj::captured_文件,如下所示:

    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)
         {}
    };
    
  • 另见

    我找到了一些其他文档

    资源和应用程序图标使用wxMSW的所有应用程序 具有Windows资源文件(.rc扩展名),此文件应 include/wx/msw/wx.rc文件,该文件定义用户使用的资源 wxWidgets本身

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


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

  • 在Visual Studio的解决方案资源管理器中,将图像添加到
    资源文件中。假设资源的名称为
    sample.rc
    。然后可以像这样使用它来设置主图标

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

  • 在发现VS资源(.rc)文件之前,我就是这样做的。“手动”将文件映像编译到程序中。换句话说,编写一个程序来读取映像文件并在.cpp文件中生成逐位拷贝。然后将该.cpp编译到程序中。在这里,我将文件图像作为一个名为dj::main\u cursor的对象保存在内存中。请注意,内存中的版本是.cur文件的逐位副本

    dj::captured_file &c1file(dj::main_cursor);
    wxMemoryInputStream cistr(c1file.contents, c1file.size);
    cursor1 = wxCursor(wxImage(cistr, wxBITMAP_TYPE_CUR));
    
    仅供参考,我定义了结构dj::captured_文件,如下所示:

    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)
         {}
    };
    
  • 另见

    我找到了一些其他文档

    资源和应用程序图标使用wxMSW的所有应用程序 具有Windows资源文件(.rc扩展名),此文件应 include/wx/msw/wx.rc文件,该文件定义用户使用的资源 wxWidgets本身

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


    以下是您应该如何做:

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

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

    以下是您应该如何进行编译:

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

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

    谢谢,但如何在程序中包含图像以供使用?(不是程序的图标)我已经将PNG添加到了资源文件中(据我所知),但是程序在运行时仍然需要该图像。使用wxBITMAP_PNG(示例图片)谢谢,但是您如何在程序中包含图像以供使用?(不是程序的图标)我已经将PNG添加到了资源文件中(据我所知),但是pr