第6章 Windows应用程序对键盘与鼠标的响应资料教程

上传人:yuzo****123 文档编号:141249390 上传时间:2020-08-05 格式:PPT 页数:44 大小:751KB
返回 下载 相关 举报
第6章 Windows应用程序对键盘与鼠标的响应资料教程_第1页
第1页 / 共44页
第6章 Windows应用程序对键盘与鼠标的响应资料教程_第2页
第2页 / 共44页
第6章 Windows应用程序对键盘与鼠标的响应资料教程_第3页
第3页 / 共44页
第6章 Windows应用程序对键盘与鼠标的响应资料教程_第4页
第4页 / 共44页
第6章 Windows应用程序对键盘与鼠标的响应资料教程_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《第6章 Windows应用程序对键盘与鼠标的响应资料教程》由会员分享,可在线阅读,更多相关《第6章 Windows应用程序对键盘与鼠标的响应资料教程(44页珍藏版)》请在金锄头文库上搜索。

1、第6章 Windows应用程序对键盘与鼠标的响应,1 Windows应用程序对键盘的响应,本节实现在应用程序中响应键盘操作。,俄罗斯方块游戏对键盘的响应: 方向键、:向左、右、下移动当前方块; 方向键:旋转当前方块; 空格键:当前方块一步到位; 回车键:暂停/启动游戏。,键盘消息处理过程,虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟码已经在Windows.h中定义,,应用程序一般有几个窗 口,但当按下某一个键 时,只有一个窗口能接 收到该键盘消息,接收 这个键盘消息的窗口称 为有“输入焦点”的窗口,有“输入焦点” 的窗口

2、应是活 动窗口或者活 动窗口的子窗口,输入焦点,在画图应用程序中,当打开“编辑颜色”对话框时,该窗口具有输入焦点。,键盘消息 分为两类,按键消息,字符消息,按下或松开一个键时 就产生了一按键消息,一个按键的组合产生了 一个可以显示的字符时, 就产生了一个字符消息,系统按键消息,非系统按键消息,Alt键与相关输入键的组合 产生的消息,这些键一般 由Windows系统内部直接 处理,应用程序不处理,若应用程序处理了这 些系统键消息,还要调 用DefWindowsProc()函 数,以便不影响系统对 它们的处理,不使用Alt键组合 的按键消息,键盘消息,32位的变量,包含了识别按下的键的虚拟码,在W

3、inMain函数的消息循环中包含了TranslateMessage函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘字符映射成ASCII码后才能产生WM_CHAR消息,【例6-1】本例演示键盘输入时所产生的消息序列并在窗口的客户区显示对应的字符。,6.2 键盘操作应用举例,程序中缓冲区大小只设30个字符,当缓冲区满时若再输入任何字符,就出现(1)号错误提示,用户按下左箭头键直至光标到达本行起始位置时,就无法再往左移动,则出现(2)号错误信息,若此时您按下Esc键,就出现(3)号错误提示信息,若当前光标位置处于本行的起始位置,此时按下回退键(BackSpace),则出现编号为(4

4、)的错误提示信息,若字符缓冲区中已没有任何字符,此时按下了Delete键,则出现(5)号错误提示信息,当按下Home键或End键时,当前输入位置为本行起始位置或末尾,long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) #define BufSize 30/设置存放字符的缓冲区大小 /设置静态字符数组,存放输入的字符,字符个数不能超出缓冲区大小 static char cCharBufBufSize; static int nNumChar=0;/现有字符个数 static int nArrayPos=0;/字

5、符的位置 static int nLnHeight; static int nCharWidth; int x; /循环变量 HDC hDC; TEXTMETRIC tm; PAINTSTRUCT PtStr; /定义指向包含绘图信息的结构体变量,switch(iMessage) /处理消息 case WM_CHAR: /遇到非系统字符所作的处理 if(wParam=VK_BACK) /处理“遇到回退键的消息” /若已在一行文字的开始处,则提示用户不能回退 if(nArrayPos=0) MessageBox(hWnd, 当前位置是文本的起始位置,不能回退,NULL,MB_OK); else

6、/每按一次回退键就回退一个字符的位置 nArrayPos=nArrayPos-1; nNumChar=nNumChar-1;/对现有字符总数进行计数 /刷新用户区,并序发送WM_PAINT消息 InvalidateRect(hWnd,NULL,TRUE); break; if(wParam=VK_ESCAPE) /处理按下Escape键消息 MessageBox(hWnd, 您现在不能按ESC键,请继续其它操作,NULL,MB_OK); break; ,if(nNumChar=BufSize) /如果写入的字符数超过缓冲区大小,则报警 MessageBox(hWnd, 缓冲区已满,不能再输入字

7、符了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;,case WM_CREATE: /处理窗口创建消息 hDC=GetDC(hWnd); GetTextMetrics(hDC,case VK_LEFT:

8、/处理按下左方向键时的消息 if(nArrayPos0) nArrayPos=nArrayPos-1; /当前输入位置往前移一个位置 else MessageBox(hWnd, 您已经移动到起始位置,不能再往左移动了,NULL,MB_OK); break; case VK_RIGHT:/处理按下右方向键时的消息 if(nArrayPosnNumChar)/若当前位置未到缓冲区的末尾,可向右移动 nArrayPos=nArrayPos+1; else MessageBox(hWnd, 已经到缓冲区的末尾,不能再向右移动了,NULL,MB_OK); break; /end of switch(wP

9、aram) break;,case WM_PAINT: /处理重画消息 hDC=BeginPaint(hWnd, ,【练习1(习题6-6)】设计一个键盘程序,当按Ctrl键时,表明要画椭圆;当按Shift键时,表明要画矩形。单击向右箭头键时,椭圆或矩形的长度加10;单击向下箭头键时,椭圆或矩形的高度加10;单击Home键时,整个椭圆或矩形向左移动;单击End键时,整个椭圆或矩形向右移动;单击PageUp键时,整个椭圆或矩形向上移动;单击PageDown键时,整个椭圆或矩形向下移动;,RECT rect1; / /消息处理函数 long WINAPI WndProc(HWND hWnd,UINT

10、 iMessage,UINT wParam,LONG lParam) HDC hDC;/定义设备环境句柄. PAINTSTRUCT ps;/定义包含绘图信息的结构体变量 static BOOL bCircle=FALSE, bRect=FALSE;,switch(iMessage) case WM_KEYDOWN: switch(wParam) case VK_CONTROL:/当按control键时 bCircle = TRUE; bRect = FALSE; /画圆 rect1.left=0; rect1.right=0; /初始化矩形结构体 rect1.top=0; rect1.bott

11、om=0; break; case VK_SHIFT: /当按shift键时 bRect = TRUE;bCircle = FALSE; /画矩形 rect1.left=0;rect1.right=0;/初始化矩形结构体 rect1.top=0;rect1.bottom=0; break; case VK_RIGHT:/按右箭头键时矩形框长度加10 rect1.right+=10; if(bRect=TRUE|bCircle=TRUE) InvalidateRect(hWnd,NULL,1); break; case VK_PRIOR: /按PageUp键时矩形或椭圆向上移动 rect1.to

12、p-=10;rect1.bottom-=10; if(bRect=TRUE|bCircle=TRUE) InvalidateRect(hWnd,NULL,1); break; default: break; break;,case WM_PAINT:/处理绘图消息. hDC=BeginPaint(hWnd,case WM_DESTROY: PostQuitMessage(0); break; default:return(DefWindowProc(hWnd,iMessage,wParam,lParam); return 0; ,2 Windows应用程序对鼠标的响应,本节实现在应用程序中响应

13、鼠标操作。,鼠标作为定位输入设备,通过鼠标单击、双击和拖动功能,用户可以很容易地操作基于Windows图形界面的应用程序。,Windows中通过光标来指示当前鼠标的位置,在Windows操作系统中预定义了几种光标,并在Windows.h头文件中加以定义,,6.3 鼠标在应用程序中的应用,例如,下面的语句为窗口类wndclass WNDCLASS wndclass; wndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT); 此外,还可在应用程序中调用LoadCursor函数改变光标形式,常用的鼠标消息有哪些?,WM_LBUTTONDBLCLK:鼠标左键

14、双击。 WM_LBUTTONDOWN:鼠标左键按下。 WM_LBUTTONUP:鼠标左键松开。 WM_MBUTTONDBLCLK:鼠标中键双击。 WM_MBUTTONDOWN:鼠标中键按下。 WM_MBUTTONUP:鼠标中键松开。 WM_MOUSEMOVE:鼠标移动。 WM_RBUTTONDBLCLK:鼠标右键双击。 WM_RBUTTONDOWN:鼠标右键按下。 WM_RBUTTONUP:鼠标右键松开。,相当于窗口的左上 角为原点的坐标值,盘,对于鼠标消息的处理(是否监测Shift和Ctrl键),Windows系统默认的时间间隔为0.5秒,也可以调用SetDoubleClickTime()重

15、新设定间隔值,若窗口不包含上述属性的定义,即使进行了双击操作,该窗口也只能接收到两条WM_BUTTONDOWN消息或两条WN_BUTTONUP消息。,鼠标双击,wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;,要使窗口函数能接收鼠标双击产生的消息在注册窗口类时必须具有CS_DBLCLKS属性。,菜单、滚动条 工具条和标题条等处,非用户区的鼠标消息,由于鼠标移动的随机性,如果要使某一个窗口能不间断地捕获鼠标消息,就必须对鼠标加以捕获。,SetCapture(hWnd):可以向句柄为hWnd的窗口发送所有的鼠标消息,调用SetCapture()函数,

16、一旦从窗口捕获了鼠标, 系统的键盘功能就暂时失 效,其它窗口也无法得到 鼠标消息,当该窗口不再需要捕获鼠标消息时,应及时调用ReleaseCapture()以释放鼠标,否则,其他窗口无法接收鼠标信息。,鼠标消息的捕获,【练习2】鼠标输入示范程序,本例介绍如何响应鼠标信息、并改变光标形状等用法,用户在窗口的不同区域移动鼠标时,光标将显示如下图所标识的不同箭头的形状,6.4 鼠标应用程序实例,(50,50),(350,50),(150,50),(50,150),(350,350),(50,350),/消息处理函数 long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) PAINTSTRUCT ps; HDC hdc; TEXTMETRIC tm; HBRUSH hbrush; HPEN hpen; HCURSOR hCursor

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号