在窗口中添加控件
一个成功的应用程序离不开漂亮的界面。本章主要谈谈Windows内置的控件在应用程序中的应用,包括如何声明变量并把它们和控件相关联;如何在控件和变量的值之间保持同步;如何使用控件对象ID来检索控件对象,从而操纵控件,以及如何把控件作为窗口来处理;还有如何指定应用程序窗口中控件选项卡的顺序,从而控制用户在窗口中切换应用程序的顺序。小生以前从来没有写过什么文章,在此借此机会希望和各位交流、交流,其中难免有错误,敬请各位来信(netvc@21cn.com)指教!谢谢!
Windows操作系统内置有多种标准控件,包括滑块、目录树和列表控件、进度栏等等,本讲暂时讨论几个常用的控件,如:Static Text(静态文本)、Edit Box(编辑框)、Command Button(命令按钮)、Check Box(复选框)、Radio Button(单选按扭)、Drop-Down List Box(下拉列表框)。这些控件和其他的控件都可用于Visual C++应用程序中,可以在VC开发环境内Dialog Painter编辑器中的控件面板中找到。
在向应用程序增加控件时,应按照要求庙宇其相应的属性,如ID及其它可见属性、摆放位置等等。当所有控件的位置及属性设置完毕后,应根据需要设置各控件的选项卡顺序。可先选择一个控件,从菜单中选择Layout | Tab Order命令。打开Tab Order后,可看到每个控件的旁边有一个数字。这些数字代表在对话框中切换的顺序,您可以按照希望的切换顺序用鼠标单击各数字框,控件将按指定的顺序重新编号,指定标签顺序后,再次选中Layout | Tab Order,返回布局编辑器。
助记符:助记符是按钮、复选框、菜单等的标题或其他控件标签中带下划线的字符。用户可以同时按下该字符和Alt键,直接切换到相应的控件或触发控件中被单击的事件。要设定助记符,可以在设置标题的值时在用作助记符的字符前加上符号&。在同一个窗口或菜单组中助记符只能使用一次,因此在接触应用程序代码细节问题之前,应检查助记符是否有冲突。可在布局编辑器中选反对话框窗口或一个控件,单击鼠标右键,选中Check Mnemonics(检查助记符),如果助记符没有冲突,Visual C++会返回一个消息对话框,显示不存在冲突,如果存在冲突,则对话框会指出冲突的字母,并显示自动挑选出包含冲突助记符的控件的选项。
把控件与变量关联
在开始编码之前,除了静态文本和命令按之外,必须给每个控件指定变量,并附加一个值。在为应用程序编写代码时您将和这些变量进行交互。用户输入屏幕控件中的值将赋予这些变量,这些变量将用于应用程序代码中。同时地,应用程序赋予这些变量的任何值都将在用户看到的窗口控件在得到更新。如何声明这些变量并把它们和放入窗口中的控件相关连呢?我们可以用VC提供Class Wizard工具,在Class Wizard中选反Member Variables(成员变量)选项卡,如下图所示:
选择一个需要与变量相关连的控件的ID,单击Add Variable(添加变量)按钮,在Add Variable对话框中输入变量名,指定Category(类别)和Variable type(变量类型),单击OK按钮。在输入变量名时,应遵从MFC命名约定,遵从该命名约定可使其他程序员读懂您的程序代码;了解该命名约定也使您阅读其他编程人员编制的代码时更容易一些。
把功能与控件相关联
设置完所有控件的位置、属性、选项顺序、变量后,接下来应该怎样把功能与控件相关联呢?如:怎样检索要操作的控件对象,从而操纵控件,怎样在控件和变量的值之间保持同步,以及如何把控件作为窗口来处理等。当要操纵某些控件时,应该先检索该控件对象,在VC中我可以用GetDlgItem()函数来检索控件对象,如GetDlgItem(IDC_MSG) -> EnableWindow(TRUE);,其参数IDC_MSG是控件的ID值,指要操作的控件的ID,控件的操作事件是调用EnableEindow(),使其可用。第二个调用的函数EnableWindow似乎应该用于窗口中,而不是控件中。确实如此;不过它们恰好是CWnd类的成员,而CWnd类是CDialog类的祖先类,CDay2Dlg类(示例程序的对话框类)就是由CDialog类继承而来。而在Windows中,所有控年本身就是窗口,且完全独立于它们所在的窗口。这样,可以像处理窗口一样处理控件,并在其中调用窗口函数。实际上,所有的控件类都是继承自CWnd类,这说明控件类的本质就是窗口。在应用程序中最关键是控件和变量的值保持同步,我们可以用UpdateData函数来完成。UpdateData函数是Visual C++中处理控年变量的关键函数。由这个函数获得变量值并用这些变量值更新屏幕上的控件。它还从控件那里获得数据,并把用户更改后值赋予变量。这个过程由传递给UpdateData函数的参数来控制。如果参数值是FALSE,变量值将被传递给窗口控件。如果参数值是TRUE,将用窗口内控件中出现的值更新变量。这样传给该函数的值依赖于需要更新的方向。当代码中一个以上的变量被更新之后,必须调用函UpdateData,把值为FALSE的参数传给它。如果需要查看变量以获取其当前值,由必须在查看变量之前用值TRUE调用UpdateData函数。当需要向应用程序添加更多的代码时,应把此函数挂起。
总结(个人观点):
任何应用程序都是通过控件和用户输入、输出的交换操作,熟悉控件的各方面编程,是进行复杂编程的基础,除以上介绍控件之外,VC还提供很多控件供用户使用,在此不能一一详解。本章附带的一示例程序,对本章所讲的内容进行应用,具体函数详解见附带的说明。