使用wxWidgets编程——第一步

wxWidgets可视化框架开发——上 wxWidgets 是一个开源的 C++ 跨平台 GUI(图形用户界面)框架,允许开发者使用同一套代码构建在多个操作系统(如 Windows、macOS、Linux 等)上运行的可视化程序。 阅读详情

译者注:出于个人对wxWindgets的爱好,翻译了此文,总共计8章。在翻译过程中,力求忠实于原文的表达方法。说真的中西方的表达方式真的有很大不同,单独看一个句子是没错误,可放联系上下文,就根本不是那么回事,所以想在两者之间找到一个平衡点,还真是件难事。不管各位怎么看,我还是会按自己的想法翻译下去,希望大家还能够看懂。


介绍

我们现在看到的是另外一种更为友好的建立winodws程序的方式,使用的是一套称着wxWidgets的类库。 严格地说wxWidgets不仅仅是一个库集,它还是一个应用程序框架,这也就意味着它提供有一个的体系结构,使之可以使用这些类来开发完整的应用程序。 使用wxWidgets的好处并没有就此停住,它也是一个跨平台的库。 引用wxWidgets作者的话:

wxWidgets是什么?
wxWidgets提供了简单易用的API,让你在多平台上编写GUI应用程序。 使用相应的针对你的平台(Windows/Unix/Mac)的库和编译器(几乎所有流行的C++编译器)进行连接(link),你的应用程序会采用与那个平台相对应的外观。 在强大的GUI功能方面,wxWidgets提供有: 在线帮助、网络编程、流、剪贴板拖拉、多线程、各种流行格式图像的装载和保存、数据库支持、HTML浏览和打印等许许多多的内容。

wxWidgets拥有很高的品质,实际上,有人可能会使用“商业品质”这个词汇来形容wxWidgets——意思是说它真的很好,值得付账。 这点千真万确,只是如果对于wxWidgets有批评的话,那就是,对于初学者,想要掌握它太难了: 刚开始的学习过程是有点复杂。 对于这个批评的乐观回复是一旦程序员掌握了wxWidgets的结构体系,例如它的类、函数和技巧,编写可用的应用程序将是一个非常有益和相对简单的过程 也可能有经济上的回报,wxWidgets是一个相当丰富的框架,以至几乎可以涉足什么应用程序领域。

在阅读本文时,你可能已经猜到我是一名狂热的wxWidgets支持者。 这是真的,我也很乐意通过这些网页将我对wxWinodws的热情传送给你。

我的计划是解释wxWidgets的体系结构以及通过一系列的例程,从最基础的开始介绍wxWidgets里的类。 在你完成之后,你应该可以很好地掌握wxWidgets了。

在开始之前,请注意以下几点:

  • 我并不认为我是个很不错的程序员,我也不认为我对wxWidgets有多精通,但我善于文字,我自信能够将复杂的问题解释清楚。
  • 你需要了解C和C++,但不定很详细。 在你学习wxWidgets的时个,你在C和C++方面的能力会大大增强。 如果你已经看了本网站的上大部分的C++资料,并且理解了,那我就认为你不会有什么问题。
  • 你需要理解面向对象编程和类。 在本站里的大部分资料将再一次有助于你。
  • 刚开始是在Windows平台上完成的。Win95, Win98 和 Win2K 全都用到了。 随同wxWidgets包一起的MingW提供的是开发环境。

如果你对C++编程还是个初学者,而你又想快速地进入使用wxWidgets开发“真实世界(real-world)”的GUI程序的殿堂,这几页将对你有很大的帮助。 跟着来吧!


返回页首


wxWidgets体系结构和第一个程序

这只是个开始,而且我在一开始我就已经做了简化。 wxWidgets框架的第一个体系结构就是保持最简单的观点。 随着我们的深入,关于该框架我们会了解更多。

wxWidgets GUI程序的组成:

  • 一个应用程序对象——wxApp类的一个实例
  • 一个框架对象——wxFrame类的一个实例 一个框架(frame)可以有象菜单栏(menubar)、状态栏(statusbar)、图标(icon)等等内容。
  • 框架(frame)就是个容器,可以容纳许多其它象文本控制器(text control)、按钮(button)、分割器( splitter)等一样的对象。

在最简单的程序里,我们可能只有一个空的构架(frame),而且这个也是我们看到的第一个基本例子。 让人迷惘它到底有什么用是情有可原的。 如果没有其它的内容,它很更有指导意义,那也是我们首先看它的原因。 你会看到它显示出了windows应用程序所有的常见行为。 它有一个系统菜单,可以到处移动,可以改变大小并且可以关闭。


我知道它看起来并不怎么样,可它是我们的! 它也显示给我们这个程序展示的是本地GUI的外观。 这里是Windows 98,但是要记住wxWidgets是一个跨平台的框架而且可以用来为其它平台(象Linux,OS2,Mac等等)开发应用程序。

第一个例子的源代码显示如下:



 #ifndef BASIC_H #define BASIC_H class BasicApplication : public wxApp { public: virtual bool OnInit(); }; class BasicFrame : public wxFrame { public: BasicFrame( const wxChar *title, int xpos, int ypos, int width, int height); ~BasicFrame(); }; #endif 

这是头文件。 在这个基本的程序里我们声明了两个类:

  • 继承于wxAppBasicApplication
  • 继承于wxFrameBasicFrame

我们为BasicFrame声明了构造函数和析构函数,但对于BasicApplication我们唯一做的就是重载了Oninit()方法。 注意,因为我们是在重载,所以我们把该方法声明为虚拟的(virtual)。

 #include <wx/wx.h> #include "basic.h" IMPLEMENT_APP(BasicApplication) bool BasicApplication::OnInit() { BasicFrame *frame = new BasicFrame("Basic", 50, 50, 450, 300); frame->Show(TRUE); SetTopWindow(frame); return TRUE; } BasicFrame::BasicFrame (const wxChar *title, int xpos, int ypos, int width, int height) : wxFrame ( (wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height) ) { } BasicFrame::~BasicFrame() { } 

这是实现,类的定义声明在basic.h里。

要注意的第一件事是宏(macro)

IMPLEMENT_APP(BasicApplication)

依据我们的观点,它构造了BasicApplication对象而且为我们的应用程序提供了main入口。 它虚拟地代替了我们前面的课程里在函数 int WINAPI WinMain( ... )中所做的所有的工作。

方法OnInit()创建了BasicFrame的一个实例,使用了默认的x和y, width(宽度)和height(高度),以及title(标题)。 它然后调用方法Show()来显示框架(frame)。 如果你查看wxFrame类,你会找不到方法Show()。wxFrame继承于wxWindow,而Show()是wxWindow的成员函数。 作为初学者,你需要记住这一点——因为许多类的都继承于其它类,所以不要忽略可能是父类提供的方法。

OnInit()也调用了wxApp的一个成员SetTopWindow()

构造函数和析构函数没有增加任何新的动作给我们的BasicFrame类。

 #include "wx/msw/wx.rc" 
最后一个相关的文件是资源文件。 在这个简单的例子里,我们没有增加任何自己的资源文件,不过你或许经常使用资源文件,而且里边至少包含这样一行:

#include "wx/msw/wx.rc"

在后面的例子里,我们会添加自己的资源。


所有剩下的工作就是建立和运行程序了。



使用MingW来建立wxWidgets程序

wxWidgets发行包里有许多的实例,而且所有的实例都有针对不同平台的make文件。 尽管这是个产生程序的很好的方法(因为用户不必在意指定所有的确定生成何种目标程序的细节),但我必须承认我发现它让人有点迷惑。 正如我随意感觉到的一样,也有一个不利的地方,那就建立(build)的过程必须要指定包含文件和库在什么地方。 我发现把wxWidgets包含文件放在标准的包含目录,而把wxWidgets库放在标准库目录里会更有帮助。 在建立和安装好库后,我会把它和wx包含目录移动到标准位置里。 在Windows系统里该位置在MingW目录里(译者注:我的MingW安装在E:/mingw/bin;而wxWidgets安装目录是F:/wxWidgets-2.5.2),而在Linux系统里它可以是在/usr或者/usr/local树里(usr/lib, /usr/include 或 /usr/local/lib, /usr/local/include)。

重新调整库和包含文件位置的主要好处是它可以排除可能给初学者带来的困惑。 这个完成后,我们现在使用下面的make文件来建立(build)程序(译者注:为了适应最新版本,所以做了较大的改动,以后的实例都会在些make文件的基础上进行修改使用):

 PROGRAM = basic OBJECTS = ${PROGRAM}.o ${PROGRAM}_resources.o RC = windres.exe CC = g++ INCLUDES = -IF:/wxWidgets-2.5.2/include -IF:/wxWidgets-2.5.2/lib/gcc_lib/mswd -I. LIBS = -lwxmsw25d_core -lwxbase25d -lwxtiffd -lwxjpegd -lwxpngd / -lwxzlibd -lwsock32 -lwxregexd -lwxexpatd -lkernel32 -luser32 / -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 / -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lodbc32 RESSW = ${INCLUDES} --use-temp-file --define __WXMSW__ CCSW1 = -LF:/wxWidgets-2.5.2/lib/gcc_lib -g -O0 -DHAVE_W32API_H -D__WXMSW__ / -D__WXDEBUG__ -Wall CCSW2 = -LF:/wxWidgets-2.5.2/lib/gcc_lib -Wl,--subsystem,windows -mwindows .SUFFIXES: .o .cpp all: ${OBJECTS} $(CC) -o $(PROGRAM) ${OBJECTS} ${CCSW2} ${LIBS} .cpp.o: $(CC) ${CCSW1} ${INCLUDES} -c -o $@ ___FCKpd___3lt; ${PROGRAM}_resources.o: $(RC) ${RESSW} ${PROGRAM}_resources.rc $@ .PHONY : clean clean: echo cleaning up rm $(OBJECTS) rm *.$ rm ${PROGRAM}.exe 


建立(build)程序:

  1. 在一个单一目录里创建资源文件
    • basic.h
    • basic.cpp
    • basic_resources.rc
    • Makefile
  2. 在存放那些文件的目录里运行make
    • make
  3. 运行程序
    • basic

我们使用了的wxWidgets类

我们只使用了两个类:

  • wxApp
  • wxFrame

我们从那里继承了自己的类了BasicApplication和BasicFrame。 我会详细说明两个类,不过你也可以阅读wxWidgets文档里的更多完整的描述。

wxApp

wxApp类包含了大约30多个可以访问的成员,不过在这里我们并不需要查看wxApp里的任何细节。 后面在我们使用wxWidgets事件系统完成任务时,我们会再讨论wxApp。

wxFrame

因为wxFrame类所做工作的“可见性(visible)”更强,所以我们要花费一点点的时间来看看它的一些属性。

wxFrame构造函数
 wxFrame ( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = "frame" ) 

我们的BasicFrame构造函数只提供了四个常见的参数: 标题(title),坐标x和y,以及宽度(width)和高度(height)。

wxFrame构造函数还有其它的参数: wxWidgets指针、样式(style)、名字(name)和wxWidgetsID,最后那个是个整数,而且如果它为-1的话,就使用默认值。 提供自己的ID有时会很有用。 指针会指向父窗口,如果有的话。 在这里,指针为空(NULL),即没有父窗口。 名字参数可以象参数ID一样,由程序员来提供,在引用一个框架(frame)也许会有用处。

框架(frame)样式可以各式各样:

窗口样式
  • wxDEFAULT_FRAME_STYLE 可以被定义为 wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxRESIZE_BOX | wxSYSTEM_MENU | wxCAPTION。
  • wxICONIZE 图标化(最小化)显示框架(frame)。 仅限于Windows。
  • wxCAPTION 在框架(frame)上显示标题。
  • wxMINIMIZE 等效于 wxICONIZE。 仅限于Windows。
  • wxMINIMIZE_BOX 在框架上最小化显示盒框(box)。
  • wxMAXIMIZE 最大化显示框架(frame)。 仅限于Windows。
  • wxMAXIMIZE_BOX 在框架上最大化显示盒框(box)。
  • wxSTAY_ON_TOP 保持在其它窗口的上方。 仅限于Windows。
  • wxSYSTEM_MENU 显示系统菜单。
  • wxSIMPLE_BORDER 无边界显示或无任何修饰。 仅限于GTK和Windows。
  • wxRESIZE_BORDER 在窗口四周显示可变大小边界(仅限于Unix)。
  • wxFRAME_FLOAT_ON_PARENT 让框架(frame)位于父窗口z轴方向的上方,而不是显示在任务栏上。 如果没有这个样式,建立为最上层窗口的框架可能被父窗口挡住,而且框架的标题也会显示在任务栏。 限于Windows和GTK。
  • wxFRAME_TOOL_WINDOW 建立一个带有小标题栏的框架(frame);框架(frame)标题不会出现在任务栏。 仅限于Windows。

一个框架(frame)样式是一个或多个样式的“或(OR)”运算。 在没有定义样式时(如我们的BasicFrame),就使用默认的。例如BasicFrame会有一个最小化的盒框,一个最大化的盒框,一个系统菜单,一个标题而且可以改变大小。

要做的修改……
 BasicFrame::BasicFrame (const wxChar *title, int xpos, int ypos, int width, int height) : wxFrame ( (wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height), wxSIMPLE_BORDER ) ... 

这样你可以看到不同样式的不同效果;象这里显示的那们,修改BasicFrame的构造函数,这样一个样式就会做为参数传递给wxFrame构造函数。



在wxFrame的成员中,大约有二三十个是方法:

  • CreateStatusBar
  • CreateToolBar
  • GetTitle
  • SetIcon
  • SetMenuBar
  • SetStatusBar
  • SetStatusText
  • SetToolBar
  • SetTitle

在后面的部分,你会使用它们中的大部分,不过现在有个使用SetTitle和GetTitle成员函数的练习。

框架(frame)标题和框架(frame)名字
 BasicFrame::BasicFrame (const wxChar *title, int xpos, int ypos, int width, int height) : wxFrame( (wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height), wxDEFAULT_FRAME_STYLE, "Fred" ) { } 
为了传递名字给wxFrame的构造函数,该构造函数已经作了修改。 现在新增这样一行:

 frame->SetTitle(frame->GetTitle() + " " + frame->GetName()); 

到函数BasicApplication::OnInit(),并且在frame->Show(true)一行的前面。

建立运行程序,你就会看到效果了。 方法GetName()是从哪里来的呢?




总结

在这个部分,你已经对wxWidgets有了大致的了解。 你见到了基本的wxWidgets框架,而且对它的体系结构有了一定的概念。 不要忘了查看wxWidgets文档的类参考手册。 刚开始你可能会发觉它让人有点迷惑,不过在练习之后,效果就会不同了。 同时我也建议,在机会合适的时候(应该经常有的),你应该看看wxWidgets的源代码。 在里边,你会发现许多有用的注释,同时也会开始领悟这个优秀软件包里所蕴藏的精髓。

返回页首


版权所有 © 1999 - 2001 原作者: David Beech 中文翻译:张雪平

更新日期:2004年8月22日



Google
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
wxWidgets编程指南 wxWidgets是跨平台的GUI开发工具包或框架,让你一次编写多平台编译。 阅读详情

相关推荐

MacOS如何在XCode使用wxWidgets框架开发桌面应用

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易

cncdns的专栏 1461

wxWidgets 的全面介绍及使用方法

开发者可以直接使用已有的控件和事件处理程序,或自己编写新的控件和事件处理程序,快速构建一个完美的界面。它提供了一套完整的工具包,包括控件、类、事件处理程序等,可以让开发者轻松地开发 GUI 应用程序,而不需要重新编写代码以适应每个平台。总之,wxWidgets 是一个非常强大、简单易用的 C++ 库,用于创建跨平台的 GUI 应用程序。wxWidgets 中的控件非常丰富,包括按钮控件、文本框控件、列表框控件等等,开发者可以根据自己的需求选择合适的控件来构建界面。wxWidgets 的全面介绍及使用方法。

uote_e的博客 2111

wxWidgets使用XRC资源

试着使用了一下wxWidgets库,对wxWidgets调用XRC资源很感兴趣,将在WINDOWS使用XRC资源的过程整理出来。 1 先编译出wxWidgets库的Lib,如果是VC,直接使用build\msw目录下对应版本的dsw文件。 2 创建自己的工程,用VC创建一个WIN32版本的程序,添加相应的CPP文件和H文件。     2 -1 一个最简单的程序应该包含一个主CPP文件,在其

nbabn的专栏 3871

wxWidgets:创建和管理用户界面的强大工具

wxWidgets是一个开源的C++图形用户界面(GUI)库,它提供了一套跨平台的工具和类,用于创建和管理用户界面。wxWidgets是一个强大的工具,它提供了丰富的类和功能,使开发者能够轻松创建跨平台的用户界面。我们首先了解了安装和配置wxWidgets的基本步骤,然后通过一个简单的示例演示了如何创建一个基本的窗口应用程序。在MyApp的OnInit函数中,我们创建了一个MyFrame的实例,并显示出来。下载wxWidgets:访问wxWidgets官方网站,下载稳定版本的wxWidgets库。

TechO_O的博客 1139

wxWidgets 教程】安装、配置、HelloWorld篇(一)

wxWidgets 3.2 使用 CMake 进行安装、配置,并用其编写一个最基本的项目。

Xiao_Ley的博客 1万+

wxWidgets完整教程专栏完整目录

wxWidgets完整教程专栏完整目录

希望我的博客,能帮上你解决学习中工作中所遇到的问题 3795

wx网罗系列之入门: 使用wxWidgets编程——第一步

这是我非常喜欢的一个入门教程。我喜欢从这里出发。排版整理完毕。皿  译者注:出于个人对wxWindgets的爱好,翻译了此文,总共计8章。在翻译过程中,力求忠实于原文的表达方法。说真的中西方的表达方式真的有很大不同,单独看一个句子是没错误,可放联系上下文,就根本不是那么回事,所以想在两者之间找到一个平衡点,还真是件难事。不管各位怎么看,我还是会按自己的想法翻译下去,希望

Utensil的专栏 2万+

wxWidgets:构建wxWidgets程序的第一步

wxWidgets:构建wxWidgets程序的第一步wxWidgets:构建wxWidgets程序的第一步介绍wxWidgets 架构和你的第一个程序使用 MinGW 构建 wxWidgets 程序使用wxWidgets 类概括 wxWidgets:构建wxWidgets程序的第一步 介绍 我们现在看看使用一组称为 wxWidgets 的类库来构建 Windows 程序的另一种更友好的方法。严格来说,wxWidgets 不仅仅是库,它是一个应用程序框架,这意味着它提供了一个架构,可以使用类来开发完整的

希望我的博客,能帮上你解决学习中工作中所遇到的问题 830

wxWidgets编程入门

0,完整实例 #include "wx/wx.h" // 定义应用程序类 class MyApp : public wxApp { public:    // 这个函数将会在程序启动的时候被调用     virtual bool OnInit(); }; // 定义主窗口类 class MyFrame : public wxFrame { public:    // 主窗口类

把握自己。 5142

wxWidgets sockets编程学习

wxWidgets sockets编程学习 工作环境:CodeBlock17.12,wxWidgets3.0.4,win10,GNU编译器 目的:学习wxWidgets使用wxSocket进行sockets编程,实现UDP, TCP, HTTP(URL)的功能。包括服务器端和客户端的代码演示。 源代码地址:https://download.csdn.net/download/qq_2331346...

qq_23313467的博客 1527

wxWidgets GUI 编程介绍

wxWidgets GUI 编程介绍 导论 wxWidgetsC++的跨平台开发框架。它由 Julian Smart 于1992年在爱丁堡大学人工智能应用研究院发起的,自那之后,该框架分发到了众多平台之上。 本文旨在引导初学者安装所需资源并以Code::Blocks作为IDE使用wxWidgets开发一个单应用程序。 什么是wxWidgets wxWidgets 是一系列C++库,它...

boazheng的博客 1888

在CodeBolcks+wxWidgets+wxSmith下的C++编程教程——用向导创建一个wxWidgets项目(sTetris)

在开始下面的内容之前,我假定你已经安装了CodeBlocks程序开发环境,配置了wxWidgets,测试使用CodeBlocks创建第一个程序成功编译运行,并且了解了C++语言的基础知识和使用wxWiddgets开发C++程序的知识。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。选择哪一个版本要看你安装的是哪一个版本的wxWidgets 库文件,选择了你没有的版本,在编译你的程序时会因为找不到库文件而导致编译失败。向导页面②:输入项目名称。

weixin_55010563的博客 935

【免费下载】 wxWidgets 控件编程示例项目介绍

本项目是一个开源项目,旨在展示如何使用 wxWidgets 控件通过编程代码进行开发,主要使用编程语言是 C++17。 ## 项目基础介绍 wxWidgets 是一个开源的 C++ GUI 库,它允许开发者使用相同的代码基础创建跨平台的应用程序,支持 Windows、macOS 和 Linux 等操作系统。本项目提供了大量的编程示例,涵盖了 wxWidgets 的各种控件和功能,从基础的控件...

gitblog_00591的博客 2152

c++ 使用wxWidgets进行跨平台开发

本文阐述了wxWidgets的由来,以及从wxWidgets的特点出发,说明了选择wxWidgets给我们带来的好处,并且通过一个典型的例子讨论了如何在C++使用wxWidgets开发跨平台的软件。 什么是wxWidgetswxWidgets是一个跨平台的软件开发包。它诞生于1992年,最初的名子是wxWindows,但由于Microsoft的抗议,在2004年改名为wxWidgets。...

technologyleader的专栏 1万+

wxWidgets使用

wxWidgets Code::Blocks

赤龙绕月的专栏 1931

wxwidgets 界面编程如何使用 png 图片

wxwidgets 是跨平台的GUI C++库,相比MFC, 更易学,更易使用。GUI编程会用到小图标,下面介绍一种将使用的png图标和编译的 exe 文件打包到一起的办法先使用VC编译下面的代码为一个 exe 文件,比如:convert.exe #include #include #include #include #ifndef PATH_MAX

eastbear的专栏 3014
上一篇: wxWidgets之--wxSizer
下一篇: 搭建跨平台编程环境Code::Blocks+wxWidgets
snaill
博客等级 码龄27年 599粉丝 159原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值