




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息学院信息技术教研室面向对象程序设计面向对象程序设计面向对象程序设计课程设计面向对象程序设计课程设计第6章 Windows应用程序对键盘与鼠标的响应21 Windows应用程序对键盘的响应本节实现在应用程序中响应键盘操作。3俄罗斯方块游戏对键盘的响应:方向键、:向左、右、下移动当前方块;方向键:旋转当前方块;空格键:当前方块一步到位;回车键:暂停/启动游戏。4键盘上的键键盘上的键一个唯一的标识值扫描码)一个唯一的标识值扫描码)按下或释放某键时按下或释放某键时产产生生6.1 键盘在应用程序中的应用5由于键盘的输入由于键盘的输入产生一条产生一条消息消息扫描码、虚拟码以及其他与击键有关的信息扫描码
2、、虚拟码以及其他与击键有关的信息设备驱动程序设备驱动程序截取键的扫描码截取键的扫描码翻译翻译虚拟码虚拟码它含它含取出键盘消息进行处理取出键盘消息进行处理消息消息设备驱动程序设备驱动程序把消息放到系统的把消息放到系统的消息队列中消息队列中Windows从系统消息队从系统消息队列中取出消息列中取出消息发送到相应的线程消息队列中发送到相应的线程消息队列中窗口过程窗口过程6 虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的的wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟参数中,用以标识哪一个键被按下或释放,最常用的虚拟码已经
3、在码已经在Windows.h中定义,中定义,常用的虚拟码符符号号常常量量名名称称等等价价的的键键盘盘键键或或鼠鼠标标按按钮钮符符号号常常量量名名称称等等价价的的键键盘盘键键或或鼠鼠标标按按钮钮VK_LBUTTON鼠鼠标标左左按按钮钮VK_BACK退退格格键键VK_RBUTTON鼠鼠标标右右按按钮钮VK_TAB制制表表键键VK_MBUTTON鼠鼠标标中中按按钮钮VK_RETURN回回车车键键VK_SHIFTShift 键键VK_CONTROLCtrl 键键VK_MENUAlt 键键VK_PAUSEPause 键键VK_CAPITALCaps Lock 键键VK_ESCAPEEsc 键键VK_PR
4、IORPage Up 键键VK_NEXTPage Down 键键VK_ENDEnd 键键VK_HOMEHome 键键VK_LEFT左左键键头头键键VK_RIGHT右右箭箭头头键键VK_UP上上箭箭头头键键VK_DOWN下下箭箭头头键键VK_0VK_909 键键VK_AVK_ZAZ 键键7操作系统在接收到键盘输入后,还要决定哪一个应用程序将响应输入操作系统在接收到键盘输入后,还要决定哪一个应用程序将响应输入Windows系统把消息发送给具有系统把消息发送给具有“输入焦点输入焦点(input focus)的窗口的窗口应用程序一般有几个窗应用程序一般有几个窗口,但当按下某一个键口,但当按下某一个键时
5、,只有一个窗口能接时,只有一个窗口能接收到该键盘消息,接收收到该键盘消息,接收这个键盘消息的窗口称这个键盘消息的窗口称为有为有“输入焦点的窗口输入焦点的窗口有有“输入焦点输入焦点”的窗口应是活的窗口应是活动窗口或者活动窗口或者活动窗口的子窗口动窗口的子窗口窗口具有窗口具有输入焦点输入焦点 窗口函数通过捕获窗口函数通过捕获WM_SETFOCUS和和WM_KILLFOCUS消息确消息确定当前窗口是否具有输入焦点。定当前窗口是否具有输入焦点。窗口失去窗口失去输入焦点输入焦点8输入焦点在画图应用程序中,当打开“编辑颜色对话框时,该窗口具有输入焦点。9键盘消息键盘消息分为两类分为两类按下或松开一个键时按
6、下或松开一个键时就产生了一按键消息就产生了一按键消息一个按键的组合产生了一个按键的组合产生了一个可以显示的字符时,一个可以显示的字符时,就产生了一个字符消息就产生了一个字符消息系统按键消息系统按键消息非系统按键消息非系统按键消息Alt键与相关输入键的组合键与相关输入键的组合产生的消息,这些键一般产生的消息,这些键一般由由Windows系统内部直接系统内部直接处置,应用程序不处理处置,应用程序不处理若应用程序处理了这若应用程序处理了这些系统键消息,还要调些系统键消息,还要调用用DefWindowsProc()函函数,以便不影响系统对数,以便不影响系统对它们的处理它们的处理不使用不使用Alt键组合
7、键组合的按键消息的按键消息10消消 息息类类 型型含含 义义W M _K E Y D O W N非非 系系 统统按按 下下 了了 非非 系系 统统 键键 消消 息息W M _K E Y U P非非 系系 统统松松 开开 了了 非非 系系 统统 键键 消消 息息W M _SY SK E Y D O W N系系 统统按按 下下 了了 系系 统统 键键 消消 息息W M _SY SK E Y U P系系 统统松松 开开 了了 系系 统统 键键 消消 息息按键消息的按键消息的两个变量两个变量wParamlParam32位的变量位的变量重复计数位重复计数位015位)位)OEM扫描码扫描码1623位)位)
8、扩展键标志扩展键标志24位)位)保留位保留位2528位)位)关联码关联码29位)位)键的先前状态位键的先前状态位30)转换状态转换状态31位)位)包含了识别按下的键的虚拟码包含了识别按下的键的虚拟码11 在在WinMain函数的消息循环中包含了函数的消息循环中包含了TranslateMessage函数,函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘字符映射成盘字符映射成ASCII码后才能产生码后才能产生WM_CHAR消息消息消消 息息 类类 型型 含含 义义 W WM M_ _C CH HA AR R 非非 系系 统
9、统 非非 系系 统统 字字 符符 W WM M_ _D DE EA AD DC CH HA AR R 非非 系系 统统 非非 系系 统统 死死 字字 符符 W WM M_ _S SY YS SC CH HA AR R 系系 统统 系系 统统 字字 符符 W WM M_ _S SY YS SD DE EA AD DC CH HA AR R 系系 统统 系系 统统 死死 字字 符符 字符消息字符消息系统系统非系统非系统WM_KEYDOWN和和WM_KEYUP的按键消息只能产生非系统字符消息的按键消息只能产生非系统字符消息WM_SYSKEYDOWN和和WM_SYSKEYUP按键消息只能产生系统字符消
10、息按键消息只能产生系统字符消息126.2 键盘操作应用举例13用户窗口区输入用户窗口区输入“这是一这是一个有关键盘操作的示例程个有关键盘操作的示例程序的字符串序的字符串程序中缓冲区大小只设程序中缓冲区大小只设30个字符,当缓冲区满时若个字符,当缓冲区满时若再输入任何字符,就出现再输入任何字符,就出现(1)号错误提示号错误提示用户按下左箭头键直至光用户按下左箭头键直至光标到达本行起始位置时,标到达本行起始位置时,就无法再往左移动,则出就无法再往左移动,则出现现(2)号错误信息号错误信息若此时您按下若此时您按下Esc键,就出现键,就出现(3)号错号错误提示信息误提示信息若当前光标位置处于本行的起若
11、当前光标位置处于本行的起始位置,此时按下回退键始位置,此时按下回退键(BackSpace),则出现编号为,则出现编号为(4)的错误提示信息的错误提示信息若字符缓冲区中已没有任若字符缓冲区中已没有任何字符,此时按下了何字符,此时按下了Delete键,则出现键,则出现(5)号错号错误提示信息误提示信息当按下当按下Home键或键或End键时,当前键时,当前输入位置为本行起始位置或末尾输入位置为本行起始位置或末尾14long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) #define BufSize 30/设置存放字符
12、的缓冲区大小设置存放字符的缓冲区大小 /设置静态字符数组,存放输入的字符,字符个数不能超出缓冲区大小设置静态字符数组,存放输入的字符,字符个数不能超出缓冲区大小static char cCharBufBufSize;static int nNumChar=0;/现有字符个数现有字符个数static int nArrayPos=0;/字符的位置字符的位置static int nLnHeight;static int nCharWidth;int x; /循环变量循环变量HDC hDC;TEXTMETRIC tm;PAINTSTRUCT PtStr; /定义指向包含绘图信息的结构体变量定义指向包含
13、绘图信息的结构体变量 15switch(iMessage) /处理消息处理消息case WM_CHAR: /遇到非系统字符所作的处理遇到非系统字符所作的处理if(wParam=VK_BACK) /处置处置“遇到回退键的消息遇到回退键的消息” /若已在一行文字的开始处,则提示用户若已在一行文字的开始处,则提示用户不能回退不能回退if(nArrayPos=0)MessageBox(hWnd,当前位置是文本的起始位置,不能回退当前位置是文本的起始位置,不能回退,NULL,MB_OK);else /每按一次回退键就回退一个字符的位置每按一次回退键就回退一个字符的位置nArrayPos=nArrayPo
14、s-1; nNumChar=nNumChar-1;/对现有字符总数进行计数对现有字符总数进行计数 /刷新用户区,并序发送刷新用户区,并序发送WM_PAINT消息消息InvalidateRect(hWnd,NULL,TRUE);break;if(wParam=VK_ESCAPE) /处理按下处理按下Escape键消息键消息MessageBox(hWnd,您现在不能按您现在不能按ESC键,请继续其它操作键,请继续其它操作,NULL,MB_OK);break;16if(nNumChar=BufSize) /如果写入的字符数超过缓冲区大小,则报警如果写入的字符数超过缓冲区大小,则报警MessageBo
15、x(hWnd,缓冲区已满,不能再输入字符了缓冲区已满,不能再输入字符了n若需要删除字符,请用若需要删除字符,请用BackSpace键键,NULL,MB_OK);break;for(x=nNumChar;xnArrayPos;x=x-1)cCharBufx=cCharBufx-1;cCharBufnArrayPos=(unsigned char)wParam;nArrayPos=nArrayPos+1;nNumChar=nNumChar+1;InvalidateRect(hWnd,NULL,TRUE);break; 17case WM_CREATE: /处理窗口创建消息处理窗口创建消息hDC=G
16、etDC(hWnd);GetTextMetrics(hDC,&tm); /获取字体信息获取字体信息nLnHeight=tm.tmHeight+tm.tmExternalLeading;nCharWidth=tm.tmAveCharWidth;ReleaseDC(hWnd,hDC);break;case WM_KEYDOWN: /处理按下键消息处理按下键消息switch(wParam)case VK_END: /处理按下键为处理按下键为End时的消息时的消息nArrayPos=nNumChar;/输入位置从本行的末尾开始输入位置从本行的末尾开始break;case VK_HOME:/处理
17、按下键为处理按下键为Home时的消息时的消息nArrayPos=0;/输入位置为本行的起始位置输入位置为本行的起始位置break;case VK_DELETE:/处理按下键为处理按下键为Delete时的消息时的消息if(nArrayPos=nNumChar) /输入位置处于本行的末尾输入位置处于本行的末尾MessageBox(hWnd,缓冲区已空,没有字符可供删除缓冲区已空,没有字符可供删除,NULL,MB_OK);else for(x=nArrayPos;x0)nArrayPos=nArrayPos-1; /当前输入位置往前移一个位置当前输入位置往前移一个位置elseMessageBox(h
18、Wnd,您已经移动到起始位置,不能再往左移动了您已经移动到起始位置,不能再往左移动了,NULL,MB_OK);break;case VK_RIGHT处理按下右方向键时的消息处理按下右方向键时的消息if(nArrayPos=50&x=50&y=50&x=50&y=150&x=50&y=250&x=50&y=50&x=150&y=150&x=150&y=250&x=150&y=50&x=250&y=150&x=250&y=250&x=250&
19、;y=350)/加载一个用于表示系统忙的光标加载一个用于表示系统忙的光标hCursor=LoadCursor(NULL,IDC_WAIT);SetCursor(hCursor);37elsehCursor=LoadCursor(NULL,IDC_ARROW);/其他区域设置成普通的箭头型光标其他区域设置成普通的箭头型光标SetCursor(hCursor);hdc=GetDC(hWnd);GetTextMetrics(hdc,&tm);hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);SelectObject(hdc,hbrush);hpen=(HP
20、EN)GetStockObject(WHITE_PEN);SelectObject(hdc,hpen); /用白色画刷画一个矩形,实际上是擦除上一次输出的坐标位置用白色画刷画一个矩形,实际上是擦除上一次输出的坐标位置Rectangle(hdc,5,5,tm.tmAveCharWidth*8,tm.tmHeight+3);sprintf(str,%d,%d0,x,y); /把整数打印到字符串中把整数打印到字符串中TextOut(hdc,5,5,str,lstrlen(str);EndPaint(hWnd,&ps);break;38case WM_PAINT:hdc=BeginPaint(
21、hWnd,&ps);hpen=(HPEN)GetStockObject(BLACK_PEN);SelectObject(hdc,hpen);Rectangle(hdc,50,50,350,350);MoveToEx(hdc,50,150,NULL);LineTo(hdc,350,150);MoveToEx(hdc,50,250,NULL);LineTo(hdc,350,250);MoveToEx(hdc,150,50,NULL);LineTo(hdc,150,350);MoveToEx(hdc,250,50,NULL);LineTo(hdc,250,350);TextOut(hdc,6
22、0,90,IDC_CROSS,strlen(IDC_CROSS);TextOut(hdc,155,90,IDC_SIZEALL,strlen(IDC_SIZEALL);TextOut(hdc,275,90,IDC_NO,strlen(IDC_NO);TextOut(hdc,50,190,IDC_SIZENESW,strlen(IDC_SIZENESW);TextOut(hdc,160,190,IDC_SIZENS,strlen(IDC_SIZENS);TextOut(hdc,250,190,IDC_SIZENWSE,strlen(IDC_SIZENWSE);TextOut(hdc,60,290
23、,IDC_SIZEWE,strlen(IDC_SIZEWE);TextOut(hdc,150,290,IDC_UPARROW,strlen(IDC_UPARROW);TextOut(hdc,270,290,IDC_WAIT,strlen(IDC_WAIT);EndPaint(hWnd,&ps);break;39case WM_DESTROY:/处理结束应用程序消息处理结束应用程序消息PostQuitMessage(0); /结束应用程序结束应用程序return 0;default: /其他消息处理程序其他消息处理程序return(DefWindowProc(hWnd,iMessage,
24、wParam,lParam) ;4041switch (message) case WM_LBUTTONDOWN: if (!operate)&ready) operate=TRUE ;/左键击活捕获左键击活捕获 ready=FALSE; SetCapture (hwnd) ;/把所有的鼠标信息输入到被左键击活的窗口把所有的鼠标信息输入到被左键击活的窗口. SetCursor (LoadCursor (NULL, IDC_CROSS) ; /载入光标载入光标 BeginP.x=LOWORD(lParam); BeginP.y=HIWORD(lParam); return 0 ;LRES
25、ULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) static BOOL operate=FALSE,ready=TRUE; static POINT BeginP,EndP; static RECT rect=0,0,0,0 ; HDC hdc ; PAINTSTRUCT PtStr; HBRUSH hBrush;42 case WM_LBUTTONUP: if (operate) operate=FALSE; SetCursor (LoadCursor (NULL, IDC_WAIT); GetClientRect (hwnd, &rect) ; InvalidateRect(hwnd,NULL,TRUE); SetCursor(LoadCursor(NULL,IDC_ARROW); ReleaseCapture () ;/把鼠标从当前窗口中释放出来把鼠标从当前窗口中释放出来 return 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卖场承包经营合同
- 企业公司房屋租赁合同
- 公厕给排水施工方案
- bef增光膜施工方案
- 实验室咨询服务合同
- TACCEM 135-2024 双组份聚氨酯导热结构胶
- 与石油管道交叉施工方案
- 建筑工程机械租赁合同范文
- 昌河中学高一数学试卷
- 水泥楼梯改造施工方案
- 医科大学2024年12月五官科护理学作业考核试题答卷
- GB/T 44569.1-2024土工合成材料内部节点强度的测定第1部分:土工格室
- 《智能网联汽车智能传感器测试与装调》电子教案
- 机动车维修经营备案表
- 《公务员录用体检操作手册(试行)》
- 膝关节穿刺术课件
- 海信入职在线测评真题
- 设计(技术)变更申报审批单
- 大象版(2017秋)六年级下册 科学 2.4可再生与不可再生资源(教学设计)
- 《珍爱生命拒绝毒品》主题班会课件
- 萤石市场洞察报告
评论
0/150
提交评论