当TAB键移动焦点到某按钮上时按下回车键,会产生和鼠标点击按钮同样的效果,这不是鼠标事件,而是按钮控件本身的标准行为。在编辑框中输入字符也一样,系统会发出“编辑框已被改变”这样的消息,这是编辑框控件本身的标准行为。本章要介绍的键盘事件是指:在任何状况下,用户按了一下键盘,系统捕捉到到这一事件,向主窗口发出“键盘被按下了”的消息,即发出WM_KEYDOWN这一消息映射。如果用户需要对“按了某键”有所动作,就可以在相应的响应函数中处理。
本章要点
1 如何添加键盘事件的消息映射
2 获取某键的键值信息
6.1 MyKey.exe程序的界面和功能
本程序的界面很简单,只有一个静态文本提示程序的用法。当用户按下某键后弹出一个消息框,显示所按键的键值(ASCII码),重复次数和一个标志值(长整数)。图chap06-01是按了小写的a后的消息框。
静态文本的文字是暗灰色,因为没有被“激活”,即不选中Disabled属性。这一点很重要,因为如果它是激活状态的话,键盘消息就不是发送给对话框,而是被发送到它——被聚焦的控件上,它是唯一的控件,就是唯一的消息受体了。
创建工程和程序界面的设计就无须赘言了,设计好后就可以编写代码了。
6.2 添加消息映射和响应函数
在类向导窗口的Message Map页中选定该对话框的类CMyKeyDlg;在Message列表框中查到消息映射WM_KEYDOWN;按“添加函数”按钮,弹出系统推荐的函数名OnKeyDown(),就用此默认的;点[确定]后生成了该函数框架。立即点[加入代码]按钮开始写代码。
OnKeyDown()函数的声明如下:
void CMyKeyDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
它传过来三个无符号整数类型的参数。其中nChar是该键的键值。nRepCnt是按键的重复次数,一般都是1,因为在按第一次时就被捕捉到并发出了消息。nFlags是一个标志,它用来表示某些特殊键的状态。我们的目标是显示这些信息,所以用三个字符型变量来储存这三条信息,组织好后用消息框把信息显示出来。具体代码如下:
void CMyKeyDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
}
字符串对象strKeyPressed是要在消息框中显示的信息。参数是数值型的,为了显示先要把它们转化为字符型的,函数itoa(nChar, strnChar,10)就是把十进制整数nChar转换为字符串strnChar。strKeyPressed的赋值语句把三条信息组织在一起,其中两个"\n"一是为了换行,二是为了显示一个空行。
现在就可以编译和运行一下了。因为不能安装[退出]按钮,我们来增加一个用鼠标双击可退出的方法。在类向导窗口中选定该对话框类CMyKeyDlg,找到消息映射WM_LBUTTONDCLICK;添加函数OnLButtonDblClk();在其中加入代码OnOK()就行了。
思考研究题
键盘事件的另一个消息映射是WM_KEYUP,在松开按键时发生。试编写一程序,在松开按键时弹出显示键值的相关信息。
—END—