使用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 
* =  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下可以不加这条语句。







本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/216636,如需转载请自行联系原作者


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