北斗星君的专栏

NERVE软件开发组

用户操作
[即时聊天] [发私信] [加为好友]
黄庠魁ID:VisionCat
211217次访问,排名331好友0人,关注者19
安静的人
VisionCat的文章
原创 70 篇
翻译 0 篇
转载 4 篇
评论 713 篇
北斗星君的公告
神的话语
歌林多前书13章4-8节
爱是恒久忍耐,又有恩慈。爱是不嫉妒。爱是不自夸。不张狂。不作害羞的事。不求自己的益处。不轻易发怒。不计算人的恶。不喜欢不义。只喜欢真理。凡事包容。凡事相信。凡事盼望。凡事忍耐。爱是永不止息。
ICQ:
206-425-719
MSN:
Huangxiangkui@msn.com
OICQ:
170411742
最近评论
shellex:在Linux下写C#...哎,虽然有Mono
edilyxin:系数变换公式是不是还有一些错误啊?
outskywind:问个小问题,怎么查看在IDE下RUN的结果?
kivia:这个是没办法的,那个记者啊,电视台啊有几个是有基本常识的。
zhongyunde:那怎么使用 OpenWatCOM 编译产生库文件呢 ??
文章分类
收藏
    相册
    技术之友
    ShellEx
    链接交换
    在君夜阳的世界
    星之链接
    Chinese Tea
    STUDIO社群
    北斗星君专栏(新)(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 浅谈 wxWindows FrameWork收藏

    新一篇: 略谈Python语言(最强的脚本语言) | 旧一篇: 普通高中生眼中的中国IT的现在与发展

      最近看了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

    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软件开发组
    站长:北斗星君(黄庠魁)

     

    发表于 @ 2003年11月09日 23:15:00|评论(loading...)|编辑

    新一篇: 略谈Python语言(最强的脚本语言) | 旧一篇: 普通高中生眼中的中国IT的现在与发展

    评论

    #wuxin 发表于2004-09-19 12:59:00  IP: 218.19.77.*
    请教wxString和std::string如何兼容,在wx的文档中说到"wxString typedef 到std::string "可以同时支持wx和std,有点不明.能否帮我一下
    #henrya2 发表于2008-04-27 11:58:54  IP: 59.53.136.*
    wxWindows 和 wxWidgets 是什么关系啊??
    #henrya2 发表于2008-04-27 12:08:21  IP: 59.53.136.*
    我已经知道答案了。谢谢。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 北斗星君