键盘和鼠标应用

上传人:小** 文档编号:62499991 上传时间:2018-12-21 格式:PPT 页数:36 大小:520KB
返回 下载 相关 举报
键盘和鼠标应用_第1页
第1页 / 共36页
键盘和鼠标应用_第2页
第2页 / 共36页
键盘和鼠标应用_第3页
第3页 / 共36页
键盘和鼠标应用_第4页
第4页 / 共36页
键盘和鼠标应用_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《键盘和鼠标应用》由会员分享,可在线阅读,更多相关《键盘和鼠标应用(36页珍藏版)》请在金锄头文库上搜索。

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

2、松开一个键时 就产生了一按键消息,一个按键的组合产生了 一个可以显示的字符时, 就产生了一个字符消息,系统按键消息,非系统按键消息,Alt键与相关输入键的组合 产生的消息,这些键一般 由Windows系统内部直接 处理,应用程序不处理,若应用程序处理了这 些系统键消息,还要调 用DefWindowsProc()函 数,以便不影响系统对 它们的处理,不使用Alt键组合 的的按键消息,32位的变量,包含了识别按下 的键的虚键码,在WinMain函数的消息循环中包含了TranslateMessage函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘字符映射成ASCII码后才能产生WM

3、_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 the CTRL A key” (5) 单击键时,窗口中显示“You had hitted the SHIFT B key”,long WINAPI WndProc(HWND hWnd

4、,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 had hitted the Ctrl key“; static char cShift=“You had hitted the SHIFT key“; static

5、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=FALSE;,switch(iMessage) case WM_KEYDOWN: switch(wParam) case VK_UP: /当按上箭头键

6、时,变量置为真。 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,FALSE); break;,case WM_CHAR: if(wParam=(65,case WM_PAINT: /处理绘图消息. hDC=Begin

7、Paint(hWnd, /设置字体颜色为红色。,/输出信息。 if(nUpKeyDown = TRUE) Rectangle(hDC,0,0,300,200);/绘制一个矩形 TextOut(hDC,0,0,cUp,strlen(cUp);/在矩形内输出字符串cUP nUpKeyDown = FALSE; /重新刷新 ,else if(nCtrlAKeyDown = TRUE) Rectangle(hDC,0,0,300,200); TextOut(hDC,0,100,cCtrl_A,strlen(cCtrl_A); nCtrlAKeyDown = FALSE; nCtrlKeyDown =

8、FALSE; ,else if(nCtrlAKeyDown = TRUE) 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); DeleteObject(hBru

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

10、,若字符缓冲区中已没有任何字符,此时按下了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; /现有字符个数 static int n

11、ArrayPos=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,MB

12、_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,

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

14、,case 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)/若当前位置未到

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

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

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

当前位置:首页 > 商业/管理/HR > 管理学资料

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