`
izuoyan
  • 浏览: 9223414 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

浅谈 wxWindows FrameWork

阅读更多

最近看了Borland C++BuilderX的报道,发现这次的版本使用的是wxWindows做为FrameWork。十分惊讶,因为我在一年以前就使用wxWindows了。不过在当时,包括最近有关它的国内报道还是很少。
wxWindows是一个C++的扩展库。是一个OpenSource项目,而且支持多平台。所以,你完全可以从OpenSource的网站上免费获得各个平台的版本和源代码。而对于wxWindows的官方网站www.wxWindows.org我一年来从未一睹其芳容,——网站无法访问。但是尽管如此,并不影响我们获得它。这多亏了OpenSource的力量。
wxWindows最吸引我的是它简洁的代码——几行简单的代码,随心所欲的派生。一个窗口就诞生了。一个用API要近100行的效果。用wxWindows最多十几行就可以解决问题。我想这也或许是Borland选择它的原因之一吧。wxWindows对于各种常用控件和繁琐的功能都分别封装成了类。使用的时候只要加一行代码就可以使用了。像

wxButton *p_b = new wxButton(frame,-1,"Button");

就是在frame窗口中绘制一个写有Button的按钮。以后的访问只要使用

p_b->//要调用的函数

就可以对按钮进行操作了。我想直接用API就没有那么方便了吧。其实在简单的背后,wxWindows为你默默的做了许多的工作。虽然你也可以在wxWindows中对这些工作全面接手。但是,有些时候根本没有必要那么做。当然,如果你对wxWindows的控件不满意的话,完全可以用wxWindows派生出自己的控件。比如你对主窗口不满意——只有一块深灰色。你完全可以生成一个自己的主窗口,方法如下:

Class MyFrame:Public wxFrame
{
public:
MyFrame(int width,int height);
};
MyFrame::MyFrame(int width,int height)
:wxFrame((wxFrame)*NULL,wxPoint(0,0),wxSize(width,height))
{
//你为MyFrame所添加的控件等。
}

从上面的代码,可以看出。wxWindows灵活的类管理。
我钟情于wxWindows的另一个理由是它与C++标准库的兼容和健全的非窗口类。比如,在wxWindows中我最喜欢的是wxString,它是我见到的最健全的String类之一。它不但可以与wx完全兼容,也可以与C++标准兼容。在C++中,wxString更像一个灵活多变的Char列。你可以像Char那样使用它。而无需考虑内存的事先分配等问题。而且,在某些方面,它比char更强大。
当然,对于多平台的支持也是我喜欢它的原因。wxWindows有多平台的版本。我使用的是MSW的。当然也有 Mac X11 GTK MGL等许多平台的。如果你要让你的代码在其他的平台上使用。那么你只要在编译的时候修改一下附带的语句。将有关平台的参数改变一下就可以了。对于代码,只要没有使用在特定平台下的功能,就能不修改代码直接使用。当然,wxWindows不只是对各个操作系统有支持。由于它是OpenSource的。所以,通常,其他非C++语言也会使用它的。比如 wxPython就是wxWindows对Python的版本。wxPerl是对Perl的版本。在这些不同的语言中的wxWindows,力求保持它原有的编程风格和思路,而且他们也做到了。所以,你会wxWindows就等于会了wxPython,wxPerl。说到这里,我想说一些题外话。我也用python+wxPython做一些桌面的小玩具,不仅如此,在我要用wxWindows开发界面的时候,会使用wxPython先事先写好界面的代码。然后,确定好后,再机械的灌到我的C++代码中。由于Python是解释性语言,所以与C++相比少了编译,连接的开发周期。写完代码直接运行就可以了。所以,节省了不少的开发时间。这不失为一种减少开发周期,加快开发速度的好方法。下面我们来看看wxPython和wxWindows在实现相同功能上有多大的相同。
//C++ Source
#include <wx wx=""></wx>

class MainApp:public wxApp
{
public:
virtual bool OnInit(void);
private:
wxFrame *mainFrame;
};
IMPLEMENT_APP(MainApp)

bool MainApp::OnInit(void)
{
mainFrame = new wxFrame((wxFrame*) NULL,-1,"Hello wxWindows");
mainFrame->Show(TRUE);
SetTopWindow(mainFrame);
return TRUE;
}


#Python Source
from wxPython.wx import *

class MainApp(wxApp):
def OnInit(self):
mainFrame=wxFrame(NULL,-1,"Hello wxWindows")
mainFrame.Show(true)
self.SetTopWindow(mainFrame)
return true
app=MainApp(0)
app.MainLoop()

从上面的代码,我们可以看到。对于wxWindows和wxPython的界面实现方法几乎是相同的。不同的只是在有关变量的声明,和C++与Python自身的语法不同。
接下来,说说wxWindows支持的C++的IDE环境。既然Borland C++BuildX已经使用了wxWindows那么Borland的C++编译器应该支持吧。其实,事实也是如此。Borland C++ 4.5和5.0都支持。对于使用最广的VC的IDE环境自然也必须支持了。支持的有1.5,4.0,5.0和6.0。当然,其实.Net下也可以使用wxWindows。至少我使用下来没有问题。另外,使用GCC的Dev-CPP也对它有很好的支持,甚至还为wxWindows专门打了一个包。直接使用Dev-CPP的包管理就可以安装并使用了。以上只是一些可以使用wxWindows的IDE环境,还有很多,在此不一一介绍了。有关更多的介绍,可以看看wxWindows的自带文档,在里面有详细的介绍和对于不同环境的安装方法。
对于wxWindows中值得称赞的是它的说明文档。可以这样说,它的自带的文档从教程到查询文档一应俱全。要知道,作为一个开源项目,免费维护的项目,文档能够如此详细和完整真是难得。所以,在没有中文文档的时候,我就是阅读这些英文文档来学习的。而且,直到现在,我每次看这些文档的时候都会有许多新的感悟。而且,另一个值得说明的是,wxWindows 2.4.0,wxWindows 2.4.1等这些不同版本的wxWindows虽然之间有很多的改进。但是,使用的介绍文档等几乎没有改变。这也正说明了它语法的稳定。不至于一个新的版本会造成过去代码的不可用。所以,你完全不用担心你的代码由于版本的问题,会造成他人在阅读和编译上的困难。
对于,多平台的运行机制。我想我也要简单介绍一下。毕竟我想这个也是我们需要关注的问题。如果,你仔细看看wxWindows的include/wx目录,你会看到有诸如 msw unix 等目录。其实,在你导入wxWindows文件的时候,wxWindows会更具不同的平台选择不同的文件。下面是include/wx/button.h中63行的一段代码。

#if defined(__WXUNIVERSAL__)
#include "wx/univ/button.h"
#elif defined(__WXMSW__)
#include "wx/msw/button.h"
#elif defined(__WXMOTIF__)
#include "wx/motif/button.h"
#elif defined(__WXGTK__)
#include "wx/gtk/button.h"
#elif defined(__WXMAC__)
#include "wx/mac/button.h"
#elif defined(__WXPM__)
#include "wx/os2/button.h"
#elif defined(__WXSTUBS__)
#include "wx/stubs/button.h"
#endif

由上面的代码,可以看到,如果你向编译器传送的是__WXMSW__的时候,button.h会从msw文件夹中继续导入button.h。这就是wxWindows支持多平台的方法。所以,wxWindows的运行机制,更像是一个解释器的运行机制。不论平台如何改变,编写的人无需考虑平台的问题,解释器会更具不同的平台,将相同的代码转换成不同的命令。
当然,世界上的任何事物都是由两面性的,像wxWindows也有它的缺点。首先,使用wxWindows的界面,往往体积比较大,基本在1M以上。而且,会随界面的复杂而上升。不过,这主要取决于你使用的头文件的多少。通常不会有突变的情况。当然,这也不是不可以改变的。如果用ZIP等压缩一下的话,通常都会只有原来的50%或者更低30%我像,这或许是取决于编译器和代码自身的问题。应该可以解决的。另外,wxWindows的简化也会给使用的人带来不少的麻烦。比如:

wxNotebook *p_note = new wxNotebook(frame,-1);
p_note->AddPage(new wxPanel(frame,-1),"1");
p_note->AddPage(new wxPanel(frame,-1),"2");
p_note->DeletPage(0);

如果,你没有使用过或者刚使用wxWindows,一定会以为这个代码会造成内存泄漏。因为,没有显式删除new生成的内存空间。最初我也是这样想的,但是后来才发现。wxWindows会自动为你在DeletPage(0)时删除new占用的空间。对于用惯C++的人来说,这的确会造成一些混乱。不过,这也是wxWindows的好心被人误解了吧。最后的问题是wxWindows在某些方面的不灵活。比如,要设计一个不规则的窗口就几乎是不太可能的。而且,不如wxTextCtrl中的右键菜单是英文的,修改他的确也有些麻烦。以上是我使用wxWindows时发现的一些问题。不过,既然Borland使用了wxWindows。我想wxWindows会越来越更完善的。
最后,感谢各位的阅读。希望各位前辈能为小生的文章多多指教。我想以后wxWindows不只是C++BuildX的专利。你也可以在你喜欢的IDE中使用wxWindows。


STUDIO软件开发组
站长:北斗星君(黄庠魁)

分享到:
评论

相关推荐

    wxWindows 2

    ### wxWindows 2:跨平台GUI应用程序开发 #### 一、引言 ##### 1.1 为什么选择wxWindows? 在开发图形用户界面(GUI)应用时,开发者常常面临的一个挑战是如何让自己的应用能够同时在Windows、Linux或Unix等不同的...

    wxMSW-2.4.2-setup.zip_wxMSW_wxWindows 2.4_wxWindows-2_wxmsw2.4_w

    【wxMSW-2.4.2-setup.zip】是一个压缩包文件,包含了wxWindows的安装程序,这是一个基于C++的开源GUI库,专门用于构建跨平台的用户界面。wxWindows通常被称为wxWidgets,其目标是提供一个独立于操作系统原生API的...

    用ctb和wxWindows 进行串口编程(En)

    ### 用ctb和wxWindows 进行串口编程 #### 关于本文档 ##### 意图 本文档旨在介绍如何在Windows系统上运行多端口串行设备(也称为端口服务器),并利用wxWindows及附加的CTB库进行串口编程。文档将覆盖作者在实际...

    XRCed:wxWindows / wxPython的简单资源编辑器-开源

    **XRCed:一个用于wxWindows/wxPython的开源资源编辑器** XRCed是一款专为wxWindows和wxPython框架设计的轻量级资源编辑工具,它的主要功能是帮助开发者创建和修改XRC(XML Resource)格式的文件。XRC是一种基于XML...

    wxWindows Project Manager for VC7-开源

    【wxWindows Project Manager for VC7】是一个专门为使用wxWindows库的开发者设计的开源项目管理工具,它优化了在Visual C++ 7环境下开发基于wxWindows应用程序的过程。wxWindows是一个流行的跨平台GUI库,允许...

    [使用wxWidgets进行跨平台程序开发].wxWidgets-2.9.0-chm.zip

    【使用wxWidgets进行跨平台程序开发】 wxWidgets是一款强大的C++库,专为构建跨平台应用程序而设计。它提供了一套完整的用户界面组件和工具,允许开发者使用单一代码库在多个操作系统上创建原生外观的应用程序,...

    wxIA - wxWindows Image Acquisition-开源

    wxWindows GUI类库的跨平台图像获取类提供对本机图像获取API的访问。 当前的支持是Windows上的TWAIN(希望不久后将在Mac上)和Linux上的SANE。 wxWindows的附加类库。

    wx4j: Java Bindings for wxWindows-开源

    wxWindows 的 Java 绑定,跨平台 GUI API。

    FreeGee Application Framework-开源

    FreeGee是用于Python和C ++的集成应用... 包含的模块包括:Python(脚本),PostgreSQL(数据库),wxWidgets / wxWindows(GUI),GnuPG(加密),omniORB(OO中间件),Apache(Web)和其他高级工具(请参见首页)。

    wxPython 入门教程

    这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅 developerWorks上的 “细述 wxWindows” )。wxWindows 库是为了...

    linux下的chm软件安装和配置

    chmlib是一个用于处理ITSS/CHM文件的库,而wxWindows则是一个跨平台的GUI库,XCHM基于wxWindows的wxGtk版本构建。 安装chmlib的步骤如下: 1. 下载chmlib的源码包(例如版本0.31,文件名为chmlib-0.31.tgz)。 2. ...

    wxmsw24.dll

    听说现在BCBX也想用wxWindows了,看来wxWindows真是很得人们赏识,我没用BCBX,不过用VC玩玩wxWindows觉得还不错,就是写的执行文件感觉大了点,一般有六七百K,如果编译WithDLL,那就小了,上百K的就要写好多代码了....

    wxPython学习笔记

    您可以在几分钟内编写一段...这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅 developerWorks上的 “细述 wxWindows” )。

    C++各大有名库的介绍.pdf

    著名的GUI库包括MFC、QT、WxWindows、Fox、WTL、GTK等。 1. MFC MFC是微软基础类库,但是在最近发展以及官方支持上日渐势微。 2. QT QT是Trolltech公司的一个多平台的C++图形用户界面应用程序框架,已经成为全...

    Editra

    基于wxWindows Licence的开源编辑器,wxpython编写。notepad++的完美代替品。

    (word完整版)C++语言第一课.docx

    C++BuilderX是一个基于C++的IDE,提供了跨平台、跨编译器、多种Framework的集成和WxWindows为基础的GUI设计器。GCC是一个功能强大且广泛使用的编译器,提供了丰富的功能和支持。 在开发C++程序时,需要了解C++语言...

    wxStudio-开源

    wxStudio是一款基于wxWindows GUI库开发的集成开发环境(IDE)和代码生成工具。它旨在提供一个免费、开源的解决方案,以支持程序员进行跨平台的应用程序开发。wxWindows是wxWidgets的前身,是一个C++库,允许开发者...

    C++库汇总

    - **Spirit**:LL parser framework,可以直接用 C++ 代码表示 EBNF。 - **Graph**:图组件和算法。 - **Lambda**:功能性编程中的实用工具。 - **Concept Check**:用于检查泛型编程中的概念。 - **MPL**:元编程...

    VisualWx python C++ gui设计器

    wxWindows快速开发工具,VisualWX 当前版本仅为尚处在研制初期,不过下载后用了用,感觉还凑合,至少能减少手工设计界面的烦恼。

Global site tag (gtag.js) - Google Analytics