
3.4 在对话框上使用按钮控件
对话框是控件的载体,相当于一艘航空母舰,控件就像甲板上的飞机。用户真正操作软件途径的其实是一个一个控件,比如按钮、编辑框、下拉列表框,图像控件等。本节将介绍如何在对话框上使用按钮这个控件。
3.4.1 显示工具箱
在Visual C++ 2013的集成开发环境中,有一个视图叫“工具箱”,在“工具箱”视图里,提供了各种各样的控件,如图3-16所示。
控件工具箱通常要在对话框资源打开的时候才会显示。
【例3.3】 在对话框上使用按钮控件
新建一个对话框工程,工程名是Test。然后切换到资源视图,在资源视图下双击对话框资源的ID来打开对话框的编辑界面,如图3-17所示。

图3-16

图3-17
双击对话框资源ID后,会出现对话框编辑界面,“工具箱”也会自动出现。
3.4.2 一次在对话框上放置一个按钮
把鼠标移到“工具箱”里的“Button”上,然后按下鼠标左键,如图3-18所示。
然后按住左键不要放开,移动鼠标到对话框上,然后再释放鼠标左键,此时会发现按钮已经在对话框上了,如图3-19所示。

图3-18

图3-19
这个过程就是控件的拖动过程,用这个方法,可以把工具箱里的其他控件也拖动到对话框上。
3.4.3 一次在对话框上放置多个按钮
一次在对话框上放置多个按钮有两种方法:
(1)先按住Ctrl键,然后把鼠标移动到工具箱的Button上,按下鼠标左键,移动鼠标到对话框上,放开Ctrl键,并释放鼠标左键,此时可以看到对话框上新增一个按钮了,而鼠标的形状是一个十字,这个时候在对话框的其他空白处单击左键,可以看到每次单击后,就有一个按钮新添到对话框上。如果要结束放置按钮,可以把鼠标再移动到工具箱的指针上,此时鼠标又会恢复正常状态了,如图3-20和图3-21所示。

图3-20

图3-21
(2)复制法,先选中已经在对话框上的按钮控件(就是对按钮进行单击一下),然后按下Ctrl+C键,再按Ctrl+V键,此时在新的地方可以看到有一个按钮了。
这两种方法各有千秋,第一种方法速度较快,但新增控件的样式都是默认的;第二种方法可以在第一个按钮大小、风格都设置好后,再对它进行复制,此时复制出来的按钮的大小风格都是和第一个是一样的。
3.4.4 选中按钮控件
用鼠标对对话框上的按钮控件进行单击,按钮控件周围会被黑点框包围,此时这个按钮控件就算选中状态了。如果要同时选中多个按钮,则可以先按住键盘上的Ctrl键,然后再同时用鼠标单击多个按钮,这样单击过的按钮都会被选中。如果要全选所有控件,可以直接按Ctrl+A。
如果要撤销选中,则对已经选中的按钮再次单击,按钮周围的黑点框就会消失了。
3.4.5 移动对话框上的按钮控件
在对话框上单击要移动位置的按钮,并且不要释放鼠标左键,此时鼠标的形状会变成一个十字架。然后移动鼠标到新的位置再释放鼠标左键,这个过程就是移动控件位置。
3.4.6 对齐对话框上的按钮控件
要对齐多个按钮控件,如果用一个个移动的办法进行对齐不仅对齐的精度不准,而且还烦琐。高效的方法是先选中几个要对齐的按钮控件,然后选择菜单“格式”|“对齐”下面的各个对齐菜单项。比如我们要以Button2为标准,把Button1和Button3的右边都向Button2对齐,可以这样操作,先按下键盘Ctrl键,然后对Button1单击一下,再对Button3单击一下,最后对Button2单击一下,再选择菜单“格式”|“对齐”|“右对齐”,此时会发现三个按钮都在同一列,如图3-22所示。

图3-22
上对齐、左对齐也类似,大家可以自己试试。值得注意的是,对齐肯定是按照其中某个按钮为参照物进行对齐,比如上面的Button2,在逐个选中控件的时候,那个参照物控件应该在最后一个被选中,这样其他控件才会按照它来对齐。
3.4.7 调整按钮控件的大小
单击对话框上按钮控件,此时会看到该按钮四周被一个黑点框包围,然后把鼠标放到某个黑点,按下鼠标左键进行拖拉,会发现按钮的大小跟随着鼠标移动而变化,最后释放鼠标左键,会发现按钮大小发生了改变并且固定不变了。
3.4.8 删除对话框上的按钮控件
单击对话框上的按钮控件,比如“确定”和“删除”按钮,然后按键盘Delete键,或者鼠标右击,在右击菜单中选择“删除”。
3.4.9 为按钮添加变量
按钮除了拥有ID外,还能拥有变量,前者是它的资源标记,后者是为了在程序中引用它,相当于这个按钮控件在程序代码中的名称,有了这个名称方能在程序中进行引用。为按钮添加变量的方法是首先在对话框上对按钮右击,然后在右击菜单里选择“添加变量”菜单项。此时会出现“添加成员变量向导”对话框,在这个对话框上输入变量名,然后单击“完成”按钮,如图323所示。

图3-23
m_btn就是一个变量名,并且它是一个控件变量名,图中“控件变量”复选框上有个勾,就表示添加的变量是控件变量,如果不打勾,就是一个C++数据变量。控件变量的类型是CButton,可以调用CButton的成员函数,而C++变量可以用来进行直接赋值,它的类型就是bool、int等普通的C++数据类型。
关于变量名的写法也有一定的讲究,虽然不是硬性规定,但也算一个事实上的约定,即变量名的起名最好遵守匈牙利命名法。匈牙利命名法,就是一种编程时的命名规范,它要求变量名的基本形式是:变量名=属性+类型+对象描述,其中对象描述要求变量含义最好做到一目了然。
其中,属性部分为:
● g_ 表示全局变量
● c_ 表示常量
● m_ 表示C++类成员变量
● s_ 表示静态变量
类型部分为:
● 数组a
● 指针p
● 函数fn
● 无效v
● 句柄h
● 长整型l
● 布尔b
● 浮点型(有时也指文件)f
● 双字dw
● 字符串sz
● 短整型n
● 双精度浮点d
● 计数c(通常用cnt)
● 字符ch(通常用c)
● 整型i(通常用n)
● 字节by
● 字w
● 实型r
● 无符号u
● 句柄h
● 按钮控件btn
● 编辑框控件edt
常见的描述部分有:
● 最大Max
● 最小Min
● 初始化Init
● 临时变量T(或Temp)
● 源对象Src
● 目的对象Des
● 窗口Wnd
比如,一个变量m_hWnd,其中,m_表示该变量是某个类的成员;h是类型描述,表示该变量是个句柄,Wnd是变量对象描述,表示窗口,因此m_hWnd表示窗口句柄,且是个类成员变量。
至此,我们上面定义的变量m_btn表示该变量是类CTestDlg的成员变量,并且是个控件类型的变量。当然,m_btn中没有对象(按钮)的描述,就是没说明这个变量是干什么的,因为这里没有说对应的按钮是干什么的,如果这个按钮是专门用来干某事的,比如用来退出程序的,那么就应该命名为m_btnQuit,这样做到一目了然。这里只是示例,具体开发中,最好要在btn后面加个描述。
按钮的变量添加完成后,我们可以切换到“解决方案管理器”视图,顾名思义,解决方案管理器就是用来管理整个解决方案的项目文件的,在里面我们可以找到某个源码文件,并能双击打开它,然后查看和编辑它的代码,如图3-24所示。
然后在“解决方案管理器”视图里双击TestDlg.h,此时在左边会出现一个文本编辑器,里面正是TestDlg.h的源代码,我们可以在末尾看到我们刚才添加的变量m_btn了,如图3-25所示。

图3-24

图3-25
现在我们知道,原来刚才可视化方式添加的变量,系统自动放到CTestDlg的类里面了。有人说,那我们能否不通过可视化方式,直接打开CTestDlg.h,然后在类CTestDlg里添加变量。这个问题要一分为二看,如果添加的是数据变量,这样是可以的;但如果是控件变量则不推荐这样做,因为控件变量向头文件添加的同时,还要向源文件(cpp文件)里添加内容。打开CTestDlg.cpp,定位到函数DoDataExchange那里,可以看到该函数里有这么一行代码DDX_Control(pDX, IDC_BUTTON2, m_btn);,如图3-26所示。

图3-26
这行代码是系统自动添加的,表示变量m_btnID关联到ID为IDC_BUTTON2这个按钮,DDX_Control是系统API函数,对于控件变量,这个调用是必不可少的。
因此,如果我们硬是要手动添加控件变量,这一行代码也要自己写上,否则结果是灾难性的。但既然Visual C++ 2013为我们提供了向导方式,何乐而不用呢。
3.4.10 为按钮控件添加事件处理程序
事件处理程序,就是某个事件发生后,控件要执行的程序。比如单击按钮控件是个事件,后面发生的反应,就是执行了按钮的事件处理程序。为按钮控件添加事件处理程序的方法是首先切换到资源视图,打开对话框,在对话框上对要添加事件处理程序的按钮右击,然后在右击菜单里选择“添加事件处理程序”菜单项,此时会出现“事件处理程序向导”对话框,如图3-27所示。

图3-27
事件处理程序就是一个类成员函数,在图3-27中,我们看到要添加的事件处理程序的函数名是OnBnClickedButton1,它是类CTestDlg的成员函数,它对应的消息类型是BN_CLICKED, BN_CLICKED表示是由于鼠标单击了按钮这个事件发生的消息。
最后单击“添加编辑”按钮,此时会出现代码编辑窗口,并自动定位到OnBnClickedButton1函数处,在这个函数里,我们添加一行代码,功能是退出程序,代码如下:
void CTestDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 PostQuitMessage(0); //退出程序 }
其中,PostQuitMessage是系统API,表示退出当前程序。
运行下程序,然后单击Button1按钮,是不是发现程序退出了。
小技巧:直接对对话框上的按钮控件进行双击也可以添加事件处理程序。