加载中...
基于对话框的应用
第1节:在Windows桌面打个叉
第2节:在窗口上跟踪输出鼠标坐标—Win32版
第3节:你好!wxWidgets
第4节:深入分析基于框架窗口的应用
第5节:玩转主菜单
第6节:简简单单,状态栏
第7节:学工具栏,懂 MVC
第8节:基于对话框的应用
课文封面

使用 Code::Blocks 项目向导,创建基于 wxDialog 的 wxApp 实例,同时使用 Code::Blocks 自带的 wxSmith 作为程序窗体的设计器(GUI Builder),了解控件属性表与事件关联操作。

0. 楔子

学编程干什么?
唉!主要是给老板写软件,赚点活这个城市的生活费吧……

忘记了吗?在 《编程启蒙》的最后一节课《你是程序员》 我们提过一嘴:要勇于苦中作乐。

程序员:苦中作乐

这可不是阿Q精神,一身本事,没必要时时刻刻都用来当乙方,偶尔也可以给朋友写一些可以帮助到朋友的小系统,写一些可以拿来自己用的工具软件——没有KPI,所以写代码时腰可以挺得特别的直。

很多小工具应用,整个应用的主窗口就是一个对话框——这节课的意义,就这样,它来了。

1. 视频

还是先看视频。

2. 注意点

创建项目过程,及结束后,以下四点需注意——

  1. GUI Builder:选择使用 wxSmith 设计器;
  2. Application Type:选择 Dialog Based Application;
  3. 附加库,(借助按 Ctrl 键),选中 jpeg 和 tiff;
  4. 生成后,在修改控件的Label属性为汉字标题之前,记得修改源文件编码为 UTF8 (方法:主菜单 Edit / File encode)

其中的第2点并非必选项,因为当然可以不使用 GUI Builder 来创建对话框项目,只是本课堂教学需要,我们借机了解 wxSmith 的用法。

为什么叫wxSmith ? 答:Smith (史密斯)这个人名在英美,早先之前常用于修理工,匠人,园艺师……

3. 关键代码理解

在 wxSmith 选项加持下,XXXApp.cpp 中,App 的 OnInit() 方法现为:

//(*AppInitialize bool wxsOK = true; wxInitAllImageHandlers(); if ( wxsOK ) { HelloDlgDialog Dlg(0); SetTopWindow(&Dlg); Dlg.ShowModal(); wxsOK = false; } //*) return wxsOK;
  • 解读一:首先注意那些奇怪的注释符号,不能修改或删除,它们是 wxSmith 在代码中作的记号,方便它后面依据我们的设计,直接修改源代码;

  • 解读二:函数直接返回 false (变量 wxsOk 没啥用,它就是 flase),我们之前已经学习过,wxAPP 的 OnInit() 方法返回 false ,应用将直接退出(逻辑没错,因为此时应用程序的主窗口已经关闭了,参见下一点);

  • 解读三:创建的窗口对象 Dlg 是一个对话框,入参为 0 表示它没有父窗口,而后,来自 wxApp 的方法 SetTopWindow(&Dlg) 是在告诉当前应用,这个窗口(对话框,Dlg)就是当前应用的最顶层的窗口(主窗口的另一说法);

  • 解读四:创建项目时,之所要以选 wxTiff 和 wxJPEG 库,是因为此处的 wxInitAllImageHandlers() ,它用来初始化 wxWidgets 所支持的全部图形类型,如果前面不选附加库,并且又希望代码能通过编译,只需注释或直接删除本行。

4. 思考

课后思考:请打开项目中的主窗口的源文件(XXXMain.cpp),你将看到一个空的事件表:

BEGIN_EVENT_TABLE(HelloDlgDialog,wxDialog) //(*EventTable(HelloDlgDialog) //*) END_EVENT_TABLE()

奇怪,事件表空无一物,可是,正如视频演示,我们点击对话框上的 “About” 或 “Quit”,都有事件发生呢?

这是下一节课我们要学习的内容:事件,然后再下一节课,我们将综合使用对话框和事件的知识,动手写一个可以安装在 Windows 里的屏幕保护程序