驰骋wxWidgets系列之wxWidgets简介

来源:互联网 发布:广电网络突然不能上网 编辑:程序博客网 时间:2024/04/20 07:40

Utensil按:上个星期做了很多事,包括实现了文件传输、实现了透明蒙版(用于选定要截屏的控件)、开始了q到r的revision,还有就是写成了这篇文章。是在写着写着原定计划介绍怎么编译wxWidgets一章的时候,发现必须对wxWidgets做一份自己的介绍,网上流传的那些介绍都感觉不够带劲。文中保留了自己的偏颇之处。

这篇东西是用Word排版的,我只是简单的拈贴进来,不做走位格式的整理,全书写成之后,会以pdf文档的形式发布。保留所有版权,转载请评论,或告知RonIzWright@126.com。

第一章 wxWidgets简介

         什么是wxWidgets?一个简单的回答就是它是一个免费、源代码开放、跨平台的提供本地观感的图形用户界面(GUI)的类库(主要是C++,同时也有其他各种语言的绑定版本)。

1.1 免费

免费这一点,对于用惯破解软件的我们而言,似乎并不那么令人动心。但当你成为一个公司的职员,开始做项目的时候,你就会发现License成为你很头痛的问题,因为公司的行为会受到中国日益完善的打击盗版的法律体系的制约。想想为什么在几乎家家用的都是盗版Windows的情况下,微软照样能在中国赚回大把大把的钱?靠的就是政府和公司这些大客户。而且身在其中的你不购买它的授权还不行,不用打官司,飞个律师函过来就够你老板头疼的了。在公司里,你用个WinRAR都会招致律师函的……所以,免费绝对是使用wxWidgets进行开发的最大好处——更妙的是,虽然免费,可它经过十余年的发展,已经非常成熟,趋于完善,而且还在继续被开源社区的程序员们热火朝天地开发着。

1.2 源代码开放

源代码开放又意味着什么呢?

1.2.1 可以最早尝试到新的特性和得到最快的Bug的修复

只需要从SVN上检出(check out)最近的源代码,然后编译,就能获得最新版的wxWidgets。如果你是个高手,还可以修复你发现的Bug并提交补丁(Patch)。

1.2.2 读文档不够明白之处,可直接阅读源代码来理解

在国外,你在论坛上提问时,可能会有人叫你RTFMRTFS,它们是Read the fantastic manualRead the fantastic source的缩写,意思是让你去读文档和源代码。这是一种良好的学习习惯,先自学和自行查找(搜Google和搜论坛),然后再向其他人求助。

wxWidgets的文档相当完善,例程也非常丰富,基本能满足使用者的需要。但是对一些细微之处的理解,阅读拥有丰富注释的源代码会比阅读文档中更为抽象的描述要好理解的多。——唯一遗憾的是wxWidgets的文档目前没有一个翻译团队对其进行中译,英文不好的同好可能就比较郁闷了。

1.2.3 可供学习的优良编程风格

这里所说的编程风格,包括代码的书写风格,也包括设计模式(Design Patern)。作为开源软件,良好的代码书写风格是起码的要求。而就我目前对wxWidgets的构架的了解,它也是学习设计模式的一个绝好的教材[1]

1.3 跨平台的提供本地观感的图形用户界面(GUI)类库

1.3.1 跨平台

跨平台,意味着你用wxWidgets写的程序,只写一次,就能在各个操作系统上用各编译器编译运行。目前,wxWidgets支持Windows(包括最新的Vista)、苹果的Mac OSCarbon接口和Cocoa接口)、LinuxGTK+接口和X11接口)、 UnixMotif接口)、OS/2甚至 WinCEPalmOS。当然,这需要你在写程序的时候就对这一点多加注意,采用一些可以适用于各个平台的写法,比如不要指定一个Button的绝对大小和绝对位置,而是用Sizer进行布局,再比如程序的图标,最好使用xpm格式而非Windows专有的ico格式,等等。不过,如果你只需要在一个特定平台下编程,也可以使用一些平台专有的特性——wxWidgets也提供了一些类封装了各平台的一些专有特性。

1.3.2 本地观感

同一个用wxWidgets写的程序,在Windows下会长得跟其他Windows程序一样,在苹果下则会长得跟其他苹果程序一样,这是因为在wxWidgets内部是用各操作系统本地的API实现的,而不是用同一套wxWidgets自己的实现(当然,如果你喜欢,也可以使用同一套wxWidgets自己的实现,即wxUniversal)。本地观感是我们应该选择wxWidgets而非其它跨平台GUI库的最重要的一点。

与本地观感相并列的一点,是本地实现。我们在后面会看到,wxWidgets不仅仅是GUI,它在许多功能中都采用相应操作系统的本地实现,这样,你的程序可以更高效,也能和本地的其他程序更协调地工作。

1.3.3 类库的封装

Windows下,有不少人使用wxWidgets来作为MFC[2]的一个更为优雅的替代者。MFC由于微软的强势,被广泛使用,但任何一个使用过它的人,都会郁闷于它出于历史原因而残留下来的很多丑陋的地方。何况在微软钻进.net的胡同里之后,它的官方支持已经日渐式微。wxWidgets的类继承结构与MFC很相似,你几乎找不到MFC中有而wxWidgets中没有的东西(想想你同时在多少个平台上获得了同样的东西),而且你会看见它们被以更优雅的形式封装起来,并使用了清晰整齐美观的命名(类名通常是加上wx前缀的完整英文单词,接口函数名也通常是完整的英文谓宾结构,每个单词的首字母都大写,每个参数的类型和名字也都有很强的指示作用——哪像MFC,动辄LPLVHITTESTINFO这样的参数类型,谁看着能舒服?用wxWidgets写的程序,不用注释都能看懂大半。)更加惊喜的是,有太多在你用MFC编程时需要求助于第三方类库的功能,内建在wxWidgets里,并被封装得很顺手。

wxWidgets使用C++写成。我个人非常热爱C++,虽然现在Java很火,但我不喜欢它的许多莫名其妙的语法和功能简化带来的对编程的限制,不喜欢它强迫我们写被托管的代码,不喜欢自己的程序被放进一个砂箱里(只要一个功能Java虚拟机或Java API不支持,我们就永远做不了),不喜欢它表象混乱的指针模型和事实上也相当混乱的类库结构。Java C++的许多“改进”,不应当由语言来做,而应该靠程序员自律(良好的编程风格)、编译器特别支持(如垃圾回收)和类库(如智能指针)来完成。

C++的发展历史中,相当遗憾的一笔,是它没有及时发展出自己的类库,标准库迟迟才建起,而跨平台GUI类库这一块,更是被Java先声夺人了。C++有了wxWidgets,是真正的如虎添翼,不仅不再在这方面被Java压一头,而且反过来彰显了C++的优越性——本地观感与本地实现。

然而wxWidgets不只是C++语言的类库,它还有多种语言的绑定版本,包括PerlPythonRubyLuaBasicC#Euphoria甚至JavaScript,真是琳琅满目。

1.3.4 不仅仅是GUI

作为GUI类库,wxWidgets提供了

l  你所能想到的各类窗体(WindowFramePanel,包括MDI[3],甚至启动画面、每日提示、向导等)

l  各类对话框、各类控件及相关的数据交换与验证

l  可浮动可停靠的窗体、可由用户定义的布局

l  菜单、工具栏、状态栏以及对系统托盘栏的访问

l  各种GDI[4]类和DC[5]类,乃至于对OpenGL的支持

l  Sizer进行的布局框架

l  良好设计的事件处理(静态事件表和动态事件挂钩)、快捷键设置

l  剪贴板和拖放(Drag&Drop)操作支持

l  文档/视图框架

l  在线帮助框架

l  完整的打印框架,包括打印预览、页面设置以及对PostScript的支持

l  ……

这些我不打算在这里详细介绍,你可以在官方文档[6]Julian Smart等著的《wxWidgets跨平台GUI开发》[7]或后续的教程中找到它们的详细介绍。

然而,wxWidgets库远远超出一个单纯的GUI类库,而是一个多才多艺的类库,提供了:

l  完善的Unicode支持、各种编码的相互转换

l  对编写国际化(多语言)程序的支持

l  各类数据结构,包括GUI需要用到的数据结构(如点、一个不规则区域、光标)、实用的数据结构(如日期时间、64位整数、可变类型)、基本的容器(如链表、Hash族容器)、支持Unicode的字符串等。

 

l  多进程、多线程程序开发支持

l  对载入动态库(Window下是动态链接库dll*nix平台则是共享对象库so)的支持

l  完整的Socket网络编程支持,包括IPTCPUDPHTTPFTP等。

l  WindowsDDE[8]ActiveXOLE)的支持

l  ODBC数据库访问支持,SQL支持。

 

l  文件、文件夹、路径相关的各种操作

l  虚拟文件系统,可用于访问压缩文档、HTTPFTP等因特网上的文件以及把内存当作一个虚拟文件来访问。

l  各类流的支持

 

l  ziptar压缩文档的读写支持

l  bmpjpggifpng等图片格式的读写支持,乃至可以播放gifani动画

l  以本地多媒体支持为后端的多媒体播放功能

 

l  富文本编辑控件

l  可进行多种编程语言语法高亮、代码折叠等功能的代码编辑控件

l  XRCXML-based resource,基于XML的资源文件)系统,使用它可将GUI设计存储进文本文件,并在运行时读取,从而实现用户界面与程序功能得更好的分离。

 

l  正则表达式解析、命令行参数解析(Parser)、字符串标记化(Tokenizer

l  一整套HTML的解析、显示、打印支持

l  XML解析支持

 

l  wxWidgets自己的运行时类型信息机制(RTTI

l  各式智能指针

l  内建的内存管理、检测系统、大量的调试(debug)宏支持,甚至包括可在程序崩溃时输出可视化调试报告的控件

 

l  一整套日志记录功能(包括可视化的和基于文件或标准流的)

l  对将用户设置保存为配置文件(Windows下可用注册表)的支持

l  ……



[1] 最近看了阎宏编著的《Java与模式》,突然想写本《wxWidgets与模式》,可惜,时间与精力……

[2] Microsoft Foundation Class,微软基础类库

[3] Multiple Document Interface,多文档界面

[4] Graphics Device Interface,图形设备接口,例如笔刷、颜色、字体

[5] Device Context,设备上下文,你可以把它想象为一块画布

[6] http://www.wxwidgets.org/manuals/stable/

[7] Wesley大侠翻译的中文版可在网上搜索到

[8] Dynamic Data Exchange,动态数据交换

原创粉丝点击