本文为原创,如需转载,请注明作者和出处,谢谢! 在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如需转载请自行联系原作者