VC++键盘与鼠标的消息处理(2).doc_第1页
VC++键盘与鼠标的消息处理(2).doc_第2页
VC++键盘与鼠标的消息处理(2).doc_第3页
VC++键盘与鼠标的消息处理(2).doc_第4页
VC++键盘与鼠标的消息处理(2).doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

教 案2007 2008 学年第一学期主 讲 教 师课 程 名 称面向对象程序设计(VC+)课程类别专业基础课学时及学分80、4授 课 班 级使 用 教 材 VC+的使用及面向对象软件工程实例分析系(院、部)教研室(实验室) 计算机应用教研室课时授课计划课次序号: 一、课题: ch7 键盘与鼠标的消息处理(2)二、课型:讲授三、目的要求:1、 熟悉键盘消息及常见的虚拟键码。2、 掌握键盘消息的处理方法。四、重点、难点:重点:键盘消息处理技术。 。难点:按键消息(WM_KEYDOWN)的处理技巧。 五、教学方法及手段: 案例式教学:设计目标、关键技术、结合实例讲解语法、总结。 按照提出问题、解决问题的思路开展教学。六、参考资料:VC+的使用及面向对象软件工程实例分析贺怀清编,电子工业出版社C+面向对象程序设计李涛编,高等教育出版社,第8章七、作业: 实验题1,3八、授课记录:授课日期班次九、授课效果分析:十、教学进程(教学内容、教学环节及时间分配等)1、 复习 鼠标的消息处理:关键是确定使用哪个消息、如何编写消息处理函数。2、 导入课题 利用键盘消息获取用户的输入信息,在消息处理函数中完成用户的功能需求。3、 教学内容一、键盘消息键盘消息分类:系统键消息和非系统键消息系统键:输入键与Alt键组合,一般有Windows内部处理。非系统键:不与Alt键组合的输入键。键盘消息:系统键消息:WM_SYSKEYDOWN WM_SYSKEYUP非系统键消息:WM_KEYDOWN WM_KEYUP WM_CHAR(可见字符的按键消息)说明:Windows总是把键盘消息发送给拥有输入焦点的窗口。可以使用CWnd:SetFocus()函数设置某个窗口拥有输入焦点,用GetFocus()获取拥有输入焦点的窗口。二、键盘消息的处理 即键盘消息处理函数,所有键盘消息处理函数的参数相同,比如: void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) nChar表示被击键的字符,nRepCnt表示该键被击的重复次数,nFlags中包含键的扫描码和标志位。 常见的键值如下表:键盘按键名称或鼠标键键值符号常量名键盘按键名称或鼠标键键值符号常量名鼠标左键钮1VK_LBUTTONLeft Arrow键37VK_LEFT鼠标右键钮1VK_RBUTTONUp Arrow键38VK_UPControl-break执行3VK_CANCELRight Arrow键39VK_RIGHT Backspace键8VK_BACKDown Arrow键40VK_DOWN Tab键9VK_TABPrint Screen键44VK_SNAPSHOTClear键12VK_CLEARIns键45VK_INSERTEnter键13VK_RETURNDel键46VK_DELETEShift键16VK_SHIFTHelp键47VK_HELPCtrl键17VK_CONTROL数字键094857VK0 VK9Alt键18VK_MENU字母键AZ6590VK_A VK_ZPause键19VK_PAUSE小键盘数字键96105VK_NUMPAD0VK_NUMPAD9Caps Lock键20VK_CAPITAL乘号键106VK_MULTIPLYEsc键27VK_ESCAPE加号键107VK_ADD SpaceBar键32VK_SPACE减号键109VK_SUBTRACTPage Up键33VK_PRIOR小数点键110VK_DECIMALPage Down键34VK_NEXT除号键111VK_DIVIDEEnd键35VK_END F1键 F12键112123VK_F1VK_F12Home键36VK_HOMENum Lock键144VK_NUMLOCKScroll Lock键145VK_SCROLL键盘消息包括按键消息和字符消息,当某键被按下又释放时,不论该键是否会产生可见字符,都会产生WM_KEYDOWN和WM_KEYUP消息。因此,键盘消息处理也分为按键消息处理和字符消息处理。三、键盘消息处理应用举例:案例1:利用上下左右箭头键在一个对话框中移动字符“A”。实现过程:第一步,创建对话框应用程序ex_key_move第二步,在对话框类中添加数据成员m_xPos和m_yPos,表示字符的位置。int m_xPos,m_yPos;第三步,在对话框类的构造函数中对数据成员初始化为0。 M_xPos=m_yPos=0;第四步,修改OnPaint()函数,在当前位置显示字符。在else中添加代码如下: CPaintDC dc2(this);dc2.TextOut(m_xPos,m_yPos,A); /显示字符运行,结果在对话框的左上角显示字符A第五步,添加对话框类的键盘消息WM_KEYUP的响应函数,根据按键修改坐标变量m_xPos和m_yPos。 void CEx_keyDlg:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultif(nChar=VK_RIGHT) m_xPos+=10;else if(nChar=VK_LEFT) m_xPos-=10;else if(nChar=VK_UP) m_yPos-=10;else if(nChar=VK_DOWN) m_yPos+=10;Invalidate(); CDialog:OnKeyUp(nChar, nRepCnt, nFlags);*/运行:每当按下并释放箭头键时,字符移动。单独按下箭头键时,字符不动问题:为什么直接添加对话框类的WM_KEYDOWN消息的映射函数没有反应?应该如何处理按键消息?原因:按键消息发给了对话框类的父窗口。解决办法:添加对话框类的PreTranslateMessage消息处理函数,代码如下:BOOL CEx_keyDlg:PreTranslateMessage(MSG* pMsg) / TODO: Add your specialized code here and/or call the base classif(pMsg-message=WM_KEYDOWN)if(pMsg-wParam=VK_RIGHT)m_xPos+=10;else if(pMsg-wParam=VK_LEFT)m_xPos-=10;else if(pMsg-wParam=VK_UP)m_yPos-=10;else if(pMsg-wParam=VK_DOWN)m_yPos+=10;Invalidate();return CDialog:PreTranslateMessage(pMsg);运行:当箭头键按下时,字符随按键移动。问题:当字符移到窗口右边缘或窗口下边缘时,继续移动则移出了对话框窗口。解决办法:每当坐标改变时,根据当前窗口的大小进行判断,若超出了窗口,则将其限定在窗口内。/限制字符坐标在窗口内if(m_xPos0)m_xPos=0;if(m_yPosheight) m_yPos=height-20;if(m_xPoswidth) m_xPos=width-20; 总结:键盘消息的响应在响应的消息映射函数中实现,其中按键消息WM_KEYDOWN的处理比较特殊,需要在消息映射函数PreTranslateMessage()中实现。案例2:在单文档界面中显示插入符,并且插入符随输入信息而移动。知识点1:光标插入符的一般使用步骤如下:创建插入符光标、在指定位置输出内容、隐藏光标、计算输入内容的长度(即计算新的光标位置)、设置新的光标位置、显示光标。相关函数如下:CreateSolidCaret(int nWidth, int nHeight):创建矩形插入符CreateSolidCaret(int nWidth, int nHeight):创建灰色矩形插入符CreateCaret(HBITMAP pBitmap):创建一个新图片插入符HideCaret() :隐藏插入符SetCaretPos(CPoint m_pos ):设置插入符的位置ShowCaret():在当前位置显示插入符 知识点2:插入符随输入内容移动的实现: 计算输入内容的长度,设置插入符的新位置 相关函数如下: GetTextMetrics()获得当前文本的字符属性(大小等),保存在参数变量中。GetTextExtent()获得参数文本字符串的高度和宽度,返回CSize 类的值。CSize 类表示尺寸,它的成员变量cx表示宽度、cy表示高度。实现过程:第一步,创建单文档程序ex_Insert_第二步,文档设计:首先在文档类中添加成员变量m_strText保存输入的字符:CString m_strText;然后在构造函数中初始化为空: m_strText.Empty(); 第三步,视图设计: *添加视图类的WM_CHAR消息映射函数,接收输入的字符。 void CEx_Insert_CursorView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultCEx_Insert_CursorDoc *pDoc=GetDocument();ASSERT_VALID(pDoc);pDoc-m_strText+=nChar;Invalidate();CView:OnChar(nChar, nRepCnt, nFlags); *添加视图类的数据成员m_CaretPos,表示光标插入符的位置: private: CPoint m_CaretPos;*在视图类的构造函数中初始化m_CaretPos: m_CaretPos.x=m_CaretPos.y=0; /插入符的初始位置0*编辑视图类的视图更新函数OnDraw(),根据输入的字符长度移动插入符: void CEx_Insert_CursorView:OnDraw(CDC* pDC)CEx_Insert_CursorDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereTEXTMETRIC sTextMetric;pDC-GetTextMetrics(&sTextMetric); /获得当前文本的文字属性CreateSolidCaret(sTextMetric.tmAveCharWidth/8,sTextMetric.tmHeight); /创建插入符pDC-TextOut(0,0,pDoc-m_strText);CSize oSize=pDC-GetTextExtent(pDoc-m_strText); /获得文字的宽、高HideCaret(); /隐藏插入符m_CaretPos.x= oSize.cx;/m_CaretPos.y= oSize.cy;SetCar

温馨提示

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

评论

0/150

提交评论