使用wxWidgets for C++从资源文件中静态装载图像

简介:
本文为原创,如需转载,请注明作者和出处,谢谢!

    在wxWidgets中装载图像是非常容易的,但是如果将图像文件和可执行文件放到一起,在发布时只需要发布可执行文件,要实现这种功能,一般可以使用资 源文件来解决。在windows下的资源文件的源文件是*.rc,编译后叫*.res。在linux下类似,源文件为*.xrc,编译后叫*.xres。 但它们是xml格式的,要装载这种资源文件也得动态进行装载。相当于配置文件。

    如果想将其直接编译进可执行文件。需要一个工具wxrc。这个工作在wxWidgets中的untils目录中,可自己编译。可使用这个工具将*.xrc 生成c++代码,如果是图像,就将其转换成字符数组。然后和其它程序一起进行编译。可使用wxrc -c main.xrc -v -o main.h

main.xrc的格式如下:
<? xml version="1.0" ?> 
< resource  version ="2.3.0.1" >    
    < object  class ="wxBitmap"  name ="background" >background.jpg </ object > 
</ resource >

生成的main.h的格式如下:
//
//  This file was automatically generated by wxrc, do not edit by hand.
//

#include <wx/wxprec.h>

#ifdef __BORLANDC__
     #pragma hdrstop
#endif

#include <wx/filesys.h>
#include <wx/fs_mem.h>
#include <wx/xrc/xmlres.h>
#include <wx/xrc/xh_all.h>

static size_t xml_res_size_0 =  55966;
static unsigned  char xml_res_file_0[] = {
255, 216, 255, 224, 0, 16, 74, 70, 73, 70, 0, 1, 2, 0, 0, 100, 0, 100, 0, 0, 255, 236, 0, 17, 68,
117, 99, 107, 121, 0, 1, 0, 4, 0, 0, 0, 60, 0, 0, 255, 238, 0, 14, 65, 100, 111, 98, 101, 0, 100,
192, 0, 0, 0, 1, 255, 219, 0, 132, 0, 6, 4, 4, 4, 5, 4, 6, 5, 5, 6, 9, 6, 5, 6, 9, 11, 8, 6, 6, 8, 11,
12, 10, 10, 11, 10, 10, 12, 16, 12, 12, 12, 12, 12, 12, 16, 12, 14, 15, 16, 15, 14, 12, 19, 19,
20, 20, 19, 19, 28, 27, 27, 27, 28, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 7, 7, 7, 13, 12,
13, 24, 16, 16, 24, 26, 21, 17, 21, 26, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 255, 192, 0, 17, 8, 2, 201, 3, 248, 3, 1, 17, 0, 2,
.
.
102, 222, 191, 202, 130, 94, 195, 45, 21, 39, 169, 149, 113, 241, 11, 45, 173, 84, 25, 120,
94, 18, 190, 190, 196, 107, 2, 216, 129, 52, 90, 4, 128, 1, 130, 160, 201, 16, 36, 0, 147, 0,
84, 68, 164, 164, 47, 80, 44, 0, 96, 168, 202, 0, 201, 145, 130, 178, 49, 229, 32, 127, 255,
217};

static size_t xml_res_size_1 =  161;
static unsigned  char xml_res_file_1[] = {
60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101,
110, 99, 111, 100, 105, 110, 103, 61, 34, 85, 84, 70, 45, 56, 34, 63, 62, 10, 60, 114, 101,
115, 111, 117, 114, 99, 101, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 50, 46, 51, 46,
48, 46, 49, 34, 62, 10, 32, 32, 60, 111, 98, 106, 101, 99, 116, 32, 99, 108, 97, 115, 115, 61,
34, 119, 120, 66, 105, 116, 109, 97, 112, 34, 32, 110, 97, 109, 101, 61, 34, 98, 97, 99, 107,
103, 114, 111, 117, 110, 100, 34, 62, 114, 101, 115, 111, 117, 114, 99, 101, 115, 46, 104,
36, 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 46, 106, 112, 103, 60, 47, 111, 98, 106,
101, 99, 116, 62, 10, 60, 47, 114, 101, 115, 111, 117, 114, 99, 101, 62, 10};

void InitXmlResource()
{

     //  Check for memory FS. If not present, load the handler:
    {
        wxMemoryFSHandler::AddFile(wxT( " XRC_resource/dummy_file "), wxT( " dummy one "));
        wxFileSystem fsys;
        wxFSFile *f = fsys.OpenFile(wxT( " memory:XRC_resource/dummy_file "));
        wxMemoryFSHandler::RemoveFile(wxT( " XRC_resource/dummy_file "));
         if (f) delete f;
         else wxFileSystem::AddHandler( new wxMemoryFSHandler);
    }

    wxMemoryFSHandler::AddFile(wxT( " XRC_resource/resources.h$background.jpg "), xml_res_file_0, xml_res_size_0);
    wxMemoryFSHandler::AddFile(wxT( " XRC_resource/resources.h$main.xrc "), xml_res_file_1, xml_res_size_1);
    wxXmlResource::Get()->Load(wxT( " memory:XRC_resource/resources.h$main.xrc "));
}

其后在主程序中调用 InitXmlResource函数。

要想装载这个background.jpg图,使用以下语句:
    wxXmlResource::Get()->InitAllHandlers();     
wxBitmap background = wxXmlResource::Get()->LoadBitmap(_T("background"));
m_pStaticBitmap = new wxStaticBitmap(this, wxID_ANY, background, wxPoint(0, 0), wxSize(1024, 768));
但要注意使用wxStaticBitmap时应在wxFrame中的OnSize中加入
    m_pStaticBitmap->Refresh();
否则在windows下当窗口缩小后再放大时,图像显示有一些问题。但在linux下可以不加这条语句。
本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2008/05/13/1195638.html如需转载请自行联系原作者

银河使者
相关文章
|
6月前
|
存储 数据采集 数据可视化
【C++】医院PACS医学图像存储和传输系统源码
图像后处理与重建 •MPR\CPR(三维多平面重建) •VRT(三维容积重建) •SSD(三维表面重建) •VE(虚拟内窥镜) •MIP(最大密度投影)、MinIP(最小密度投影) •CalSCore(心脏图像冠脉钙化积分)
92 3
|
6月前
|
算法 安全 Java
【C/C++ 实用工具】静态代码检测工具和平台的一览
【C/C++ 实用工具】静态代码检测工具和平台的一览
330 0
|
6月前
|
XML 安全 IDE
【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全
【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全
1042 2
|
6月前
|
存储 数据处理 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换由Mono10转换为Mono8(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换由Mono10转换为Mono8(C++)
109 0
|
3月前
|
传感器 定位技术 C++
基于C++的GDAL用空白栅格填充长时间序列遥感影像中的缺失图像
然后,定义需要处理的遥感影像路径列表,和识别数据缺失的逻辑。这里我们简化处理,假设已经知道哪一幅图像是缺失的,因此直接跳过识别步骤。
53 1
|
6月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
73 0
|
5月前
|
算法 Java API
在VC++中使用CxImage库读写图像实现像素操作
在VC++中使用CxImage库读写图像实现像素操作
35 0
|
6月前
|
存储 算法 数据可视化
|
6月前
|
安全 算法 编译器
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
138 1
|
6月前
|
编译器 C++
C++编程之美:探索初始化之源、静态之恒、友情之桥与匿名之韵
C++编程之美:探索初始化之源、静态之恒、友情之桥与匿名之韵
51 0