应用程序中的键盘与鼠标.ppt
《应用程序中的键盘与鼠标.ppt》由会员分享,可在线阅读,更多相关《应用程序中的键盘与鼠标.ppt(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6讲讲Windows应用程序中的键盘与鼠标应用程序中的键盘与鼠标扫描码是依赖于具体设备的,为达到扫描码是依赖于具体设备的,为达到设备无关性设备无关性的要求,往往使用与具体设备无的要求,往往使用与具体设备无关的关的虚拟码虚拟码,虚拟码是由,虚拟码是由Windows系统定义的与设备无关的键的标识系统定义的与设备无关的键的标识由于键盘的输入由于键盘的输入产生一条产生一条消息消息扫描码、虚拟码以及其他与击键有关的扫描码、虚拟码以及其他与击键有关的消息消息设备驱动程序设备驱动程序截取键的扫描码截取键的扫描码翻译翻译虚拟码虚拟码它含它含键盘上的键键盘上的键对应对应一个唯一的一个唯一的标识值标识值(扫描
2、码扫描码)按下或释放某键时按下或释放某键时产产生生取出键盘消息进行处理取出键盘消息进行处理消息消息设备驱动程序设备驱动程序把消息放到系统的把消息放到系统的消息队列中消息队列中Windows从系统消息队从系统消息队列中取出消息列中取出消息发送到相应的线程消息队列中发送到相应的线程消息队列中窗口过程窗口过程6.1 6.1 键盘在应用程序中的应用键盘在应用程序中的应用虚拟码虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的是一种与设备无关的键盘编码,它的值存放在键盘消息的wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟码参数中,用以标识哪一个键被按下或释放,最常用的虚拟码已经在已
3、经在Windows.h中定义,中定义,操作系统在接收到键盘输入后操作系统在接收到键盘输入后把消息发送给具有把消息发送给具有“输入焦点输入焦点(inputfocus)的)的窗口窗口应用程序一般有几个窗应用程序一般有几个窗口,但当按下某一个键口,但当按下某一个键时,只有一个窗口能接时,只有一个窗口能接收到该键盘消息,接收收到该键盘消息,接收这个键盘消息的窗口称这个键盘消息的窗口称为有为有“输入焦点输入焦点”的窗口的窗口有有“输入焦点输入焦点”的窗口应是活的窗口应是活动窗口或者活动窗口或者活动窗口的子窗口动窗口的子窗口窗口正在接窗口正在接收输入焦点收输入焦点窗口函数通过捕获窗口函数通过捕获WM_SE
4、TFOCUS和和WM_KILLFOCUS消息确定消息确定当前窗口是否具有输入焦点。当前窗口是否具有输入焦点。窗口失去窗口失去输入焦点输入焦点键盘消息键盘消息按键消息按键消息字符消息字符消息按下或松开一个键时按下或松开一个键时就产生了一按键消息就产生了一按键消息一个按键的组合产生了一个按键的组合产生了一个可以显示的字符时,一个可以显示的字符时,就产生了一个字符消息就产生了一个字符消息系统按键消息系统按键消息非系统按键消息非系统按键消息Alt键与相关输入键的组合键与相关输入键的组合产生的消息,这些键一般产生的消息,这些键一般由由Windows系统内部直接系统内部直接处理,应用程序不处理处理,应用程
5、序不处理若应用程序处理了这若应用程序处理了这些系统键消息,还要调些系统键消息,还要调用用DefWindowsProc()DefWindowsProc()函函数,以便不影响系统对数,以便不影响系统对它们的处理它们的处理不使用不使用Alt键组合键组合的按键消息的按键消息按键消息的按键消息的两个变量两个变量wParamlParam32位的变量位的变量重复计数位(重复计数位(015位)位)OEM扫描码(扫描码(1623位)位)扩展键标志(扩展键标志(24位)位)保留位(保留位(2528位)位)关联码(关联码(29位)位)键的先前状态(位键的先前状态(位30)转换状态(转换状态(31位)位)包含了识别按
6、下包含了识别按下的键的虚键码的键的虚键码在在WinMain函数的消息循环中包含了函数的消息循环中包含了TranslateMessage函数,其函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘字符映射成字符映射成ASCII码后才能产生码后才能产生WM_CHAR消息消息字符消息字符消息系统系统非系统非系统WM_KEYDOWN和和WM_KEYUP的按键消息只能产生非系统消息的按键消息只能产生非系统消息WM_SYSKEYDOWN和和WM_SYSKEYUP按键消息只能产生系统消息按键消息只能产生系统消息【6-1】设计一个窗口,在
7、该窗口中练习键盘的响应,要求如下:设计一个窗口,在该窗口中练习键盘的响应,要求如下:(1)单击键盘上的向上箭头时,窗口中显示单击键盘上的向上箭头时,窗口中显示“Youhadhittedtheupkey”(2)单击单击键时,窗口中显示键时,窗口中显示“YouhadhittedtheSHIFTkey”(3)单击单击键时,窗口中显示键时,窗口中显示“YouhadhittedtheCTRLkey”(4)单击单击键时,窗口中显示键时,窗口中显示“YouhadhittedtheCTRLAkey”(5)单击单击键时,窗口中显示键时,窗口中显示“YouhadhittedtheSHIFTBkey”longWIN
8、APIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)HDChDC;/定义设备环境句柄定义设备环境句柄.PAINTSTRUCTps;/定义包含绘图信息的结构体变量定义包含绘图信息的结构体变量HPENhPen;/定义画笔句柄。定义画笔句柄。HBRUSHhBrush;/定义画刷句柄定义画刷句柄/以下定义输出的字符串。以下定义输出的字符串。staticcharcUp=YouhadhittedtheUPkey;staticcharcCtrl=YouhadhittedtheCtrlkey;staticcharcShift=Youhadhittedt
9、heSHIFTkey;staticcharcCtrl_A=YouhadhittedtheCTRLAkey;staticcharcShift_B=YouhadhittedtheSHIFTBkey;/下面定义并初始化按键标志变量。下面定义并初始化按键标志变量。staticBOOLnUpKeyDown=FALSE,nShiftKeyDown=FALSE,nCtrlKeyDown=FALSE,nCtrlAKeyDown=FALSE,nShiftBKeyDown=FALSE;switch(iMessage)caseWM_KEYDOWN:switch(wParam)caseVK_UP:/当按上箭头键时,变
10、量置为真。当按上箭头键时,变量置为真。nUpKeyDown=TRUE;break;caseVK_SHIFT:/当按当按shift键时,变量置为真。键时,变量置为真。nShiftKeyDown=TRUE;break;caseVK_CONTROL:/当按当按control键时,变量置为真键时,变量置为真nCtrlKeyDown=TRUE;break;default:break;break;caseWM_KEYUP:InvalidateRect(hWnd,NULL,FALSE);break;caseWM_CHAR:if(wParam=(65&VK_CONTROL)if(nCtrlKeyDown=TR
11、UE)nCtrlAKeyDown=TRUE;nCtrlKeyDown=FALSE;elseif(wParam=98|wParam=66)/当按下当按下b键时键时if(nShiftKeyDown=TRUE)/检查检查shift键是否处于按下状态。键是否处于按下状态。nShiftBKeyDown=TRUE;/当当SHIFT键按下时,变量置为真键按下时,变量置为真nShiftKeyDown=FALSE;break;caseWM_PAINT:/处理绘图消息处理绘图消息.hDC=BeginPaint(hWnd,&ps);hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH)
12、;/创建创建白画刷。白画刷。hPen=(HPEN)GetStockObject(WHITE_PEN);/创建白画笔。创建白画笔。SelectObject(hDC,hPen);/选入白画刷选入白画刷SelectObject(hDC,hBrush);/选入白画笔选入白画笔SetTextColor(hDC,RGB(255,0,0);/设置字体颜色为红色。设置字体颜色为红色。/输出信息。输出信息。if(nUpKeyDown=TRUE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cUp,strlen(cUp);nUpKeyDown=FALSE;elseif(nC
13、trlAKeyDown=TRUE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,100,cCtrl_A,strlen(cCtrl_A);nCtrlAKeyDown=FALSE;nCtrlKeyDown=FALSE;elseif(nCtrlKeyDown=TRUE&nCtrlAKeyDown=FALSE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,60,cCtrl,strlen(cCtrl);nCtrlKeyDown=FALSE;elseif(nShiftBKeyDown=TRUE)Rectangle(hDC,0,0,30
14、0,200);TextOut(hDC,0,0,cShift_B,strlen(cShift_B);nShiftBKeyDown=FALSE;nShiftKeyDown=FALSE;elseif(nShiftBKeyDown=FALSE&nShiftKeyDown=TRUE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cShift,strlen(cShift);nShiftKeyDown=FALSE;else;/删除画笔和画刷删除画笔和画刷DeleteObject(hPen);DeleteObject(hBrush);EndPaint(hWnd,&ps)
15、;break;caseWM_DESTROY:PostQuitMessage(0);return0;default:return(DefWindowProc(hWnd,iMessage,wParam,lParam);return0;用户窗口区输入用户窗口区输入“这是一这是一个有关键盘操作的示例程个有关键盘操作的示例程序序”的字符串的字符串程序中缓冲区大小只设程序中缓冲区大小只设30个字符,当缓冲区满时若个字符,当缓冲区满时若再输入任何字符,就出现再输入任何字符,就出现(1)号错误提示号错误提示用户按下左箭头键直至光用户按下左箭头键直至光标到达本行起始位置时,标到达本行起始位置时,就无法再往左移动
16、,则出就无法再往左移动,则出现现(2)号错误信息号错误信息若此时您按下若此时您按下Esc键,就出现键,就出现(3)号号错误提示信息错误提示信息若当前光标位置处于本行的起若当前光标位置处于本行的起始位置,此时按下回退键始位置,此时按下回退键(BackSpace),则出现编号为,则出现编号为(4)的错误提示信息的错误提示信息若字符缓冲区中已没有任若字符缓冲区中已没有任何字符,此时按下了何字符,此时按下了Delete键,则出现键,则出现(5)号错号错误提示信息误提示信息6.2键盘操作键盘操作应用举例应用举例例例6-2:本例演示键盘输入时所产生的消息序列并在本例演示键盘输入时所产生的消息序列并在窗口的
17、客户区显示对应的字符窗口的客户区显示对应的字符long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)#define BufSize 15#define BufSize 15/设设置存放字符的置存放字符的缓缓冲区大小冲区大小static char cCharBufBufSize;static char cCharBufBufSize;/设设置置静静态态字字符符数数组组,存存放放输输
18、入入的的字字符符,字符个数不能超出字符个数不能超出缓缓冲区大小冲区大小static int nNumChar=0;static int nNumChar=0;/现现有字符个数有字符个数static int nArrayPos=0;static int nArrayPos=0;/字符的位置字符的位置static int nLnHeight;static int nLnHeight;static int nCharWidth;static int nCharWidth;int x;int x;HDC hDC;HDC hDC;TEXTMETRIC tm;TEXTMETRIC tm;PAINTSTRU
19、CTPtStr;/定义指向包含绘图信息的结构体变量定义指向包含绘图信息的结构体变量 switch(iMessage)switch(iMessage)/处处理消息理消息case WM_CHAR:case WM_CHAR:/遇到非系遇到非系统统字符所作的字符所作的处处理理if(wParam=VK_BACK)if(wParam=VK_BACK)/处处理理“遇到回退遇到回退键键的消息的消息”if(nArrayPos=0)if(nArrayPos=0)/若若已在一行文字的开始已在一行文字的开始处处,则则提示用提示用户户 不能回退不能回退 MessageBox(hWnd,MessageBox(hWnd,当
20、当 前前 位位 置置 是是 文文 本本 的的 起起 始始 位位 置置,不不 能能 回回 退退,NULL,MB_OK);,NULL,MB_OK);else else nArrayPos=nArrayPos-1;nArrayPos=nArrayPos-1;/每按一次回退每按一次回退键键就回退一个字符的位置就回退一个字符的位置 nNumChar=nNumChar-1;nNumChar=nNumChar-1;/对现对现有字符有字符总总数数进进行行计计数数 InvalidateRect(hWnd,NULL,TRUE);InvalidateRect(hWnd,NULL,TRUE);/刷新用刷新用户户区,并
21、序区,并序发发送送WM_PAINTWM_PAINT消息消息 break;break;if(wParam=VK_ESCAPE)if(wParam=VK_ESCAPE)/处处理按下理按下EscapeEscape键键消息消息MessageBox(hWnd,MessageBox(hWnd,您您现现在不能按在不能按ESCESC键键,请继续请继续其它操作其它操作,NULL,MB_OK);,NULL,MB_OK);break;break;if(nNumChar=BufSize)if(nNumChar=BufSize)/如果写入的字符数超如果写入的字符数超过缓过缓冲区大小,冲区大小,则报则报警警Message
22、Box(hWnd,MessageBox(hWnd,缓缓冲区已冲区已满满,不能再,不能再输输入字符了入字符了nn若需要若需要删删除字符,除字符,请请用用BackSpaceBackSpace键键,NULL,MB_OK);,NULL,MB_OK);break;break;for(x=nNumChar;xnArrayPos;x=x-1)for(x=nNumChar;xnArrayPos;x=x-1)cCharBufx=cCharBufx-1;cCharBufx=cCharBufx-1;cCharBufnArrayPos=(unsigned char)wParam;cCharBufnArrayPos=(
23、unsigned char)wParam;nArrayPos=nArrayPos+1;nArrayPos=nArrayPos+1;nNumChar=nNumChar+1;nNumChar=nNumChar+1;InvalidateRect(hWnd,NULL,TRUE);InvalidateRect(hWnd,NULL,TRUE);break;case WM_CREATE:case WM_CREATE:/处处理窗口理窗口创创建消息建消息 hDC=GetDC(hWnd);hDC=GetDC(hWnd);GetTextMetrics(hDC,&tm);GetTextMetrics(hDC,&tm)
24、;/获获取字体信息取字体信息 nLnHeight=tm.tmHeight+tm.tmExternalLeading;nLnHeight=tm.tmHeight+tm.tmExternalLeading;nCharWidth=tm.tmAveCharWidth;nCharWidth=tm.tmAveCharWidth;ReleaseDC(hWnd,hDC);ReleaseDC(hWnd,hDC);break;break;case WM_KEYDOWN:case WM_KEYDOWN:/处处理按下理按下键键消息消息switch(wParam)switch(wParam)case VK_END:ca
25、se VK_END:/处处理按下理按下键为键为EndEnd时时的消息的消息nArrayPos=nNumChar;nArrayPos=nNumChar;/输输入位置从本行的末尾开始入位置从本行的末尾开始break;break;case VK_HOME:case VK_HOME:/处处理按下理按下键为键为HomeHome时时的消息的消息nArrayPos=0;nArrayPos=0;/输输入位置入位置为为本行的起始位置本行的起始位置break;break;case VK_DELETE:/处处理按下理按下键为键为Delete时时的消息的消息 if(nArrayPos=nNumChar)/输输入位置入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用程序 中的 键盘 鼠标
限制150内