浅谈 wxWindows FrameWork

wxWidgets随笔(11)-wxFrame wxFrame类是一个窗口,它的大小和位置(通常)可以由用户更改。 它通常有粗粗的边框和标题栏,还可以包含菜单栏、工具栏和状态栏。框架可以包含任何不是框架或对话框的窗口。 通过CreateStatusBar()和CreateToolBar()函数创建的具有状态栏和工具栏的框架管理这些窗口并调整GetClientSize()返回的值,以反映应用程序窗口可用的剩余大小。 应用程序通常应该为框架定义一... 阅读详情

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

 

wxWidgets:wxFrame类用法 wxWidgets:wxFrame类用法wxWidgets:wxFrame类用法用法详细说明 wxWidgets:wxFrame类用法 用法详细说明 #include <wx/frame.h> wxFrame的继承图 框架是一个窗口,其大小和位置可以(通常)由用户更改。 它通常具有粗边框和标题栏,并且可以选择包含菜单栏、工具栏和状态栏。框架可以包含任何不是框架或对话框的窗口。 具有状态栏和工具栏的框架,通过CreateStatusBar()和CreateToolBar()函数创建,管理这些窗口 阅读详情

相关推荐

使用C++开发跨平台图形用户界面(GUI)应用程序,不可避免地要涉及到对窗口的样式进行控制。wxWidgets是一个优秀的开源GUI库,提供了丰富的窗口样式设置...

当用户再次点击总在最上按钮时,我们使用SetWindowStyle(GetWindowStyle() & ~(wxSTAY_ON_TOP | wxFRAME_FLOAT_ON_PARENT))来取消总在最上的设置。本文介绍了如何使用wxWidgets的API来控制窗口的样式,包括窗口的最大化/最小化、窗口的全屏/恢复窗口、窗口的总在最前/取消总在最前、窗口的透明/取消透明以及窗口的总在最上/取消总在最上等操作。当用户点击窗口的总在最前按钮时,我们需要相应地改变窗口的属性。窗口总在最前/取消总在最前。

TechInk的博客 372

wxPython中wx.Frame用法

wx.Frame是一个可以手工设置大小和位置的窗体对象,默认情况下具有粗边框和标题栏,同时可以创建并自定义菜单栏、工具栏和状态栏。wx.Frame也是一个容器,可以包含面板对象、控件对象以及子窗体对象等。

MissYuanxi的博客 2273

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

wxwindows 安装程序,c++核心思想中的类似与,MFC的UI开发工具!

【wxWidgets教程】窗体:wxFrame创建与使用技巧

本文介绍了wxWidgets框架中的wxFrame窗体类及其使用方法。wxFrame是wxWidgets应用程序的核心容器类,用于承载各类GUI控件。

万法若空 1265

【wxWidgets教程】窗体:wxFrame构造函数详解

wxFrame构造函数详解:该函数用于创建框架窗口,包含多个关键参数:1. parent参数指定父窗口指针,控制窗口层级关系;2. id参数采用wxWindowID类型,支持自动ID生成和引用计数管理;3. title参数设置窗口标题;4. pos和size参数控制窗口位置和尺寸;5. style参数支持多种窗口样式组合,包括标题栏、边框、按钮等控制选项;6. name参数指定窗口名称。特别说明窗口ID管理机制采用wxWindowIDRef实现引用计数,以及wxRegion类支持创建不规则形状窗口的功能。

万法若空 907

wxpython设计GUI:窗口Frame最大化、最小化、关闭及全屏显示的说明

在用户实际使用窗口时必然涉及到窗口的最大化、最小化、是否全屏显示及窗口关闭操作。

Logintern09的博客 3562

wxWidget学习笔记二:wxFrame

wxFrame是一个框架窗口,默认提供粗的边框和标题栏,可以从此类派生出xxFrame,实现新的外观。 以下函数建立标准的窗口物件: 工具栏:CreateToolBar();状态栏:CreateStatusBar(int number);菜单栏要复杂一点:首先在xxFrame中声明两种类型的指针,wxMenuBar对应菜单条,wxMenu对应每个子菜单。需要注意的是这两种对象 必须

熊宝宝爱吃鱼 2736

wxython简单入门加实例2:wx.Frame

wx.Frame 是一个容器构件。这意味着它可以容纳其它构件。它有如下的构造器: wx.Frame( wx.Window parent, id, string title, wx.Point pos=wx.DefaultPosition, wx.Size size=wx.DefaultSize, style = wx.DEFAULT_FRAME_STYEL, string name='f

sanlihe302的专栏 933

wxpython学习笔记之wx.Frame

当创建wx.Frame的子类时,类应该调用其父类的构造器 wx.Frame.__init__()。wx.Frame的构造器所要求的参数如下: wx.Frame(parent, id=-1, title=” ”, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE,name=”frame”) 参数说明: parent:框架的父类,对于顶层窗口(SetTopW...

qq_41098957的博客 4325

wxPython中文教程 简单入门加实例

wx.Window 是一个基类,许多构件从它继承。包括 wx.Frame 构件。技术上这意味着,我们可以在所有的   子类中使用 wx.Window 的方法。我们这里介绍它的几种方法: * SetTitle( string title ) —— 设置窗口标题。只可用于框架和对话框。 * SetToolTip( wx.ToolTip tip ) —— ...

Just Code 1070

wxWindows一些网文

http://www.linuxfans.org/bbs/thread-115203-1-1.htmlinux公社论坛 » 应用编程技术与项目孵化 » (转)wxWindows一些网文 ‹‹ 上一主题 | 下一主题 ›› (转)wxWindows一些网文

skyremember的专栏 2279

使用C++开发wxWidgets程序

 不知道原文地址,给出获得这篇文章的地址:http://kylix.linuxaid.com.cn/book/wxWindowstut/wxTutorial.html 这篇文章对于初学者非常有帮助 if (window.showTocToggle) { var tocShowText = "显示"; var tocHideText = "隐藏"; showTocToggle

蜗牛档案室 7740

wxPython in Action(六十六)

8.2 使用框架框架包含了许多方法和属性。其中最重要的是那些查找框架中任意窗口部件的方法,和滚动框架中内容的方法。在这一节,我们将讨论如何实现这些。8.2.1 wx.Frame有那些方法和属性?这部分中的表包含了wx.Frame和它的父类wx.Window的最基本的属性。这些属性和方法的许多在本书中的其它地方有更详细的说明。表8.4包含了wx.Frame的一些公共的可读、可修改的属性。表8.4 w

510

wxPython开发总结---Frame,Panel以及一种项目架构

关注公众号“码农帮派”,查看更多系列技术文章: 前一段时间用Python开发了一个教育类的PC桌面应用,边学边开发,现在陆续的将开发过程中学到的一些东西分享记录下来,项目使用了wxPython框架。 wxPython的官网:https://www.wxpython.org/ wxPython各种控件用法官方手册 :http://xoomer.virgilio.it/i...

天马行空的专栏 1万+

windows下 搭建 wxWidgets 开发环境

codeblocks 搭建 wxWidgets : 经过网上的多次搜索整理,整理有一个最简便的配置方式,如下: 1:http://wxpack.sourceforge.net/Main/Downloads //wxPack下载(我下载的是wxPack_v2.8.12.01.exe),这样就不用下载wxMSW安装包或源码编译了; 2:wxWidgets可以和VC配合,但是这样配置麻烦不说,而且

chinabinlang的专栏 6832

Visual Studio 2008 配合 WxWidgets

一、下载并解压缩wxWidgets   1. 到 http://www.wxwidgets.org/downloads 下载一个wxMSW版本的wxWidgets。(wxMSW是专门针对Windows系统)   PS:这里推荐解压缩版:http://prdownloads.s

moyumoyu的专栏 761
上一篇: 普通高中生眼中的中国IT的现在与发展
下一篇: 略谈Python语言(最强的脚本语言)
VisionCat
博客等级 码龄24年 459粉丝 83原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值