第6讲Windows应用程序中的键盘与鼠标幻灯片课件

上传人:yuzo****123 文档编号:137404318 上传时间:2020-07-08 格式:PPT 页数:36 大小:438KB
返回 下载 相关 举报
第6讲Windows应用程序中的键盘与鼠标幻灯片课件_第1页
第1页 / 共36页
第6讲Windows应用程序中的键盘与鼠标幻灯片课件_第2页
第2页 / 共36页
第6讲Windows应用程序中的键盘与鼠标幻灯片课件_第3页
第3页 / 共36页
第6讲Windows应用程序中的键盘与鼠标幻灯片课件_第4页
第4页 / 共36页
第6讲Windows应用程序中的键盘与鼠标幻灯片课件_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《第6讲Windows应用程序中的键盘与鼠标幻灯片课件》由会员分享,可在线阅读,更多相关《第6讲Windows应用程序中的键盘与鼠标幻灯片课件(36页珍藏版)》请在金锄头文库上搜索。

1、第6讲 Windows应用程序中的键盘与鼠标,扫描码是依赖于具体设备的,为达到设备无关性的要求,往往使用与具体设备无关的虚拟码,虚拟码是由Windows系统定义的与设备无关的键的标识,6.1 键盘在应用程序中的应用,虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟码已经在Windows.h中定义,,应用程序一般有几个窗 口,但当按下某一个键 时,只有一个窗口能接 收到该键盘消息,接收 这个键盘消息的窗口称 为有“输入焦点”的窗口,有“输入焦点” 的窗口应是活 动窗口或者活 动窗口的子窗口,32位的变量,包含了识别按下 的键的

2、虚键码,在WinMain函数的消息循环中包含了TranslateMessage函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘字符映射成ASCII码后才能产生WM_CHAR消息,【6-1】 设计一个窗口,在该窗口中练习键盘的响应,要求如下: (1) 单击键盘上的向上箭头时,窗口中显示“You had hitted the up key” (2) 单击键时,窗口中显示“You had hitted the SHIFT key” (3) 单击键时,窗口中显示“You had hitted the CTRL key” (4) 单击键时,窗口中显示“You had hitted th

3、e CTRL A key” (5) 单击键时,窗口中显示“You had hitted the SHIFT B key”,long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) HDC hDC;/定义设备环境句柄. PAINTSTRUCT ps;/定义包含绘图信息的结构体变量 HPEN hPen;/定义画笔句柄。 HBRUSH hBrush;/定义画刷句柄,/以下定义输出的字符串。 static char cUp=You had hitted the UP key; static char cCtrl=You h

4、ad hitted the Ctrl key; static char cShift=You had hitted the SHIFT key; static char cCtrl_A=You had hitted the CTRL A key; static char cShift_B=You had hitted the SHIFT B key;,/下面定义并初始化按键标志变量。 static BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown

5、=FALSE;,switch(iMessage) case WM_KEYDOWN: switch(wParam) case VK_UP:/当按上箭头键时,变量置为真。 nUpKeyDown = TRUE; break; case VK_SHIFT:/当按shift键时,变量置为真。 nShiftKeyDown = TRUE; break; case VK_CONTROL:/当按control键时,变量置为真 nCtrlKeyDown = TRUE; break; default: break; break; case WM_KEYUP: InvalidateRect(hWnd,NULL,FAL

6、SE);break;,case WM_CHAR: if(wParam=(65,case WM_PAINT:/处理绘图消息. hDC=BeginPaint(hWnd,/设置字体颜色为红色。,/输出信息。 if(nUpKeyDown = TRUE) Rectangle(hDC,0,0,300,200); TextOut(hDC,0,0,cUp,strlen(cUp); nUpKeyDown = FALSE; ,else if(nCtrlAKeyDown = TRUE) Rectangle(hDC,0,0,300,200); TextOut(hDC,0,100,cCtrl_A,strlen(cCtr

7、l_A); nCtrlAKeyDown = FALSE; nCtrlKeyDown = FALSE; ,else if(nCtrlKeyDown = TRUE ,else if(nShiftBKeyDown = TRUE) Rectangle(hDC,0,0,300,200); TextOut(hDC,0,0,cShift_B,strlen(cShift_B); nShiftBKeyDown = FALSE; nShiftKeyDown = FALSE;,else if(nShiftBKeyDown = FALSE else;,/删除画笔和画刷 DeleteObject(hPen); Dele

8、teObject(hBrush); EndPaint(hWnd,case WM_DESTROY: PostQuitMessage(0);return 0; default:return(DefWindowProc(hWnd,iMessage,wParam,lParam); return 0; ,程序中缓冲区大小只设30个字符,当缓冲区满时若再输入任何字符,就出现(1)号错误提示,用户按下左箭头键直至光标到达本行起始位置时,就无法再往左移动,则出现(2)号错误信息,若此时您按下Esc键,就出现(3)号错误提示信息,若当前光标位置处于本行的起始位置,此时按下回退键(BackSpace),则出现编号

9、为(4)的错误提示信息,若字符缓冲区中已没有任何字符,此时按下了Delete键,则出现(5)号错误提示信息,6.2 键盘操作应用举例,例6-2:本例演示键盘输入时所产生的消息序列并在窗口的客户区显示对应的字符,long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) #define BufSize 15/设置存放字符的缓冲区大小 static char cCharBufBufSize;/设置静态字符数组,存放输入的字符,字符个数不能超出缓冲区大小 static int nNumChar=0;/现有字符个数 stat

10、ic int nArrayPos=0;/字符的位置 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

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

12、冲区已满,不能再输入字符了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,ca

13、se VK_DELETE:/处理按下键为Delete时的消息 if(nArrayPos=nNumChar) /输入位置处于本行的末尾 MessageBox(hWnd,缓冲区已空,没有字符可供删除,NULL,MB_OK); else for(x=nArrayPos;x0) nArrayPos=nArrayPos-1; /当前输入位置往前移一个位置 else MessageBox(hWnd,您已经移动到起始位置,不能再往左移动了,NULL,MB_OK); break; case VK_RIGHT:/处理按下右方向键时的消息 if(nArrayPosnNumChar)/若当前位置未到缓冲区的末尾,可

14、向右移动 nArrayPos=nArrayPos+1; else MessageBox(hWnd,已经到缓冲区的末尾,不能再向右移动了,NULL,MB_OK); break; break;,case WM_PAINT: /处理重画消息 hDC=BeginPaint(hWnd, ,6.3 鼠标在应用程序中的应用,鼠标作为定位输入设备,通过鼠标单击、双击和拖动功能,用户可以很容易地操作基于Windows图形界面的应用程序。,Windows中通过光标来指示当前鼠标的位置,在Windows操作系统中预定义了几种光标,并在Windows.h头文件中加以定义,,例如,下面的语句为窗口类wndclass W

15、NDCLASS wndclass; wndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT); 此外,还可在应用程序中调用LoadCursor函数改变光标形式,相当于窗口的左上 角为原点的坐标值,对于鼠标消息的处理,Windows系统默认的时间间隔为0.5秒,也可以调用SetDoubleClickTime()重新设定间隔值,若窗口不包含上述属性的定义,即使进行了双击操作,该窗口也只能接收到两条WM_BUTTONDOWN消息或两条WN_BUTTONUP消息。,鼠标双击,wndclass.style=CS_HEADRAW|CS_VERDRAW|CS_DBL

16、CLKS;,要使窗口函数能接收 鼠标双击产生的消息 在注册窗口类时必须 具有CS_DBLCLKS属性,由于鼠标移动的随机性,如果要使某一个窗口能不间断地捕获鼠标消息,就必须对鼠标加以捕获,SetCapture(hWnd):可以向句柄为hWnd的窗口发送所有的鼠标消息,调用SetCapture()函数,一旦从窗口捕获了鼠标, 系统的键盘功能就暂时失 效,其它窗口也无法得到 鼠标消息,当该窗口不再需要捕获鼠标消息时,应及时调用ReleaseCapture()以释放鼠标,否则,其他窗口无法接收鼠标信息。,菜单、滚动条 工具条和标题条等处,6.4 鼠标应用程序实例,【例6-3】鼠标输入示范程序,本例介绍如何响应鼠标信息、并改变光标形状等用法,用户在窗口的不同区域移动鼠标时,光标将显示如下图所标识的不同箭头的形状,#include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int W

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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