在vs2010的开发环境下进行wxWidgets开发入门

wxWidgets是一个历史悠久、基础雄厚的,可跨多种平台的基于C++的、开源的多功能图形用户界面库。支持Windows、OSX、Linux和Unix的32位和64位结构,同时还支持一些移动平台。如果对C++不熟,wxWidgets库同时还支持Python、Perl、Ruby和其他的语言的封装。WxWidgets生成的程序,会让程序外观和本地平台一样,这和QT只是自己绘制界面风格不太一样。最初它曾被命名wxWindows,它受着Windows的MFC的深远影响,很多概念都和MFC很类似,最初命名的基本含义也就是MFC的移植库,后面为了不让使用者引起“只能在Windows下使用”的歧义,才正式改名为wxWidgets。

 

1、下载wxWidgets 3.1.0和vs2010

·        下载wxWidgets源码包(官网),我用的是3.1.0版;

·        安装Visual Studio。我用的是VS 2010;

下载地址:http://sourceforge.net/projects/wxwindows/files/?source=navbar

我下载的地址是https://github.com/wxWidgets/wxWidgets

下载完以后安装到任意目录下。(其实就相当于解压缩一下,下载的是源代码)

2、编译源码

a、解压wxWidgets的源码包,会得到一大堆文件。进入build\msw文件夹,这个文件夹内是专门为Visual Studio提供的工程文件。在里面能找到从VC7到V12的工程文件。我用的是VS 2010所以选择的是VC10。


b、开始编译。因为我们下载的是源文件,而要将其转化为库文件(如果对库的概念不是很了解可以上网查查)就需要编译整个解决方案,对于编译时间大家不用担心,非常的快!!!编译24个项目大概花3-4分钟的样子。

3、通过一个helloWorld初识wxWidgets

(1)、建立测试项目配置项目属性:

首先建立一个Win32空项目或者直接空项目都可以(注意:如果建控制台项目后面会报错)。

将下面的测试源代码加入到一个cpp文件中。

1.    #include "wx/wx.h" 

2.    class MyApp: public wxApp[DD1]  

3.    { 

4.        virtual bool OnInit(); 

5.    };

6.    DECLARE_APP(MyApp)[DD2] 

7.    class MyFrame: public wxFrame[DD3]  

8.    { 

9.    public: 

10.      MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); 

11.      void OnQuit(wxCommandEvent& event); 

12.      void OnAbout(wxCommandEvent& event); 

13.      DECLARE_EVENT_TABLE() [DD4] 

14.  }; 

15.  enum[DD5]  

16.  { 

17.      ID_Quit = 1, 

18.      ID_About, 

19.  }; 

20.  BEGIN_EVENT_TABLE(MyFrame, wxFrame) 

21.      EVT_MENU(ID_Quit,  MyFrame::OnQuit) 

22.      EVT_MENU(ID_About, MyFrame::OnAbout) 

23.  END_EVENT_TABLE()  [DD6] 

24.  bool MyApp::OnInit()[DD7]  

25.  { 

26.      MyFrame *frame = new MyFrame(wxT[DD8] ("Hello World"), wxPoint(50, 50), wxSize(450, 340) ); 

27.      frame->Show(true); 

28.      SetTopWindow(frame); 

29.      return true; 

30.  } 

31.  MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) 

32.         : wxFrame(NULL, -1, title, pos, size) 

33.  { 

34.      wxMenu *menuItem = new wxMenu; 

35.      menuItem ->Append( ID_About, wxT("&About...") ); 

36.      menuItem ->AppendSeparator(); 

37.      menuItem ->Append( ID_Quit, wxT("E&xit") ); 

38.      wxMenuBar *menuBar = new wxMenuBar; 

39.      menuBar->Append(menuItem, wxT("&File") ); 

40.      SetMenuBar( menuBar ); 

41.      CreateStatusBar(); 

42.      SetStatusText(wxT("Welcome to wxWidgets!") ); 

43.  } 

44.  void MyFrame::OnQuit[DD9] (wxCommandEvent& WXUNUSED(event)) 

45.  { 

46.      Close[DD10] (true); 

47.  } 

48.  void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) 

49.  { 

50.      wxMessageBox(wxT("This is a wxWidgets Hello world sample"), 

51.                    wxT("About Hello World"),  

52.                    wxOK | wxICON_INFORMATION, this ); 

53.  } 

54.  IMPLEMENT_APP(MyApp) [DD11] 

 

现在编译这个文件显然是通不过的,下面要对编译选项进行配置

(2)、包含目录:

在项目——属性——VC++目录——附加包含目录下加入wxWidgets库的头文件(此头文件是安装文件夹里的include文件夹)


这样系统就能知道你引用的头文件来自哪里了

(3)、包含库目录(让系统知道你即将使用的库文件来自哪里。)

项目——属性——VC++目录——库目录在库目录里加入wxWidgets安装文件夹下的lib/vc_lib文件夹



(4)、使用库。

把项目要用到的lib附加到项目属性中

项目--属性--链接器--输入--附加依赖库项,编辑这里要非常注意!!!

加入库名称:

1.    wxmsw31ud_core.lib 

2.    wxbase31ud.lib 

3.    wxtiffd.lib 

4.    wxjpegd.lib 

5.    wxpngd.lib 

6.    wxzlibd.lib 

7.    wxregexud.lib 

8.    wxmsw31ud_adv.lib 

9.    wxmsw31ud_html.lib 

10.  wxmsw31ud_xrc.lib 

11.  wxbase31ud_net.lib 

12.  wxbase31ud_xml.lib 

13.  wxexpatd.lib 

14.  winmm.lib 

15.  comctl32.lib 

16.  rpcrt4.lib 

17.  wsock32.lib 

 

(5)编译、运行,就出现了如下界面了:

 

4、通过分析上述helloWorld例程,深入wxWidgets编程框架

 


 [DD1]wxApp:应用程序类

继承自该类的子类至少需要定义一个OnInit函数。

 [DD2]DECLARE_APP(MyApp)声明应用程序实例,便于用户调用wxGetApp()函数获得应用程序实例的引用。

声明应用程序实例,便于用户调用wxGetApp()函数获得应用程序实例的引用。

 [DD3]wxFrame:框架窗口类

一个Frame窗口是一个可以容纳别的窗口的顶级窗口,通常拥有一个标题栏和一个菜单栏。

 [DD4]DECLARE_EVENT_TABLE()声明事件表,告诉wxWidgets这个类想要自己处理某些事件。

 [DD5]用枚举自定义标识符。通常,可以通过枚举、常量或者宏定义的方式来自定义识符。

 [DD6]

BEGIN_EVENT_TABLE(MyFrame, wxFrame)  
 
END_EVENT_TABLE() 

实现事件表,告诉wxWidgets来自用户或者其他地方的事件应该怎样和类的成员函数对应起来。

 [DD7]bool MyApp::OnInit()函数通常应该创建一个窗口,对传入的命令行参数进行解析,为应用程序进行数据设置和其他的一些初始化操作。如果该函数返回为true,wxWidgets将开始事件循环用来接收用户输入,并在必要时处理这些输入;如果该函数返回为false,wxWidgets将会释放它内部已经分配的资源,然后结束整个程序的运行。

 [DD8]wxT宏

作用是,让代码兼容Unicode模式,与另外一个_T宏的作用是完全一样的。使用这个宏不会带来运行期的性能损失。(此外,还有”_()”标记,是用来告诉wxWidgets将其中的字符串翻译成指定语言的版本。)

 [DD9]

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) 

事件处理函数的实现。

 [DD10]事实上,Close(true);函数并不直接关闭frame窗口,而是产生一个wxEVT_CLOSE_WINDOW事件,这个事件的默认处理函数会调用wxWindow::Destroy函数释放frame窗口。

 [DD11]MPLEMENT_APP(MyApp) 创I建MyAPP实例。


5、wxWidgets程序一般执行过程

1. 依照系统平台的不同,不同的main函数或者winmain函数或者其它类似的函数被调用(这个函数是由wxWidgets内部提供的,而不是由应用程序提供的)。wxWidgets 初始化它自己的数据结构并且创建一个MyApp的实例。

2. wxWidgets调用MyApp::OnInit函数,这个函数会创建一个MyFrame的实例。

3. MyFrame的构造函数通过它的基类wxFrame的构造函数创建一个窗口,然后给这个窗口增加图标,菜单栏和状态栏。

4. MyApp::OnInit函数显示主窗口并且返回真。

5. wxWidgets开始事件循环,等待事件发生并且将事件分发给相应的处理过程。

应用程序会在以下情况下退出:主窗口被关闭,用户选择退出菜单或者系统按钮和系统菜单中的关闭选项(这些系统菜单和系统按钮在不同的系统中就往往千差万别了)。

 

5、学习材料清单

wxWidgets 的官网:http://www.wxwidgets.org/downloads/

 

wxWidgets的在线文档:http://docs.wxwidgets.org/3.1/

 

wxWidgets 的下载页面:http://www.wxwidgets.org/downloads/

 

在线教程《wxWidgetstutorial》:网址在http://zetcode.com/gui/wxwidgets/

 

wxwidgets 的Wiki 主页:http://wiki.wxwidgets.org/Main_Page

 

Wxwidgets Wiki 的Guides & Tutorials:http://wiki.wxwidgets.org/Guides_%26_Tutorials

 

深入wxSmith的教程:http://wiki.codeblocks.org/index.php?title=WxSmith_tutorials

 

6、深入学习路线

看书策略:

建议同时看《使用wxWidgets 进行跨平台程序开发》和《wxWidgets tutorial》这两本书,同步地实践书中的程序。

案例练习:

源码包解压后,其中.\samples目录提供了很多演示和示例的项目。

 

 


猜你喜欢

转载自blog.csdn.net/Fan0920/article/details/53304387
今日推荐