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 wxwidgets的Wiki主页
我推荐阅读的是wxwidgets的Wiki主页(http://wiki.wxwidgets.org/Main_Page)中的Guides & Tutorials部分(http://wiki.wxwidgets.org/Guides_%26_Tutorials)链接的一个教程《wxWidgets tutorial》(http://zetcode.com/gui/wxwidgets/)。写作时再次看wxwidgets的Wiki主页,发现其中的宝,太多了。开源社区的贡献者不仅提供软件的共享,而且将这种共享精神延续到指导书籍,必须赞。
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部分的每一个链接,各自都连接着一座宝库,如下图:
4.2.1 成熟平台常有在线文档
用微软平台开发程序时,最好的参考是MSDN(http://msdn.microsoft.com/library/),而用Java开发时,有Java SE 6 Documentation(http://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文件,双击打开,如下图所示,这就是将有大用的最佳参考。
建议用鼠标右击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();
- }
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 ->F(wxWidgets中类的命名均以wx开头,取wxFrame中的F),如下图:
接着,在“wxFrame Class Reference”页面,可以看到wxFrame类同其他类的继承关系以及其他信息,如下图:
我们关心wxFrame类的构造函数,继续往下看,可以在“Constructor & Destructor Documentation”部分看到构造函数的定义及说明:
wxFrame::wxFrame | ( | wxWindow * | parent, | ||
|
| 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 查看在线文档的设备支持
如果有条件,布置如下图所示的工作条件。用双屏,一个看文档,一个写程序。
当前的学习,有很多时候用电子版的参考资料。开发中查阅在线文档,是件相当频繁的事情,双屏幕的配置成为需要。
当然,作为在校学生,当场地受限时,也不必太纠结这样的条件了。毕竟,这不是必须。
4.3 在编程环境中找帮助
本文使用的编程环境是Code::Blocks。C++编码规范中,将类声明、常变量声明、宏定义等保存在头文件(.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();
- }
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”选项,如图:
在Code::Blocks中,将打开新的页签,显示wxMenu类的声明。但是wxMenu类并没有Append这样的成员函数,发现wxMenu类是wxMenuBase类的派生类,推断Append应该是继承自wxMenuBase类的成员函数。用相同的操作,在wxMenuBase类名上单击鼠标右键并选择对应的选项,在新出现的页签中,找到了Append成员函数的4种重载形式的的声明,如下图所示。
现在做一个练习。找出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 "menu.h"
之类的自定义头文件的包含命令,需要删除。因为合并到了同一个文件中,这些头文件根本不存在。
4.4.2 更多的案例
安装好的wxWidgets中还提供了很多演示和示例的项目。X:\wxWidgets-3.0.0\demos中是所有的演示案例,示例的项目在X:\wxWidgets-3.0.0\samples中,学习到一定时候,运行这些程序,读一读源码,是一种很好的学习方式。
例如,wxWidgets的Demo中的一个项目forty,是一个纸牌游戏,运行结果如下图:
这个项目中的源文件如下图所示:
在Code::Block中新建一个项目,将Demo\forty中所有.cpp和.h文件复制到项目所在文件夹中,并通过鼠标右击项目名,在弹出菜单上选Add file…的方式将文件加入项目,成为项目的源文件和头文件。Demo为适应多种平台,提供了很多的文件,一般只需要.cpp和.h文件即可,如上图中加了方框的部分。
如果项目中有.xpm文件(并不是每个项目都有),也请将这种文件复制过去,这是一种图形格式文件,程序中一般会用到。项目forty中就有3个这样的文件。
在更极少数情况下,还可能有其他文件需要复制过去。这可以通过读代码,看源程序中是否写了这个文件名。偷懒的办法,运行程序,若由于找不到文件出错了,会提示还需要哪个文件。比如项目forty中的about.htm文件。
后两类文件复制过去即可,是为支持程序运行的,不必通过Add file…将其加入项目。
运行其他项目,方法类似。
================= 迂者 贺利坚 CSDN博客专栏================= |== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==| |== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==| |== 我写的书——《逆袭大学——传给IT学子的正能量》 ==| ===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 ===== |