《VC++程序设计》第4讲 鼠标及键盘编程.ppt_第1页
《VC++程序设计》第4讲 鼠标及键盘编程.ppt_第2页
《VC++程序设计》第4讲 鼠标及键盘编程.ppt_第3页
《VC++程序设计》第4讲 鼠标及键盘编程.ppt_第4页
《VC++程序设计》第4讲 鼠标及键盘编程.ppt_第5页
已阅读5页,还剩53页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4讲鼠标 键盘编程 主讲教师 李璟e mail lijing 手机第4讲鼠标 键盘编程 基本要求 掌握鼠标消息及其处理方法掌握键盘消息及其处理方法重点和难点 鼠标消息 键盘消息 4鼠标 键盘编程 4 1鼠标消息及其处理4 2键盘消息及其处理 4 1鼠标消息及其处理 鼠标分为两类 客户区鼠标消息和非客户区鼠标消息 客户区是指窗口内的区域 一般应用程序在这个区域显示Windows操作结果 非客户区则为窗口的其它组成部分 如系统菜单 标题栏 滚动条 最大化最小化按钮等 4 1鼠标消息及其处理 4 1 1客户区鼠标消息4 1 2非客户区鼠标消息4 1 3鼠标捕捉4 1 4鼠标光标及其处理4 1 5鼠标处理编程实例 4 1 1客户区鼠标消息 在客户区操作鼠标将产生客户区鼠标消息 鼠标的操作主要有3种基本方式 即单击 双击和移动 单击动作分为键按下和键释放操作 操作的键包又可分为左键 右键和中键 另外 还包括鼠标滚轮的消息 常用的客户区鼠标消息及消息说明 MFC把客户区鼠标消息的处理函数封装在Cwnd类中 这些函数都是虚函数 客户区鼠标消息处理函数的一般形式为 voidOnXxxYyy UINTnFlag CPointpoint 如OnLButtonDown函数为消息WM LBUTTONDOWN的消息处理函数 其声明如下 voidOnLButtonDown UINTnFlag CPointpoint 函数的两个参数说明如下 nFlags 为鼠标动作的条件标志 point 为CPoint类对象 记录了当前光标的x y坐标 这个坐标是以相对于窗口客户区左上角的设备坐标而言的 鼠标可以和或键组合使用 nFlags的取值是以下各种取值的组合 各取值含义如下 MK LBUTTON 按下了鼠标的左键 MK MBUTTON 按下了鼠标的中键 MK RBUTTON 按下了鼠标的右键 MK CONTROL 按下了键盘上的Ctrl键 MK SHIFT 按下了键盘上的Shift键 以上这些取值均为某一位为1其余位全0的值 在实际编程中 常使用nFlags参数与以上可能取值进行位与运算 来判断消息生成时的鼠标键以及Shift以及Ctrl的状态 如检测Shift键和Ctrl键的状态 如下 voidOnButtonDown UINTnFlags CPointpoint 判断是否Ctrl键和Shift键同时按下if nFlags MK CONTROL nFlags MK SHIFT 4 1 2非客户区鼠标消息 当鼠标通过非客户区时 就会触发与客户区鼠标消息类似的非客户区鼠标消息 大部分应用程序不处理非客户区鼠标消息 它们可以被Windows本身妥善的处理 常见的非客户区鼠标消息及消息说明 4 1 3鼠标捕捉 如果你的鼠标移出了某个窗口的客户区范围 那么此窗口将不再继续收到客户区鼠标消息 会带来意想不到的后果 如果你用SetCapture进行了鼠标捕捉 那么 即使你的鼠标移出了窗口客户区 仍然可以收到客户区鼠标消息 直到调用ReleaseCapture释放鼠标捕捉或在某个窗口上进行点击为止 实现鼠标的捕捉的SetCapture函数的原型如下 HWNDSetCapture HWNDhWnd hWnd为要捕捉鼠标消息的窗口句柄 如果在程序中执行如下语句 SetCapture hWnd 这将导致Windows向窗口句柄为hWnd的窗口发送所有的鼠标消息 注意 一旦某个窗口捕获了鼠标 其他窗口将无法得到鼠标消息 因此 当窗口不再需要捕获鼠标消息时 应及时使用ReleaseCapture函数将鼠标释放 4 1 4鼠标光标及其处理 鼠标光标 Cursor 是鼠标与用户之间的接口 它实际上是一种特殊的位图 它浮于窗口内容之上 随鼠标移动而移动 是鼠标的屏幕映像 光标与位图的最大不同是光标有一个 热点 只有热点是鼠标位置的映像 4 1 4鼠标光标及其处理 1 创建光标2 载入光标 1 创建光标 Window系统提供了19种标准光标 用户也可以自己创建光标 方法为 执行菜单命令 Insert Resource 在弹出的 InsertResource 对话框中 选择 cursor 单击 New 按钮 即进入光标的编辑窗口 在绘制窗口中 可以向编辑图标一样 绘制自己光标图样 在绘制窗口中 有一个热点设置按钮 在它旁边显示热点设置的坐标 单击这个按钮 在光标编辑器出现一个十字光标 将十字中心放在需要设定的热点的位置 单击鼠标左键即可 编辑设计光标窗口 2 载入光标 MFC创建窗口时 就为窗口设置了默认的光标 如果用户在应用程序中要自己设置光标 可采用Win32API函数SetCursor 实现 SetCursor 函数的原型如下 HCURSORSetCursor HCURSORhCursor 因此 要使用该函数设置光标 必须要获取HCURSOR类型的光标资源 1 载入系统标准光标 如果要采用Windows系统提供的标准光标资源 必须首先通过函数LoadStandardCursor 载入系统标准光标资源 典型的应用代码如下 获取系统标准光标HCURSORmousecusor AfxGetApp LoadStandardCursor IDC SIZENS 载入光标SetCursor mousecusor 2 载入自定义光标 如果要载入用户自定义 绘制 的光标 则需要在PreCreateWindow 函数中 通过API函数LoadImage 函数将光标载入程序 而后在需要时通过函数SetCursor 设置光标 具体步骤如下 首先需要声明一个HCURSOR成员变量 如下 HCURSORm cursor 在PreCreateWindow 函数中 将自定义的光标赋于m cursor 代码如下 m cursor HCURSOR LoadImage cs hInstance MAKEINTRESOURCE IDC CURSOR1 IMAGE CURSOR 32 32 LR CREATEDIBSECTION 注 IDC CURSOR1为创建的光标资源的资源ID 在需要使用该光标时 就可以使用如下语句调用该光标 SetCursor m cursor 4 1 5鼠标处理编程实例 下面通过一个简单的实例说明鼠标消息的处理及鼠标相关的操作 实例说明 通过工程向导创建一个单文档工程 在其中响应鼠标的WM LBUTTONDOWN WM LBUTTONUP WM MOUSEMOVE消息 实现以下的功能 当按下鼠标左键并移动鼠标时 在客户区窗口内将绘制鼠标的移动轨迹 同时光标变为 十字 光标或自定义光标 当按下鼠标左键时 鼠标的移动范围被限制的整个客户区窗口范围时 即鼠标不能移到客户区外 当释放了鼠标左键后 鼠标恢复原来的活动区域 运行结果 锁定鼠标在一定范围 在本例中 为了限制用户的某些操作 需要将鼠标的活动限定在固定的范围内 这是通过调用API函数ClipCursor 实现 ClipCursor 函数的原型如下 BOOLClipCursor LPRECTlpRect 其中 参数lpRect为指向存储鼠标活动有效区域的矩形区域指针 函数的返回值为布尔型 表示函数执行成功与否 如 要将鼠标锁定在某一固定区域 可采用如下的实现代码 RECTrcClip 限制矩形区域RECTrcOldClip 原先的鼠标活动区域 获取原鼠标活动的有效区域到rcOldClip中 GetClipCursor 如果需要将鼠标锁定在某一个窗口 可采用下面的代码 RECTrcClip RECTrcOldClip 原先的鼠标活动区域 获取原鼠标活动的有效区域rcOldClip中 GetClipCursor 程序分析 1 在鼠标消息响应函数中 根据参数nFlags可以判断鼠标的左 右 中键以及键盘上的Shift键和Ctrl键的按下状态 在本例的OnMouseMove 函数中 就利用nFlags参数判断鼠标左键是否被按下来完成画线功能 2 当按下鼠标左键并移动鼠标时 在OnMouseMove 函数中通过调用API函数ClipCursor 将鼠标的活动区域限制在客户区窗口中 而当鼠标左键释放时 在函数OnLButtonUp 中 通过ClipCursor 将鼠标的活动区域恢复为原来状态 3 虽然限制鼠标的活动区域在客户窗口 但是鼠标仍然可以移动到客户窗口的边界处 是非客户区 此时如果释放鼠标左键 将无法响应鼠标消息WM LBUTTONUP 也就不能执行OnLButtonUp 函数恢复鼠标的活动区域 因而鼠标的活动区域就被限制在客户窗口 无法进行其他操作 要解决这个问题 可以在OnLButtonDown 函数中 调用API函数SetCapture 捕捉鼠标 这样 不论鼠标在何位置 该窗口程序都能捕获其消息WM LBUTTONUP 当鼠标的活动区域恢复后 调用API函数ReleaseCapture 释放鼠标消息的捕捉 实例开发过程 1 创建工程 启动VisualC 利用MFCAPPWizard EXE 建立一个新的MFC工程 工程名为 MouseDemo 在MFCAppWizardStep1的时候选择 Singledocuments 即基于单文档的MFC工程 之后的步骤使用默认值 2 利用 ClassWizard 添加鼠标消息及处理函数 在 ClassName 列表框中 选择鼠标消息的处理类 CMouseDemoView 在 Message 列表框中 列出了MFC预定义的消息 分别选择WM LBUTTONDOWN WM LBUTTONUP WM MOUSEMOVE消息 单击 AddFunction 按钮 MFC就会为其自动添加相应的消息映射宏和消息处理函数 3 添加实现代码 首先在头文件 MouseDemoView h 中声明变量startpoint rcOldClip 代码如下 public CPointstartpoint RECTrcOldClip 添加WM LBUTTONDOWN的消息处理代码如下 voidCMouseDemoView OnLButtonDown UINTnFlags CPointpoint 获取原鼠标活动的有效区域GetClipCursor 添加WM LBUTTONUP的消息处理代码如下 voidCMouseDemoView OnLButtonUp UINTnFlags CPointpoint 恢复原来的鼠标活动区域ClipCursor 添加WM MOUSEMOVE的消息处理代码如下 voidCMouseDemoView OnMouseMove UINTnFlags CPointpoint CDC pDC GetDC 获得DCHCURSORcursor 鼠标光标句柄RECTrcClip 限制矩形区域 移动鼠标时鼠标左键是按下的if nFlags 4 编译运行 4 2键盘消息处理 当用户敲击键盘时 Windows同样也会给应用程序发送消息 应用程序经常捕获和响应的键盘消息有多种 Windows为它们定义了专门的消息处理函数 4 2键盘消息及其处理 4 2 1键盘消息4 2 2按键消息及其处理4 2 3字符消息及其处理4 2 4键盘处理编程实例 键盘消息可以分为两类 按键消息和字符消息 当按下一个键或松开一个键时 将产生一个按键消息 而当按下键产生一个可显示的字符时 还将产生一个字符消息 在MFC中 封装的预定义键盘消息有以下3种 MFC中封装的键盘消息 4 2 2按键消息及其处理 为了全面了解键盘消息所包含的消息 下面剖析MFC中的键按下消息WM KEYDOWN WM KEYDOWN消息的wParam参数存储的是虚键码 虚键码是Windows内部建立的设备无关的键盘代码 在Windows中不论使用什么扫描代码的键盘 都将扫描代码翻译成同一的虚键码 这样应用程序就不用直接同硬盘硬件打交道 常见的虚键码 1 常见的虚键码 2 使用虚拟键码时 可以使用键码也可以直接使用其值 如判断按键是否为Ctrl键 可以采用 if wParam VK CONTROL 也可以采用 if wParam 17 WM KEYDOWN消息的lParam参数存储的信息比较多 这个32位字长的数据中 各位的含义如下表所示 WM KEYDOWN消息的lParam参数各位含义 WM KEYDOWN的消息处理函数为OnKeyDown 其函数声明如下 afx msgvoidOnKeyDown UNITnChar UINTnRepCht UINTnFlags 其中各参数的含义如下 nChar 为消息中的wParam参数 即虚键码 nRegCnt 为lParam参数的0 15位 即按键的重复次数 nFlags 为lParam参数的18 31位 包括键盘扫描码 扩展键盘标志 描述码 键的先前状态和转换状态标志 键盘抬起消息WM KEYUP与此相似 这里不再详述 4 2 3字符消息及其处理 当按下键是一个可显示的字符时 除了产生一个WM KEYDOWN消息之外 还产生一个字符消息WM CHAR WM CHAR消息的消息处理函数为OnChar函数 其函数声明如下 afx msgvoidOnChar UINTnChar UINTnRepCnt UINTnFlags 其中 参数的含义如下 nChar为根据虚键码翻译而来的字符的ASCII码 nRegCnt 为lParam参数的0 15位 即按键的重复次数 nFlags 为lParam参数的18 31位 包括键盘扫描码 扩展键盘标志 描述码 键的先前状态和转换状态标志 常见的字符及其ASCII码 如 在OnChar 函数中判断了是否按下了字符键 B 的代码如下 voidCKeyboardDemoView OnChar UINTnChar UINTnRepCnt UINTnFlags if nChar B if cChar 66 MessageBox 你敲击了字符键B CView OnChar nChar nRepCnt nFlags 4 2 4键盘处理编程实例 为了使用户熟练掌握键盘消息及其处理消息 下面介绍一个简单的键盘消息处理实例 1 实例说明2 开发过程 1 实例说明 本实例通过工程向导创建一个单文档工程 在其中响应键盘的WM KEYDOWN WM KEYUP WM CHAR消息 实现下面的功能 当用户按下了Shift键 在视图窗口中显示提示信息 用户按下了Shift键 当用户释放了Shift键时 在视图窗口中显示提示信息 用户释放了Shift键 当用户按下了Shift键后又按下了字符 B 键 在视图窗口中显示提示信息 用户同时按下了Shift键和B键 即输入B键或b键 运行界面 2 开发过程 1 创建工程 利用MFCAppWizard EXE 建立一个单文档的MFC工程 KeyboardDemo 2 在ClassView选项卡上用鼠标右键单击该类 并从弹出的快速菜单中选择 AddMemberVariable 菜单命令 为KeyboardDemoView类添加一个新的成员变量bShiftdown 将此成员变量的类型设置为BOOL 并将其访问权限设置为Private 单击 OK 按钮 完成成员变量的添加操作 按照同样的方法 再添加2个BOOL型private成员变量bShiftup和bShiftB 接下来在KeyboardDemoView构造函数中给三个指示变量赋初值 false 代码如下 CKeyboardDemoView CKeyboardDemoView TODO addconstructioncodeherebShiftdown bShiftup bShiftB false 赋初值 3 利用 建立类向导 添加键盘消息及处理函数 步骤如下 在 ClassName 列表框中 选择键盘消息的处理函数 CKeyboardDemoView 在 ObjectIDs 列表框中选择 CKeyboardDemoView 则在 Message 列表框中 列出了MFC为其预定义的消息 分别选择WM KEYDOWN WM KEYUP WM CHAR消息 单击 AddFunction 按钮 MFC就会为其自动添加相应的消息映射宏和消息处理函数 4 添加实现代码 在资源文件 KeyboardDemoView cpp 中添加各键盘消息函数的实现代码 OnKeyDown函数的代码如下 voidCKeyboardDemoView OnKeyDown UINTnChar UINTnRepCnt UINTnFlags TODO Addyourmessagehandlercodehereand orcalldefaultif nChar VK SHIFT 判断Shift键是否被按下 bShiftdown true bShiftup false Invalidate true 显示信息 CView OnKeyDown nChar nRepCnt nFlags 注 Invalidate TRUE 将整个窗口设置为需要重绘的无效区域 它会产生WM PAINT消息 这样OnDraw将被调用 OnKeyUp函数的代码如下 voidCKeyboardDemoView OnKeyUp UINTnChar UINTnRepCnt UINTnFlags TODO Addyourme

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论