在wxWidgets中装载图像是非常容易的,但是如果将图像文件和可执行文件放到一起,在发布时只需要发布可执行文件,要实现这种功能,一般可以使用资源文件来解决。在windows下的资源文件的源文件是*.rc,编译后叫*.res。在linux下类似,源文件为*.xrc,编译后叫*.xres。但它们是xml格式的,要装载这种资源文件也得动态进行装载。相当于配置文件。
如果想将其直接编译进可执行文件。需要一个工具wxrc。这个工作在wxWidgets中的untils目录中,可自己编译。可使用这个工具将*.xrc 生成c++代码,如果是图像,就将其转换成字符数组。然后和其它程序一起进行编译。可使用wxrc -c main.xrc -v -o main.h
main.xrc的格式如下:
要想装载这个background.jpg图,使用以下语句:
如果想将其直接编译进可执行文件。需要一个工具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 >
< 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函数。
// 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 " ));
}
要想装载这个background.jpg图,使用以下语句:
wxXmlResource::Get()->InitAllHandlers();但要注意使用wxStaticBitmap时应在wxFrame中的OnSize中加入
wxBitmap background = wxXmlResource::Get()->LoadBitmap(_T("background"));
m_pStaticBitmap = new wxStaticBitmap(this, wxID_ANY, background, wxPoint(0, 0), wxSize(1024, 768));
m_pStaticBitmap->Refresh();
否则在windows下当窗口缩小后再放大时,图像显示有一些问题。但在linux下可以不加这条语句。
本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/216636,如需转载请自行联系原作者