细述 wxWindows.docx
- 文档编号:9362830
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:15
- 大小:22.42KB
细述 wxWindows.docx
《细述 wxWindows.docx》由会员分享,可在线阅读,更多相关《细述 wxWindows.docx(15页珍藏版)》请在冰豆网上搜索。
细述wxWindows
细述wxWindows
wxWindows库,无论是否作为动态链接库(DLL)来编译它,都有可能有非常小的执行体。
它还提供了用于多平台开发的各种特性:
可以获得OpenGL接口以及对HTML、Unicode和国际化的内建支持。
它可以帮助您将应用程序从仅用于Windows的MFC(MicrosoftFoundationClasses)移植到其它平台,比方说,Linux。
wxWindows的一个主要目的是在尽可能多的平台上运行,这样才能支持几乎每种可用的C++编译器。
它还没有使用标准C++的全部特性(例如名称空间、std:
:
string类和STL容器)。
但标准C++已被列在日程中,并且已经有了一些对于新类型转换语法和std:
:
string的支持。
简要历史
JulianSmart于1992年在爱丁堡大学(UniversityofEdinburgh)人工智能应用学院开始了wxWindows的研究。
1995年,MarkusHolzem发布了其到Xt(X工具箱)的wxWindows移植。
停了一段时间后,1997年5月,Windows和GTK+移植被合并,并放入CVS资源库,所有对wxWindows做出贡献的人都可以使用它。
到97年底,JulianSmart开始分发wxWindows的CD-ROM,包括完整的源码、编译器材料等等。
目前wxWindows在GPL下发布,但有一个例外:
可以分发不带有源代码的二进制可执行文件。
这对于商业项目来说是个不错的选择。
它有各种UNIX版和MicrosoftWindows版,以及MacintoshOS版。
到OS/2和其它操作系统的移植也正在开发中。
现在,让我们开始进入具有丰富内容的正文...
回页首
要运用的平台
因为wxWindows随时可以使用本机控件,所以它采取与大多数其它多平台GUI库不同的方式来对待小窗口部件。
可以仿效那些不可用的控件,例如Unix下的树控件。
这将为应用程序的用户提供类似的外观和感觉。
wxWindows库当前支持以下平台:
∙Windows3.1,Windows95/98,WindowsNT
∙带有Motif/Lesstif的大多数UNIX版本
∙带有GTK+的大多数UNIX版本
∙Mac
仅带非GUI类的wxBase库也可以在UNIX/Win32和BeOS下构建(有一些限制)。
即使您不是将wxWindows作为DLL编译,也可以获得非常小的可执行文件。
例如,使用Windows平台的MicrosoftVisualC++所编译的最小的样本应用程序小于400KB。
因为wxWindows的可执行程序很小,所以通常可以避免所谓的“DLL灾难”。
现在,让我们看看多平台特性...
回页首
独立于体系结构的类型
为避免体系结构的依赖性,该库提供了各种独立于体系结构的类型和宏,能够根据应用程序的尾数来处理位交换。
它们包括:
∙wxInt32(32位有符号整数)
∙wxInt16(16位有符号整数)
∙wxInt8(8位有符号整数)
∙wxUint32(32位无符号整数)
∙wxUint16=wxWord(16位无符号整数)
∙wxUint8=wxByte(8位无符号整数)
位交换宏可用于整数和无符号整数(其中的xx代表16或32,BE代表大尾数法,LE代表小尾数法。
)
∙wxINTxx_SWAP_ON_BE()
∙wxUINTxx_SWAP_ON_BE()
∙wxINTxx_SWAP_ON_LE()
∙wxUINTxx_SWAP_ON_LE()
∙wxINTxx_SWAP_ALWAYS()
∙wxUINTxx_SWAP_ALWAYS()
这里的用法很直接,如下例所示:
32位带符号整数变量的字节交换
wxInt32old_var=0xF1F2F3F4;
wxInt32new_var=wxINT32_SWAP_ALWAYS(old_var)
除了这些宏以外,wxWindows还提供了#define来定义机器(库在其上编译)的当前尾数。
以下是它的一例:
使用#define
if(wxBYTE_ORDER==wxLITTLE_ENDIAN)
{
//Dostuffforlittleendianmachine...
}
else
{
//Dostuffforbigendianmachine...
}
回页首
文件处理
要为具有不同文件存储器概念的不同平台进行编写总是很困难的。
要克服这一问题,wxWindows有一些函数用于多平台文件处理。
首先,让我们看一些用于基本文件操作(例如复制、删除和重命名)的函数。
基本文件操作
wxStringold_report="smithers_00.doc"
wxStringnew_report="my_smithers.doc";
if(wxCopyFile(old_report,"smithers_00.bak")==true)
{
if(wxRemoveFile(old_report)==true)
{
if(wxRenameFile(new_report,old_report)==false)
{
//Doh!
}
}
}
另一个为不同平台进行编写所带来的严重问题是目录分隔字符,但使用wxPathList类的话就可以完全避免这一问题。
wxPathList包含了搜索文件所用的目录列表。
如果希望查找某一文件,只需要将文件名传递给wxPathList类,它就会搜索预先定义的目录。
wxPathList类
wxPathListpath_list;
//Addcurrentworkingdirectory
path_list.Add(".");
//Addonedirectoryabovecurrentworkingdirectory
path_list.Add("..");
//AdddirectoriesfromenvironmentvariablePATHtothelist
path_list.AddEnvList("PATH");
wxStringpath=path_list.FindValidPath("homer.bmp");
wxWindows中还有两个有用的函数:
wxFileNameFromPath(),用于将文件名从完整路径中剥离,以及wxPathOnly(),用于将路径从完整路径中剥离。
回页首
HTML
VaclavSlavik的wxHTML库对基本HTML进行语法分析并产生HTML。
它并没有完全实现HTML标准,但它的功能对于处理联机帮助已经足够了,它还可以使用标记处理程序进行扩展。
要显示HTML,需要创建一个类为wxHtmlWindow的对象。
然后调用它的方法来设置相关的框架和相关的状态栏,前者用来实际地显示HTML,后者用来显示由HTML语法分析器所生成的消息。
wxHTML
wxHtmlWindowhtml_window=newwxHtmlWindow(this);
html_window->SetRelatedFrame(this,"HTML:
%%s");
html_window->SetRelatedStatusBar(0);
然后,可以通过使用以下函数来装入HTML页面:
装入HTML
html_window->LoadPage("burns.htm");
也可以通过以下函数来显示HTML代码
显示HTML
html_window->SetPage("
Hello,Monty!");
回页首
图像
wxImage类使用图像格式处理程序来装入各种不同的图像文件格式。
可以通过实现自己的图像格式处理程序,扩展wxImage来装入新的图像格式。
现有的图像格式处理程序使用众所周知的库,例如SamLeffler的libTIFF库或独立JPEG小组的JPEG库。
有一些用于BMP、PNG、JPEG、GIF、PCX、PNM和TIFF的处理程序。
可以通过使用应用程序启动代码中wxImage类的静态方法AddHandler()来激活每个图像格式处理程序。
wxImages
boolMyApp:
:
OnInit()
{
wxImage:
:
AddHandler(newwxPNGHandler);
//more...
}
要使用所有现有的图像格式处理程序,只需要调用函数wxInitAllImageHandlers()而不是上面显示的AddHandler()方法。
在其它平台上使用应用程序中的工具栏位图时要特别小心。
在Windows上,您将看到Windows位图格式,但Linux位图通常是pixmaps,在这种情况下,就不能完全避免有条件的编译。
让我们看一些样本代码。
#ifdefined(__WXGTK__)||defined(__WXMOTIF__)
#include"maggie.xpm"
#endif
//more...
voidMyApp:
:
UseBitmap()
{
wxBitmapbitmap(wxBITMAP(maggie));
//more...
}
理解了吗?
所有效果都是由wxBITMAP()宏实现的。
对于Windows和OS/2,它将使用应用程序资源中名为'maggie'的位图来创建wxBitmap对象。
对于所有其它平台,它将使用称为'maggie_xpm'的pixmap来创建wxBitmap对象。
当可以使用wxDC:
:
DrawBitmap()在设备上下文中绘制位图时,必须为图像操作使用wxImage对象,如下所示。
图像操作
wxImage*p_image=newwxImage(bitmap);
//Havesomefun
if(p_image->Ok())
{
if(p_image->GetHeight()>50&&p_image->GetWidth()>50)
{
unsignedcharred=p_image->GetRed(50,50);
unsignedchargreen=p_image->GetGreen(50,50);
unsignedcharblue=p_image->GetBlue(50,50);
//Securebutmightbeslow
p_image->SetRGB(50,50,red,green,blue);
//Ifyouwantfastactionuseapointer...
unsignedchar*data=p_image->GetData();
//Manipulatethedata...
}
}
回页首
Unicode和国际化(i18n)
开发适用于国际市场的软件时,不能指望每个人都能阅读以英文表示的应用程序消息。
但广泛使用的ANSI代码又不能处理所有语言符号。
(例如,它不能处理中文。
)而同时编写ANSI和Unicode又有些复杂,您可以从下例中领略到这一点:
ANSI和Unicode
#ifdefUSE__UNICODE
wchar_twide_char=L'h';
wchar_tconst*wide_string=L"Hello,World!
";
intlength=wcslen(wide_string);
#else
charansi_char='h';
charconst*ansi_string="Hello,World!
";
intlength=strlen(ansi_string);
#endif
而使用wxWindowsUnicode能力就只需要编写以下代码:
wxT()宏以及wxChar和wxString
wxCharwx_char=wxT('*');
wxStringwx_string=wxT("Hello,World!
");
intlength=wx_string.Len();
wxT()宏以及wxChar和wxString类将处理所有问题。
该库在内部对所有消息使用这种方法。
当前有捷克语、丹麦语、德语、法语、意大利语和俄语译文可用,但您可以在wxLocale类的帮助下编译库的本地化版本后使用它。
回页首
调试
库提供了各种不同的类、函数和宏来帮助您调试应用程序。
如果以调试方式来编译库,用于类wxObject(wxWindows中大多数类的基类)的new和delete操作符就已经重新定义,可以存储有关在堆上分配的对象的额外信息。
使用这些信息,可以用类wxDebugContext来获得有关对象分配、内存泄露、覆盖和正在写入的详细信息。
//StartloggingforDump()call
wxDebugContext:
:
SetCheckpoint();
wxString*thing=newwxString;
wxDate*date=newwxDate;
//non-objectallocation
char*ordinaryNonObject=newchar[1000];
//more...
//Printnumberofobjectandnon-objectallocations
wxDebugContext:
:
Dump();
//Printallocationstatistics
wxDebugContext:
:
PrintStatistics();
对wxDebugContext:
:
Dump()的调用将弹出一个包含分配列表的窗口。
您可以在下面看到这样一个列表,这是我用wxWindows提供的memcheck样本创建的。
调用wxDebugContext:
:
Dump()
13:
32:
45:
-----MemorydumpofmemcheckatTueDec2613:
32:
452000-----
13:
32:
45:
..\..\..\samples\memcheck\memcheck.cpp(88):
non-objectdataat$DD3DC0,size4
13:
32:
45:
..\..\..\samples\memcheck\memcheck.cpp(89):
wxDateat$DD40D0,size24
13:
32:
45:
..\..\..\samples\memcheck\memcheck.cpp(92):
non-objectdataat$DD4118,size1000
对wxDebugContext:
:
PrintStatistics()的调用将提供一些统计信息,如下所示。
调用wxDebugContext:
:
PrintStatistics()
13:
32:
45:
-----MemorystatisticsofmemcheckatTueDec2613:
32:
452000-----
13:
32:
45:
1objectsofclasswxDate,totalsize24
13:
32:
45:
5objectsofclassnonobject,totalsize4256
13:
32:
45:
13:
32:
45:
Numberofobjectitems:
1
13:
32:
45:
Numberofnon-objectitems:
5
13:
32:
45:
Totalallocatedsize:
4280
回页首
将MFC应用程序移植到Linux
wxWindows库也可以将MFC应用程序移植到Linux和其它操作系统。
您将在下面的代码摘录中看到,wxWindows字符串类wxString与MFC字符串类CString有某些相似性。
wxString
wxStrings1="Hello,World!
";
wxStrings2="Hello";
if(s1.IsEmpty()==false)
{
s2.Empty();
s2=s1.Left(5);
intpos=s1.Find(',');
s2+=s1.Mid(pos,2);
s2+=s1.Right(6);
}
wxWindows的事件系统也与MFC非常相似,消息映射表都是将事件处理程序方法映射到事件系统。
在wxWindows中,这些称为事件表。
事件表宏与MFC的消息映射只有一点差别。
在下面的源代码中显示了主要差异。
头文件的MFC代码
classCButtonCtrl:
publicCOleControl
{
//Implementation
protected:
LRESULTOnOcmCommand(WPARAMwParam,LPARAMlParam);
DECLARE_MESSAGE_MAP()
};
实现文件的MFC代码
BEGIN_MESSAGE_MAP(CButtonCtrl,COleControl)
//{{AFX_MSG_MAP(CButtonCtrl)
ON_MESSAGE(OCM_COMMAND,OnOcmCommand)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
头文件的wxWindows代码
classMyButton:
publicwxButton
{
voidOnButton(wxMouseEvent&event)
private:
DECLARE_EVENT_TABLE()
};
实现文件的wxWindows代码
BEGIN_EVENT_TABLE(MyButton,wxButton)
EVT_BUTTON(-1,MyButton:
:
OnButton)
END_EVENT_TABLE()
如您所见,并没有什么不同。
在邮件列表中已经有相当一部分人成功地将他们现有的MFC应用程序移植到wxWindows(我们也非常愿意帮助您:
)。
回页首
标准C++
wxWindows还没有使用标准C++技术(例如std:
:
string、STL或名称空间),因为这样会大量减少wxWindows可在其上进行编译的平台数。
(只有很少一些编译器完全支持标准C++的最新特性。
)但随着标准C++越来越受到普遍支持,wxWindows开发小组会将对标准C++的支持集成到它的库中。
让我们看看他们都做了哪些工作。
以标准C++编写进行的安全向下类型转换
classA{
virtualvoidfoo(){};
};
classB:
publicA{};
A*p_A=newB();
B*p_B=dynamic_cast
(p_A);
如果有任何错误,p_B将包含0指针。
在wxWindows中,您将发现一个基于宏的系统用于运行时类型信息,但对于上述C++代码,必须按以下方法使用wxDynamicCast()宏:
用于标准C++的wxDynamicCast()宏
B*p_B=wxDynamicCast(p_A,B);
如果类型转换失败,p_B将包含0指针。
对于支持新类型转换语法的实现,宏扩展为dynamic_cast<>。
但不幸的是,宏只对指针起作用,而不对引用起作用。
除了wxDynamicCast()宏以外,还有wxStaticCast()和wxConstCast()宏。
wxWindows字符串类wxString提供了90%的标准字符串类方法。
这里有些示例:
wxWindows'wxString
wxStrings1="Hello,World!
";
wxStrings2="Hello";
s2.erase();
for(size_ti=0;i s2+=s1[i]; if(pare(s2)==0){ //Stringsareequal } 请注意,如果在这里将wxStringtypedef为std: : string,就可以同时为wxWindows和标准C++编写。 回页首 文档 wxWindows文档就目前来说一点也不出色。 虽然一些比较“陈旧”的类(例如wxString)文档很齐全,但对最近实现的类(例如wxGrid)或更模糊的类(例如wxGLCanvas)的描述本应该做得更好。 主要文档提供了对库及其概念的快速介绍、按照字母顺序排列的类引用、编程策略、主题概述,以及对wxHTML和wxPython的某些注释,提供了HTML、WinHelp、MSHTMLHelp和PDF格式(请参阅参考资料)。 如果您刚刚接触wxWindows,应该从主题概述开始。 它们提供了许多有关公共主题(例如调试、事件处理、打印等等)的基本信息和代码示例。 主要文档还包含了一些技术说明和教程,它们提供的主题信息范围从有关了解wxWindows的一些非常公共的问题到特定于编译器的问题。 您还将得到大量纯文本文件,包含用于所支持平台的安装和发行说明。 wxWindows发行版还提供了随文档一起的大约50个样本应用程序。 回页首 支持 如果您在使用库时遇到问题,在文档中又找不到答案该怎么办? 不用担心。 通常您有两种支持可选: 使用邮件列表的免费支持,或商业支持。 如果您不幸需要快速解答,可能最好使用商业支持。 虽然核心开发者总是会关注邮件列表,但他们往往很忙碌,无法立即做出响应。 但您通常可以在一两天内得到答案。 (如果提的问题不太寻常或比较复杂,则在再次提出问题之前应该至少等上两天。 )可以从Sourceforge(请参阅参考资料)上的CVS源代码数据库访问最新的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 细述 wxWindows