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

本文出自 “李宁的极客世界” 博客,谢绝转载!

你可能感兴趣的:(C++,for,wxwidgets,休闲,静态装载图像)