在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中加入 否则在windows下当窗口缩小后再放大时,图像显示有一些问题。但在linux下可以不加这条语句。
本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/216636,如需转载请自行联系原作者