基本输入——键盘和鼠标消息
第二篇
VC常用类、控件、资源篇第4章基本输入—键盘和鼠标消息
Windows采用的是事件驱动机制,因此要让程序完成一定功能,很多情况下用户必须进行干预,
告诉程序要干什么,这就要求用户通过某种手段与计算机进行交互。鼠标和键盘是用户与Windows应用程序交换的最主要的交换设备。Windows预先定义了大量的鼠标消息和键盘消息,而MFC也对其中的常用消息进行了封装。本章主要介绍在MFC应用程序中,键盘和鼠标消息的响应与处理。
4.1 键盘消息及其处理在Windows中,键盘输入以消息的形式传递给程序的视窗消息处理程序。按下或释放一个键均会产生一条消息,系统将其放到与键盘输入窗口相对应的线程消息队列中。
4.1.1 键盘消息键盘消息有三种:键盘被按下、键盘被松开(弹起)、输入字符。其中,输入字符相当于直接得到用户输入的字符,这在不需要处理按键细节时使用;而键盘被按下、松开在按键状态改变时发送。
MFC对键盘的这三种键盘消息进行了封装,如表4.1所示。
按键和释放键消息通常是成对出现的,但如果用户按住键到一定的时间就启动了键盘的自动重复特性,系统就会产生一系列的WM_KEYDOWN消息,
在用户释放一个键时,才产生一条WM_KEYUP消息。
4.1.2 键盘消息的处理一般来讲,用户输入消息,如菜单选择、鼠标、键盘等,多在文档/视图结构的应用程序中使用。
在MFC应用程序开发中,可以使用ClassWizard为键盘消息和鼠标消息添加消息映射和消息处理函数。
在MFC文档/视图结构的应用程序中,视图窗口和框架窗口均能处理键盘和鼠标消息。当有
键盘或鼠标消息产生时,系统会先将消息发往视图窗口,如果视图类中没有发现相应的消息映射和处理函数,就将该消息再发往框架窗口。所以在使用ClassWizard为键盘消息定义消息映射时,定义在视图
71
励志照亮人生 编程改变命运第5 章基本输入—键盘和鼠标消息表4.1 MFC中封装的键盘消息键盘消息描述
WM_KEYDOWN键盘按下输入一个长度介于0到5之间的字符串是什么
WM_KEYUP键盘抬起
WM_CHAR可打印字符键按下并抬起,输入了一个字符类中就可以了。如果一个应用同时拥有多个视图,而当前活动没有对消息进行处理,则消息会发往框架窗口。
下面通过具体的实例讲解键盘消息的映射及处理。
4.1.3 按键消息的处理当按下一个键或松开一个键时,将产生一个按键消息。在MFC中,W
M_KEYDOWN和
WM_KEYUP消息分别在按下一个键和松开一个键时被激发。
本节将创建一个单文档应用程序,当用户按下任意一个键时,弹出对话框显示相应的提示信息。
具体实现过程如下。
1,使用MFC AppWizard创建SDI工程启动Visual C++6.0,执行“File”→“New”菜单命令,在“Projects”选项卡中,创建一个MFC
AppWizard[exe]工程,工程名为“Ch5Demo1”,如图4.1所示。
单击“OK”按钮,在“MFC AppWizard Step 1”对话框中,选中“Single document”,即基于单文档的MFC工程,其余的几步向导对话框均采用默认设置。
2,添加WM_KEYDOWN消息映射和响应函数执行“View”→“ClassWizard”菜单命令,或者使用【Ctrl+W】快捷键,打开“MFC
ClassWizard”对话框。在“Message Maps”选项卡的“Class name”列表框中选择要响应键盘消息的类“CCh5Demo1View”,在“Object IDs”列表框中选择“CCh5Demo1View”,在“Messages”列表框中选择“WM_KEYDOWN”按键消息。
单击“Add Function”按钮,ClassWizard自动为WM_KEYDOWN添加了ON_ WM_KEYDOWN
消息映射宏和OnKeyDown()消息处理函数,如图4.2所示。
此时,在“Ch5Demo1View.cpp”资源文件的开始部分会发现自动添加的消息映射代码:
BEGIN_MESSAGE_MAP(CCh5Demo1View,CView)
//{{AFX_MSG_MAP(CCh5Demo1View)
ON_WM_KEYDOWN() //消息映射代码
//}}AFX_MSG_MAP
72
励志照亮人生 编程改变命运零基础学 Visual C++
图4.1,New”对话框图4.2,MFC ClassWizard”对话框
// Standard printing commands
END_MESSAGE_MAP()
在“Ch5Demo1View.h”头文件,自动添加了消息处理函数OnKeyDown()的声明代码如下:
protected:
//{{AFX_MSG(CCh5Demo1View)
afx_msg void OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags);
//}}AFX_MSG
3,手工添加函数的实现代码在ClassWizard对话框(图4.2)中,单击“Edit Code”按钮,在工作区中,即跳转至新增函数代码的定义处。这时,需要手工添加OnDrawcircle()函数的实现
代码,如下:
void CCh5Demo1View::OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)
{
// TODO,Add your message handler code here and/or call default
AfxMessageBox("用户按下了键!"); //弹出提示对话框
CView::OnKeyDown(nChar,nRepCnt,nFlags);
}
这里只添加了一行代码,实现弹出提示对话框。
编译运行程序后,若用户按下键盘的任意键,就会弹出提示对话框,如图4.3所示。
WM_KEYUP消息的消息映射和处理过程与
WM_KEYDOWN的完全相同。
4.1.4 按键消息处理函数从上一节实例可见,MFC会将WM_KEYDOWN消息映射为ON_WM_KEYDOWN,而对应的处理函数为
OnKeyDown()。同样,WM_KEYUP消息对应的处理函数为OnKeyUp()。它们具有完全相同的参数,声明如下:
void OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags);
void OnKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags);
参数nChar表示按键的虚拟键码。如“VK_ALT”,表示按下的键为【Alt】键,
“VK_CONTROL”表示按下的键为【Ctrl】键。Windows中常用的虚拟键码及其对应的按键如表4.2所示。
表4.2 Windows常用的虚拟键码及其对应的按键虚拟键码数值对应的键虚拟键码数值对应的键
VK_LBUTTON 1鼠标左键VK_BACK 8退格键
VK_RBUTTON 2鼠标右键VK_TAB 9制表键
VK_MBUTTON 4鼠标中键VK_RETURN 13回车键
VK_SHIFT 16 Shift键VK_CONTROL 17 Ctrl键
73
励志照亮人生 编程改变命运第5 章基本输入—键盘和鼠标消息图4.3 程序运行结果
(续)
虚拟键码数值对应的键虚拟键码数值对应的键
VK_MENU 18 Alt键VK_PAUSE 19 Pause键
VK_CAPTIAL 20 Caplock键VK_ESCAPE 27 Esc键
VK_PRIOR 33 Page Up键VK_NEXT 34 Page Down键
VK_END 35 End键VK_HOME 36 Home键
VK_LEFT 37左箭头键VK_RIGHT 39右箭头键
VK_UP 38上箭头键VK_DOWN 40下箭头键
48?57 0?9键65?90 A?Z键
VK_SPACE 32空格键VK_SNAPSHOT 44 Print Screen键
VK_INSERT 45 Insert键VK_DELETE 46 Delete键
112?135功能键F1?F24 VK_NUMLOCK 144 NumLock键使用虚拟键码时,可以使用键码也可以直接使用其数值。如判断按键是否为回车键时,可以采用

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。