wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

wxWidgets初学者导引(4)——wxWidgets学习资料及利用方法指导

4 wxWidgets学习资料及利用方法指导

  初学者常苦于找不到参考资料。实际上,是找不到,不是没有。真正有用的资料,常常也就在手边,只是不知道。有能力熟练地使用一切能用得着的资料,这是水平提高的指标之一。这种能力,同样,也是在实践中获得,而不是有谁为你讲一堂课就能得到。

  本章的学习资料,从最一般的——书籍开始谈起。

4.1 关于C++ wxWidgets的书籍

4.1.1 《使用wxWidgets进行跨平台程序开发》

  关于wxWidgets的书籍还真少见,从亚马逊上只查到一本《使用wxWidgets进行跨平台程序开发》(http://www.amazon.cn/gp/product/B00A1WDQ30),部分电子版(含书中例程的源代码,从http://download.csdn.net/detail/cjylg/2997827下载)。看得好,请支持纸质出版。

  这本书的英文版叫《Cross Platform GUI Programming With wxWidget》(见http://www.wxwidgets.org/docs/book/),我浏览过其中的一部分,读起来不难。

4.1.2 wxwidgetsWiki主页

  我推荐阅读的是wxwidgetsWiki主页(http://wiki.wxwidgets.org/Main_Page)中的Guides & Tutorials部分(http://wiki.wxwidgets.org/Guides_%26_Tutorials)链接的一个教程《wxWidgets tutorial》(http://zetcode.com/gui/wxwidgets/)。写作时再次看wxwidgetsWiki主页,发现其中的宝,太多了。开源社区的贡献者不仅提供软件的共享,而且将这种共享精神延续到指导书籍,必须赞。

4.1.3 wxWidgets tutorial

  《wxWidgets tutorial》是我极力推荐的一个在线教程。其中的叙述很少,一直在用小例子,启发读者获得对wxWidgets的认知。我一边读代码,一边练习,完成了一次愉快的学习之旅。《wxWidgets tutorial》最后一章开发了一个俄罗斯方块游戏,当看完并同步练习完之时,也就是掌握了用wxWidgets开发应用程序的基本路数之时。

  为方便读者,我将这个教程中整理到一个Word文档中,作为本教程的一个附件,一起打包供下载使用。在Word文档中,加入了部分批注,是我在学习中查阅得到的线索。

  唯一引发本文读者不爽的是,《wxWidgets tutorial》是英文版的。这其实是个好事,在这个时代,靠着翻译来的二手中文书还想学到新技术,不拍脑袋也知道这只是天方夜谭的事。不断学习英语,是IT学生的学习形态。我一直鼓励同学们“在用英语中学英语”(见http://blog.csdn.net/sxhelijian/article/details/12177147),这就是一个大好的时机。是否能看下去,不决定于你英语水平的高低,而是决定于你的心态。再进一步,这本书中的描述性文字很少,即使高考英语时是在考场抓阄决定ABCD的,也能看下去,只要去看。

4.2 用好wxWidgets的在线文档

  在互联网时代,另一类资料必须引起学习者的注意,那就是在线的文档和教程。

  到wxWidgets的主页http://www.wxwidgets.org/中看看,其中Documentation部分的每一个链接,各自都连接着一座宝库,如下图:

   wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

4.2.1 成熟平台常有在线文档

  用微软平台开发程序时,最好的参考是MSDNhttp://msdn.microsoft.com/library/),而用Java开发时,有Java SE 6 Documentationhttp://docs.oracle.com/javase/6/docs/index.html),也有部分内容被翻译成中文(http://www.javaweb.cc/JavaAPI1.6/)。在软件开发过程中,需要的类、函数、宏是记不住的。有在线文档查找,专业人员不记这些。大多数成熟的平台,既提供真正在线的文档,这些文档也可以下载到本地,通过浏览器阅读。

4.2.2 wxWidgets的在线文档

  wxWidgets也有在线文档(http://docs.wxwidgets.org/3.0/),在2.1节,要求读者下载了Manual(HTML).zip

  现在请选择一个自己用着习惯的文件夹,将Manual(HTML).zip解压缩。我解压缩到了F:\wxWidgets-3.0.0-docs-html。找到其中的index.html文件,双击打开,如下图所示,这就是将有大用的最佳参考。

   wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

  建议用鼠标右击index.html文件,在菜单中选择“发送到->桌面快捷方式”。在桌面上建立打开在线文档的快捷方式,将方便以后的使用。

4.2.3 查找在线文档

  在线文档通过超链接组织起相关材料之间的联系。作为实践,将各个链接点一点,你会有感觉。

  举一个例子。在《wxWidgets tutorial》中,Menus and Toolbars部分第一节Simple menu example中的例程,有一段如下代码:

SimpleMenu::SimpleMenu(const wxString& title)
   : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180))
{
  menubar = new wxMenuBar;
  file = new wxMenu;
  file->Append(wxID_EXIT, wxT("&Quit"));//练习:想知道Append函数的情况
  menubar->Append(file, wxT("&File"));
  SetMenuBar(menubar);
 
  Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED,
      wxCommandEventHandler(SimpleMenu::OnQuit));
  Centre();
}

  现在想知道wxFrame类的构造函数中的各参数含义,要点的链接是:Class->Class Index ->FwxWidgets中类的命名均以wx开头,取wxFrame中的F),如下图:

   wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

  接着,在“wxFrame Class Reference”页面,可以看到wxFrame类同其他类的继承关系以及其他信息,如下图:

   wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

  我们关心wxFrame类的构造函数,继续往下看,可以在“Constructor & Destructor Documentation”部分看到构造函数的定义及说明:

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 = wxFrameNameStr 

 

)

 

 

Constructor, creating the window.

Parameters

parent

The window parent. This may be NULL. If it is non-NULL, the frame will always be displayed on top of the parent window on Windows.

id

The window identifier. It may take a value of -1 to indicate a default value.

title

The caption to be displayed on the frame's title bar.

pos

The window position. The value wxDefaultPosition indicates a default position, chosen by either the windowing system or wxWidgets, depending on platform.

size

The window size. The value wxDefaultSize indicates a default size, chosen by either the windowing system or wxWidgets, depending on platform.

style

The window style. See wxFrame class description.

name

The name of the window. This parameter is used to associate a name with the item, allowing the application user to set Motif resource values for individual windows.

  这里,构造函数的参数、返回值一目了然,各个参数的含义、用法、默认值也可以看到。这是最佳的第一手的开发参考资料。

   

  下面请做一个练习。在读下面的程序时,想知道Append函数的情况。如何利用在线文档找到说明?请找到后,再找一遍真正学会。

  关于上面的代码中还有哪些疑问,试着通过在线文档给出解答。

4.2.4 查看在线文档的设备支持

  如果有条件,布置如下图所示的工作条件。用双屏,一个看文档,一个写程序。

   wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

  当前的学习,有很多时候用电子版的参考资料。开发中查阅在线文档,是件相当频繁的事情,双屏幕的配置成为需要。

  当然,作为在校学生,当场地受限时,也不必太纠结这样的条件了。毕竟,这不是必须。

4.3 在编程环境中找帮助

  本文使用的编程环境是Code::BlocksC++编码规范中,将类声明、常变量声明、宏定义等保存在头文件(.h)中,而将类、函数的实现用源文件(.cpp)保存。头文件实际上就是一个非常好的帮助文档。符合规范要求的开发者,通过恰当的命名,总能够让程序的阅读者“见文知义”,从头文件中得到足够的信息。

  在Code::Blocks中,为找到这些信息提供了足够的支持。其实,其他IDE,也能做到这一点。

  例如,对于4.2.3中的那一段代码:

SimpleMenu::SimpleMenu(const wxString& title)
   : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180))
{
  menubar = new wxMenuBar;
  file = new wxMenu;
  file->Append(wxID_EXIT, wxT("&Quit"));  //例
  menubar->Append(file, wxT("&File"));    //练习
  SetMenuBar(menubar);
 
  Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED,
      wxCommandEventHandler(SimpleMenu::OnQuit));
  Centre();
}

  现在,想知道file->Append(wxID_EXIT, wxT("&Quit"));一句中Append函数各参数的含义。由上一句可以看出,file是wxMenu类的实例,只要看wxMenu类的声明即可。于是,在Code::Blocks中,单击鼠标右键,单击在在菜单中出现的“Find declaration of: wxMenu”选项,如图:

   wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

  在Code::Blocks中,将打开新的页签,显示wxMenu类的声明。但是wxMenu类并没有Append这样的成员函数,发现wxMenu类是wxMenuBase类的派生类,推断Append应该是继承自wxMenuBase类的成员函数。用相同的操作,在wxMenuBase类名上单击鼠标右键并选择对应的选项,在新出现的页签中,找到了Append成员函数的4种重载形式的的声明,如下图所示。

   wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

 

  现在做一个练习。找出menubar->Append(file, wxT("&File"));中Append函数的声明,从中看出其调用的方法。

4.4 深入学习路线建议

4.4.1 看书的策略

  在完成本文前3章的工作之后,建议同时看《使用wxWidgets进行跨平台程序开发》和《wxWidgets tutorial》这两本书,同步地实践书中的程序。

  同步看,意味着交叉、重复再看。可以先运行例程,有感性认识之后再阅读代码。一次看不明白不要紧,继续往后看,或者看另外一本书的相关部分,当再次看时,问题或许能够自然化解。

  我在学习中,看完了《使用wxWidgets进行跨平台程序开发》的前两章,然后将《wxWidgets tutorial》从头看到完,再看《使用wxWidgets进行跨平台程序开发》中的后面部分时,常能联系起《wxWidgets tutorial》中运行过的例子。这种安排的体验,感觉不错。

  在Code::Block中频繁新建项目很麻烦,况且每建一个项目还得设置Build options...。我的做法是,建立了一个只包含一个源文件的项目。所有的练习,都是将代码粘贴到这个文件中完成,这节约了不少时间。

  《wxWidgets tutorial》中的例子写得非常规范,严格执行了.h头文件中写声明,.cpp源文件中写实现的要求。我在实践时,偷了个懒,将本应放在多个文件中的内容,粘贴到前述的一个文件中。当然,诸如

#include <wx/wx.h>
#include <wx/menu.h>

之类的包含头文件要保留,而

#include "menu.h"

  之类的自定义头文件的包含命令,需要删除。因为合并到了同一个文件中,这些头文件根本不存在。

4.4.2 更多的案例

  安装好的wxWidgets中还提供了很多演示和示例的项目。X:\wxWidgets-3.0.0\demos中是所有的演示案例,示例的项目在X:\wxWidgets-3.0.0\samples中,学习到一定时候,运行这些程序,读一读源码,是一种很好的学习方式。

  例如,wxWidgetsDemo中的一个项目forty,是一个纸牌游戏,运行结果如下图:

   wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

  这个项目中的源文件如下图所示:

   wxWidgets菜鸟导引(4)——wxWidgets学习资料及利用方法指导

  在Code::Block中新建一个项目,将Demo\forty中所有.cpp.h文件复制到项目所在文件夹中,并通过鼠标右击项目名,在弹出菜单上选Add file...的方式将文件加入项目,成为项目的源文件和头文件。Demo为适应多种平台,提供了很多的文件,一般只需要.cpp.h文件即可,如上图中加了方框的部分。

  如果项目中有.xpm文件(并不是每个项目都有),也请将这种文件复制过去,这是一种图形格式文件,程序中一般会用到。项目forty中就有3个这样的文件。

  在更极少数情况下,还可能有其他文件需要复制过去。这可以通过读代码,看源程序中是否写了这个文件名。偷懒的办法,运行程序,若由于找不到文件出错了,会提示还需要哪个文件。比如项目forty中的about.htm文件。

  后两类文件复制过去即可,是为支持程序运行的,不必通过Add file...将其加入项目。

  运行其他项目,方法类似。




================= 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====