对话框程序的键盘介面

来源:互联网 发布:中文编程语言 编辑:程序博客网 时间:2024/06/05 16:38

在对话框程序设计中,Windows内置的对话框管理器为我们提供了常用的键盘操作支持,它包括子窗口控件的Tab停留和分组, 子窗口控件的快捷键定义,这些键盘介面用于在不同的子窗口控件之间快速切换输入焦点;对Enter,Esc和Ctrl+Break的处理支持,用于使用键盘快速关闭对话框


1.Tab停留


在对话框中,我们可以使用Tab键方便的把输入焦点从一个子窗口控件移动到另一个子窗口控件,这是因为Windows完成了将输入焦点从一个控制项移动到另一个控制项的所有工作。对于所有想要使用Tab键切换的子窗口控件,都要在其窗口样式中指定WS_TABSTOP。对话框建立后,会把输入焦点设为对话框资源模板中第一个具有WS_TABSTOP样式的子窗口控件。我们可以改变对话框中的子窗口控件的Tab键顺序,打开对话框后,在Visual studio 菜单中选择 格式--->Tab键顺序,将显示目前子控件的Tab键顺序,如果要改变子控件Tab键顺序,请按照你想要的顺序依次单击子控件即可。改变子控件的Tab键顺序,其实是改变对话框资源模板文件中子控件定义的先后顺序,所以你也可以手工改变。


2.子窗口控件分组


Windows给对话框增加的第二个键盘介面包括光标移动键,这种介面对单选按钮有特殊的重要性。如果您使用Tab键移动到某一组内目前选中的单选按钮,那么,就需要使用光标移动键,将输入焦点从该单选按钮移动到组内其他单选按钮上。使用WS_GROUP窗口样式即可获得这个功能。对于对话框模板中的特定一组子控件序列,Windows将使用光标移动键把输入焦点从组内第一项切换到组内下一项中,Windows还会从组内最后一个子窗口控件回转到第一个子窗口控件。掌握分组的难点在于理解分组的定义,一个分组如何开始如何结束。


在下面对话框资源模板的子窗口控件序列中,第一个具有WS_GROUP样式的子控件(RADIOBUTTON "&Black",IDC_BLACK,16,76,64,8,WS_GROUP | WS_TABSTOP ),表示了一个分组的开始,往下再一个具有WS_GROUP样式的子控件(GROUPBOX "&Figure",IDC_STATIC,109,156,84,46,WS_GROUP  )表示了分组的结束,同时也是第二分组的开始,到末尾,没有找到分组结束,Windows将会回转到子窗口控件序列中第一项继续查找分组的结束。

///////////////////////////////////////////////////////////////////////////////


DialogABOUTBOX DIALOG DISCARDABLE 32, 32, 200, 234

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION

FONT 8, "MS Sans Serif"

BEGIN

RADIOBUTTON "&White",IDC_WHITE,16,188,64,8

RADIOBUTTON "&Black",IDC_BLACK,16,76,64,8,WS_GROUP | WS_TABSTOP      // 第一组的开始,(第二组的结束)

RADIOBUTTON "B&lue",IDC_BLUE,16,92,64,8

RADIOBUTTON "&Green",IDC_GREEN,16,108,64,8

GROUPBOX "&Figure",IDC_STATIC,109,156,84,46,WS_GROUP                         //第二组的开始,同时也说明了第一组的结束

RADIOBUTTON "Rec&tangle",IDC_RECT,116,172,65,8,  WS_TABSTOP

RADIOBUTTON "&Ellipse",IDC_ELLIPSE,116,188,64,8

                                                                                                                        //因为没有结束,将向前回转到第一个子窗口控件

END


3. 子窗口控件的快捷键


子窗口控件Caption栏位中的「&」将导致紧跟其后的字母以底线显示,这就增加了另一种键盘介面,您按下底线字母和使用鼠标单击该子窗口控件是一样的。当控件拥有输入焦点时,按下Spacebar键和使用鼠标单击该子窗口控件是一样的



4. 对Enter,Esc和Ctrl+Break的处理支持


在对话框中,一般都有分别标记为「OK」(确定)和「Cancel」(取消)的按钮,「OK」按钮的ID值为IDOK(在WINUSER.H中被定义为1),「Cancel」按钮的ID值为IDCANCEL(在WINUSER.H中被定义为2),「OK」按钮是默认的,这样安排有利于使用键盘Enter,Esc和Ctrl+Break键快速关闭对话框当在对话框中按下Esc或者Ctrl+Break键时,Windows向对话框程序发送一个WM_COMMAND讯息,令wParam等于2(IDCANCEL),相当于按下「Cancel」(取消)按钮;当在对话框中按下Enter按键时,分两种情况:如果有默认命令按钮,Windows向对话框程序发送一个WM_COMMAND讯息,令wParam等于默认命令按钮的ID,等同于按下默认命令按钮;如果没有默认命令按钮,Windows向对话框程序发送一个WM_COMMAND讯息,令wParam等于1(IDOK)。明白了这个理,你就不难拦截Enter,Esc和Ctrl+Break键了,使它们不能关闭对话框。 



参考: Charles Petzold <Programming Windows程式开发设计指南>  译者:余孟学












原创粉丝点击