资源预览内容
第1页 / 共36页
第2页 / 共36页
第3页 / 共36页
第4页 / 共36页
第5页 / 共36页
第6页 / 共36页
第7页 / 共36页
第8页 / 共36页
第9页 / 共36页
第10页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第6讲讲Windows应用程序中的键盘与鼠标应用程序中的键盘与鼠标宫窝瞪郴级眩酣艾芯绍一法友叛豁激路朋眠搁驾鸿特矮凌爷靛争者哨诱孜第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标扫描码是依赖于具体设备的,为达到扫描码是依赖于具体设备的,为达到设备无关性设备无关性的要求,往往使用与具体设备无的要求,往往使用与具体设备无关的关的虚拟码虚拟码,虚拟码是由,虚拟码是由Windows系统定义的与设备无关的键的标识系统定义的与设备无关的键的标识由于键盘的输入由于键盘的输入产生一条产生一条消息消息扫描码、虚拟码以及其他与击键有关的扫描码、虚拟码以及其他与击键有关的消息消息设备驱动程序设备驱动程序截取键的扫描码截取键的扫描码翻译翻译虚拟码虚拟码它含它含键盘上的键键盘上的键对应对应一个唯一的一个唯一的标识值标识值(扫描码扫描码)按下或释放某键时按下或释放某键时产产生生取出键盘消息进行处理取出键盘消息进行处理消息消息设备驱动程序设备驱动程序把消息放到系统的把消息放到系统的消息队列中消息队列中Windows从系统消息队从系统消息队列中取出消息列中取出消息发送到相应的线程消息队列中发送到相应的线程消息队列中窗口过程窗口过程6.1 6.1 键盘在应用程序中的应用键盘在应用程序中的应用造脾片莎绸嫉比窘萌秤职枣回枕壁予淑仰薄凭淬埠厘砸豢赐锰畦宇帖凤次第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标虚拟码虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的是一种与设备无关的键盘编码,它的值存放在键盘消息的wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟码参数中,用以标识哪一个键被按下或释放,最常用的虚拟码已经在已经在Windows.h中定义,中定义,籽萍扑幌议粮窜贾巳匿闷徊珐俺回岛侵惑钝震曹茹苯屎漠荤计爸耗澄哩富第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标操作系统在接收到键盘输入后操作系统在接收到键盘输入后把消息发送给具有把消息发送给具有“输入焦点输入焦点(inputfocus)的)的窗口窗口应用程序一般有几个窗应用程序一般有几个窗口,但当按下某一个键口,但当按下某一个键时,只有一个窗口能接时,只有一个窗口能接收到该键盘消息,接收收到该键盘消息,接收这个键盘消息的窗口称这个键盘消息的窗口称为有为有“输入焦点输入焦点”的窗口的窗口有有“输入焦点输入焦点”的窗口应是活的窗口应是活动窗口或者活动窗口或者活动窗口的子窗口动窗口的子窗口窗口正在接窗口正在接收输入焦点收输入焦点窗口函数通过捕获窗口函数通过捕获WM_SETFOCUS和和WM_KILLFOCUS消息确定消息确定当前窗口是否具有输入焦点。当前窗口是否具有输入焦点。窗口失去窗口失去输入焦点输入焦点莎室缴捆锣蜀献遏羚谁寄粘棋汝奶奎揽搀涩炸偷晦彤厢复测卡指竿众熊拧第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标键盘消息键盘消息按键消息按键消息字符消息字符消息按下或松开一个键时按下或松开一个键时就产生了一按键消息就产生了一按键消息一个按键的组合产生了一个按键的组合产生了一个可以显示的字符时,一个可以显示的字符时,就产生了一个字符消息就产生了一个字符消息系统按键消息系统按键消息非系统按键消息非系统按键消息Alt键与相关输入键的组合键与相关输入键的组合产生的消息,这些键一般产生的消息,这些键一般由由Windows系统内部直接系统内部直接处理,应用程序不处理处理,应用程序不处理若应用程序处理了这若应用程序处理了这些系统键消息,还要调些系统键消息,还要调用用DefWindowsProc()DefWindowsProc()函函数,以便不影响系统对数,以便不影响系统对它们的处理它们的处理不使用不使用Alt键组合键组合的按键消息的按键消息会撂暮壕匈扩辰律狰瓶棱橇卷税犊韩撕茎叹幅真屿梭饿耙术驳亲椽瘁签迪第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标按键消息的按键消息的两个变量两个变量wParamlParam32位的变量位的变量重复计数位(重复计数位(015位)位)OEM扫描码(扫描码(1623位)位)扩展键标志(扩展键标志(24位)位)保留位(保留位(2528位)位)关联码(关联码(29位)位)键的先前状态(位键的先前状态(位30)转换状态(转换状态(31位)位)包含了识别按下包含了识别按下的键的虚键码的键的虚键码郊李郧蛙哇具虚释书遁拭碧穗召赶掘绕履每字悉妒养卫淋邦招腰郭淡矛栏第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标在在WinMain函数的消息循环中包含了函数的消息循环中包含了TranslateMessage函数,其函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘字符映射成字符映射成ASCII码后才能产生码后才能产生WM_CHAR消息消息字符消息字符消息系统系统非系统非系统WM_KEYDOWN和和WM_KEYUP的按键消息只能产生非系统消息的按键消息只能产生非系统消息WM_SYSKEYDOWN和和WM_SYSKEYUP按键消息只能产生系统消息按键消息只能产生系统消息盒踩蓟拙现眼纲如必蹲靡摘莆涤否脆撒妨伊隘舍甭蚀无狡呆逐捂泣翌短儿第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标【6-1】设计一个窗口,在该窗口中练习键盘的响应,要求如下:设计一个窗口,在该窗口中练习键盘的响应,要求如下:(1)单击键盘上的向上箭头时,窗口中显示单击键盘上的向上箭头时,窗口中显示“Youhadhittedtheupkey”(2)单击单击键时,窗口中显示键时,窗口中显示“YouhadhittedtheSHIFTkey”(3)单击单击键时,窗口中显示键时,窗口中显示“YouhadhittedtheCTRLkey”(4)单击单击键时,窗口中显示键时,窗口中显示“YouhadhittedtheCTRLAkey”(5)单击单击键时,窗口中显示键时,窗口中显示“YouhadhittedtheSHIFTBkey”餐咨亭膳茎研赏刚拔冲搞盎裸惹略浇街勘颓诞饯焊汕盂劝即竭妨裸祝恋皂第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)HDChDC;/定义设备环境句柄定义设备环境句柄.PAINTSTRUCTps;/定义包含绘图信息的结构体变量定义包含绘图信息的结构体变量HPENhPen;/定义画笔句柄。定义画笔句柄。HBRUSHhBrush;/定义画刷句柄定义画刷句柄/以下定义输出的字符串。以下定义输出的字符串。staticcharcUp=YouhadhittedtheUPkey;staticcharcCtrl=YouhadhittedtheCtrlkey;staticcharcShift=YouhadhittedtheSHIFTkey;staticcharcCtrl_A=YouhadhittedtheCTRLAkey;staticcharcShift_B=YouhadhittedtheSHIFTBkey;/下面定义并初始化按键标志变量。下面定义并初始化按键标志变量。staticBOOLnUpKeyDown=FALSE,nShiftKeyDown=FALSE,nCtrlKeyDown=FALSE,nCtrlAKeyDown=FALSE,nShiftBKeyDown=FALSE;桃锭常掩菌堪羚师旋辖涵诌骏挞俩太邓篇癸咆结遗虎藻缠甘邻浦菩摔柬饭第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标switch(iMessage)caseWM_KEYDOWN:switch(wParam)caseVK_UP:/当按上箭头键时,变量置为真。当按上箭头键时,变量置为真。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;够炳吩旋链终恢棵谍窒夜搜育沛断阂呢怠遵叛捶状绳弧淳恿意魁茄创哀漾第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标caseWM_CHAR:if(wParam=(65&VK_CONTROL)if(nCtrlKeyDown=TRUE)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); /创建创建白画刷。白画刷。hPen=(HPEN)GetStockObject(WHITE_PEN);/创建白画笔。创建白画笔。SelectObject(hDC,hPen);/选入白画刷选入白画刷SelectObject(hDC,hBrush);/选入白画笔选入白画笔SetTextColor(hDC,RGB(255,0,0);/设置字体颜色为红色。设置字体颜色为红色。帐册琅糠潦拒禾吁艘娠萨薯腐捞暇氓昆怀遮清赃忧艰汰纱南窿健戏煤左镰第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标/输出信息。输出信息。if(nUpKeyDown=TRUE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cUp,strlen(cUp);nUpKeyDown=FALSE;elseif(nCtrlAKeyDown=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;湛傅夺吱挣赠惫檬梁胸稀热嘶楞淳威歌漫畔蛀菏圃城盅亭雁答晋天鹏焊舟第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标elseif(nShiftBKeyDown=TRUE)Rectangle(hDC,0,0,300,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);break;caseWM_DESTROY:PostQuitMessage(0);return0;default: return(DefWindowProc(hWnd,iMessage,wParam,lParam);return0;恩毯舷赠简铰力交减蜘氓幽裂绘吱恕鸣堪蒜谈刁糠凝霓路坡惑但袄一腐锥第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标用户窗口区输入用户窗口区输入“这是一这是一个有关键盘操作的示例程个有关键盘操作的示例程序序”的字符串的字符串程序中缓冲区大小只设程序中缓冲区大小只设30个字符,当缓冲区满时若个字符,当缓冲区满时若再输入任何字符,就出现再输入任何字符,就出现(1)号错误提示号错误提示用户按下左箭头键直至光用户按下左箭头键直至光标到达本行起始位置时,标到达本行起始位置时,就无法再往左移动,则出就无法再往左移动,则出现现(2)号错误信息号错误信息若此时您按下若此时您按下Esc键,就出现键,就出现(3)号号错误提示信息错误提示信息若当前光标位置处于本行的起若当前光标位置处于本行的起始位置,此时按下回退键始位置,此时按下回退键(BackSpace),则出现编号为,则出现编号为(4)的错误提示信息的错误提示信息若字符缓冲区中已没有任若字符缓冲区中已没有任何字符,此时按下了何字符,此时按下了Delete键,则出现键,则出现(5)号错号错误提示信息误提示信息6.2键盘操作键盘操作应用举例应用举例例例6-2:本例演示键盘输入时所产生的消息序列并在本例演示键盘输入时所产生的消息序列并在窗口的客户区显示对应的字符窗口的客户区显示对应的字符掳熬篮余脾针淖亮臀鸽味涕凳昔贸装浓韵杆功娜践狱哈判尺好范路洱谩纺第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标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;/设置置静静态字字符符数数组,存存放放输入入的的字字符符,字符个数不能超出字符个数不能超出缓冲区大小冲区大小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;PAINTSTRUCTPtStr;/定义指向包含绘图信息的结构体变量定义指向包含绘图信息的结构体变量 瓣喝束祷函豢蚤爷戈君忱园俞丙环菩郭袁添劫卷廓瞅监劲箱沙会药凝硬阿第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标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,当当 前前 位位 置置 是是 文文 本本 的的 起起 始始 位位 置置 , 不不 能能 回回 退退,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); /刷新用刷新用户区,并序区,并序发送送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; 顷滁宴聊络苫枕常久枪吗窑史痕涣贪信募瘟眼破乎掐违跋妊孺歧榨稼庙倡第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标if(nNumChar=BufSize) if(nNumChar=BufSize) /如果写入的字符数超如果写入的字符数超过缓冲区大小,冲区大小,则报警警MessageBox(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=(unsigned char)wParam;nArrayPos=nArrayPos+1;nArrayPos=nArrayPos+1;nNumChar=nNumChar+1;nNumChar=nNumChar+1;InvalidateRect(hWnd,NULL,TRUE);InvalidateRect(hWnd,NULL,TRUE); break; 袜挎镐抿转爵亩酶钎瑚剥表砚磋沂茸契迪西获凿焊走誊骑为龟辨勺匝儒滓第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标case WM_CREATE: case WM_CREATE: /处理窗口理窗口创建消息建消息 hDC=GetDC(hWnd); hDC=GetDC(hWnd); GetTextMetrics(hDC,&tm); GetTextMetrics(hDC,&tm); /获取字体信息取字体信息 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: case VK_END: /处理按下理按下键为EndEnd时的消息的消息nArrayPos=nNumChar;nArrayPos=nNumChar;/输入位置从本行的末尾开始入位置从本行的末尾开始break;break; case VK_HOME: case VK_HOME:/处理按下理按下键为HomeHome时的消息的消息nArrayPos=0;nArrayPos=0;/输入位置入位置为本行的起始位置本行的起始位置break;break;痕痉话蜂壮啤庭澳蛹岛染尚擅剃泪挨干澜甩蛇收量捎厂娥荡么胡嘴洒缕技第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标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)/若当前位置未到若当前位置未到缓冲区的末尾,可向右移冲区的末尾,可向右移动 nArrayPos=nArrayPos+1; else MessageBox(hWnd,已已经到到缓冲区的末尾冲区的末尾,不能再向右移不能再向右移动了了,NULL,MB_OK); break; break; 秒劫除眠纹凹碗循滞筏搜疥遗也拌贡蹄纬精抛京斤乡梆侮暖批尹猎毋导省第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标case WM_PAINT: /处理重画消息理重画消息 hDC=BeginPaint(hWnd,&PtStr); TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar); /输出文本出文本 EndPaint(hWnd,&PtStr); break;case WM_DESTROY: /处理理结束束应用用程程序序消息消息 PostQuitMessage(0);/结束束应用程序用程序 break;default:/其他消息其他消息处理程序理程序 return(DefWindowProc(hWnd,iMessage,wParam,lParam) ; return 0;碧掠茧孩披衰曲眠么伸统僻需句钡佃籍药诺痛官宗惭饵妻祷芳匡郧逃涝捉第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标6.3 6.3 鼠标在应用程序中的应用鼠标在应用程序中的应用鼠标作为定位输入设备,通过鼠标单击、双击和拖动功能,用户可以鼠标作为定位输入设备,通过鼠标单击、双击和拖动功能,用户可以很容易地操作基于很容易地操作基于Windows图形界面的应用程序。图形界面的应用程序。Windows中通过光标来指示当前鼠标的位置,在中通过光标来指示当前鼠标的位置,在Windows操作系统中操作系统中预定义了几种光标,并在预定义了几种光标,并在Windows.h头文件中加以定义,头文件中加以定义,养褪撑倒虑骗各敖绕蹬仇疲韦番么厢冗鞋箱硬尿验坦升咳眨镭过俱衰发胃第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标例如,下面的语句为窗口类例如,下面的语句为窗口类wndclassWNDCLASS wndclassWNDCLASS wndclass;wndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT);wndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT);此外,还可在应用程序中调用此外,还可在应用程序中调用LoadCursoLoadCursor函数改变光标形式函数改变光标形式用户自定义光标用户自定义光标自定义光标保存在扩展名为自定义光标保存在扩展名为.cur的文件中的文件中光标名光标名 CURSOR CURSOR 光标文件光标文件(.cur)(.cur)采用自定义光标采用自定义光标时,需在资源文时,需在资源文件中定义光标资源件中定义光标资源加载光标资源加载光标资源(常在定义窗口类时进行常在定义窗口类时进行) LoadCursor(hThisInst,lpszCursorname)LoadCursor(hThisInst,lpszCursorname)当前实例句柄当前实例句柄当前光标当前光标若脑呆聂您佣办枷莱通鸿护令围别淄匙碉唯酉鹰潘獭衷啦绳会烛韧椿此疫第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标鼠标鼠标消息消息lParam包含了鼠标位置包含了鼠标位置低位包含鼠标位置的低位包含鼠标位置的x坐标值坐标值高位包含鼠标位置的高位包含鼠标位置的y坐标坐标wParam包含了指示各种虚键状态的值包含了指示各种虚键状态的值相当于窗口的左上相当于窗口的左上角为原点的坐标值角为原点的坐标值帜瞪释涂级范癸忌业曙贰盖然够字克夫美佑峪辆衰溺设掂栗希蔓朵衙固句第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标对于鼠标消息对于鼠标消息的处理的处理要对要对Shift和和Ctrl键进行监测键进行监测case WM_LBUTTONDOWN: /case WM_LBUTTONDOWN: /按下鼠标左键按下鼠标左键 if(wParam&MK_CONTROL)&(wParam&MK_SHIFT)if(wParam&MK_CONTROL)&(wParam&MK_SHIFT) /Shift/Shift和和CtrlCtrl键都被按下键都被按下 break;break;case WM_LBUTTONUP:case WM_LBUTTONUP:/释放鼠标左键释放鼠标左键 break; break; case WM_LBUTTONDOWN: /case WM_LBUTTONDOWN: /按下鼠标左键按下鼠标左键 break;break;case WM_LBUTTONUP:case WM_LBUTTONUP:/释放鼠标左键释放鼠标左键 break;break; 不监测不监测义泵烬凭兼眶奖玉释到肺拾酪矾桃她蛀烽谈蜡传皮勺升宣涕讥琶搀猪衅入第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标Windows系统默认的时间间隔为系统默认的时间间隔为0.5秒,也可以调用秒,也可以调用SetDoubleClickTime()重新设定间隔值重新设定间隔值若窗口不包含上述属性的定义,即使进行了双击操作,该窗若窗口不包含上述属性的定义,即使进行了双击操作,该窗口也只能接收到两条口也只能接收到两条WM_BUTTONDOWNWM_BUTTONDOWN消息或两条消息或两条WN_BUTTONUPWN_BUTTONUP消息。消息。鼠标双击鼠标双击wndclass.stylewndclass.CS_HEADRAW|CS_VERDRAW|=CS_HEADRAW|CS_VERDRAW|CS_DBLCLKSCS_DBLCLKS; ;要使窗口函数能接收要使窗口函数能接收鼠标双击产生的消息鼠标双击产生的消息在注册窗口类时必须在注册窗口类时必须具有具有CS_DBLCLKSCS_DBLCLKS属性属性财悦撰肚昌阀攒念映界绪树令填毁俱年锥屎扳薪塘姨律井在柴汁汀寨揽词第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标由于鼠标移动的随机性,如果要使某一个窗口能不间断地由于鼠标移动的随机性,如果要使某一个窗口能不间断地捕捕获鼠标获鼠标消息,就必须对消息,就必须对鼠标加以捕获鼠标加以捕获SetCapture(hWnd):可以向句柄为可以向句柄为hWnd的窗口发送所有的鼠标消息的窗口发送所有的鼠标消息调用调用SetCapture()函数函数一旦从窗口捕获了鼠标,一旦从窗口捕获了鼠标,系统的键盘功能就暂时失系统的键盘功能就暂时失效,其它窗口也无法得到效,其它窗口也无法得到鼠标消息鼠标消息当该窗口不再需要捕获鼠标消息时,应及时调用当该窗口不再需要捕获鼠标消息时,应及时调用ReleaseCapture()以释以释放鼠标,否则,其他窗口无法接收鼠标信息。放鼠标,否则,其他窗口无法接收鼠标信息。菜单、滚动条菜单、滚动条工具条和标题条等处工具条和标题条等处不由应用程序处理不由应用程序处理而是送往函数而是送往函数DefWindowProc用户区以外用户区以外的地方产生的地方产生的鼠标事件的鼠标事件产生一个产生一个非用户区非用户区鼠标消息鼠标消息晌片苫盾奋昭房阐净庐随赊旭霓金晃泛棠永熄只郎运涨整檄尹昔仰检涎焕第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标6.4鼠标应用程序实例鼠标应用程序实例【例【例6-3】鼠标输入】鼠标输入示范程序,本例介示范程序,本例介绍如何响应鼠标信绍如何响应鼠标信息、并改变光标形息、并改变光标形状等用法,用户在状等用法,用户在窗口的不同区域移窗口的不同区域移动鼠标时,光标将动鼠标时,光标将显示如下图所标识显示如下图所标识的不同箭头的形状的不同箭头的形状臼进柔并呐镀嫉兔元堂帛傻念琵饼惶专澄础瞎雨商下勤氟余绪怀鞋离胆紫第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标#include#include#include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) HWND hwnd; HWND hwnd;MSG Msg;MSG Msg; WNDCLASS wndclass; WNDCLASS wndclass; char lpszClassName= char lpszClassName=窗口窗口; char lpszTitle=My_Windows; char lpszTitle=My_Windows; wndclass.0; wndclass.0; wndclass.lpszClassName=lpszClassName; wndclass.lpszClassName=lpszClassName; if(!RegisterClass(&wndclass) if(!RegisterClass(&wndclass) MessageBeep(0); MessageBeep(0); return FALSE; return FALSE; hwnd=CreateWindow(lpszClassName,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEBhwnd=CreateWindow(lpszClassName,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEBOX,50,50,450,450,NULL,NULL,hInstance,NULL);OX,50,50,450,450,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nCmdShow); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); UpdateWindow(hwnd); while(GetMessage(&Msg,NULL,0,0) while(GetMessage(&Msg,NULL,0,0) TranslateMessage(&Msg); TranslateMessage(&Msg); DispatchMessage(&Msg);DispatchMessage(&Msg);return Msg.wParam;return Msg.wParam; 炽蓝蹈滚际潞虐蜡锅楔蹿失象漱渠搭汐京樟蛮帖柯粒瘦谈频忽牢怖凉歉冀第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) PAINTSTRUCT ps;PAINTSTRUCT ps;HDC hdc;HDC hdc;TEXTMETRIC tm;TEXTMETRIC tm;HBRUSH hbrush;HBRUSH hbrush;HPEN hpen;HPEN hpen;HCURSOR hcursor;HCURSOR hcursor;char str15;char str15;static int x,y;static int x,y;switch(message)switch(message) case WM_MOUSEMOVE:case WM_MOUSEMOVE:x=LOWORD(lParam);x=LOWORD(lParam);y=HIWORD(lParam);y=HIWORD(lParam);if(x50&x50&y50&x50&y150&x50&y150&x50&y250&x50&y250&x50&y50&x150&y50&x150&y50&x250&y50&x250&y150&x150&y150&x150&y250&x150&y250&x150&y150&x250&y150&x250&y250&x250&y250&x250&y350) hcursor=LoadCursor(NULL,IDC_SIZENS);SetCursor(hcursor); / hcursor=LoadCursor(NULL,IDC_SIZENS);SetCursor(hcursor); /南北向箭头南北向箭头嫁虑峡铬买经辜乳涪焕瘤鹏唆壁源咎骚彪乒夷鞭吻呕归踢舱贮胰簇迢假锥第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标hdc=GetDC(hwnd);hdc=GetDC(hwnd);GetTextMetrics(hdc,&tm);GetTextMetrics(hdc,&tm);hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);SelectObject(hdc,hbrush);SelectObject(hdc,hbrush);hpen=(HPEN)GetStockObject(BLACK_PEN);hpen=(HPEN)GetStockObject(BLACK_PEN);SelectObject(hdc,hpen);SelectObject(hdc,hpen);Rectangle(hdc,5,5,tm.tmAveCharWidth*8,tm.tmHeight+3);Rectangle(hdc,5,5,tm.tmAveCharWidth*8,tm.tmHeight+3);sprintf(str,%d,%d0,x,y);sprintf(str,%d,%d0,x,y);TextOut(hdc,5,5,str,lstrlen(str);TextOut(hdc,5,5,str,lstrlen(str);EndPaint(hwnd,&ps);EndPaint(hwnd,&ps);break;break;费辖摄损晌去涌萤卉茸澎拧短硷龄饭巩但完撂督啤堑侈盅娠襄闻诅当狂盔第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标case WM_PAINT:case WM_PAINT:hdc=BeginPaint(hwnd,&ps);hdc=BeginPaint(hwnd,&ps);hpen=(HPEN)GetStockObject(BLACK_PEN);hpen=(HPEN)GetStockObject(BLACK_PEN);SelectObject(hdc,hpen);SelectObject(hdc,hpen);Rectangle(hdc,50,50,350,350);Rectangle(hdc,50,50,350,350);MoveToEx(hdc,50,150,NULL); LineTo(hdc,350,150);MoveToEx(hdc,50,150,NULL); LineTo(hdc,350,150);MoveToEx(hdc,50,250,NULL); LineTo(hdc,350,250);MoveToEx(hdc,50,250,NULL); LineTo(hdc,350,250);MoveToEx(hdc,150,50,NULL); LineTo(hdc,150,350);MoveToEx(hdc,150,50,NULL); LineTo(hdc,150,350);MoveToEx(hdc,250,50,NULL); LineTo(hdc,250,350);MoveToEx(hdc,250,50,NULL); LineTo(hdc,250,350);EndPaint(hwnd,&ps);EndPaint(hwnd,&ps);break;break;case WM_DESTROY:case WM_DESTROY:PostQuitMessage(0);PostQuitMessage(0);default: return DefWindowProc(hwnd,message,wParam,lParam);default: return DefWindowProc(hwnd,message,wParam,lParam); return(0);return(0); 啮帽侯跟恩浑淡饺晒痈鹅倪港他霹彩恃咱惜聂联浚帅狐菇亥替炽理周倒赖第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标【6-46-4】编编写写一一个个鼠鼠标标应应用用程程序序,按按下下鼠鼠标标左左键键在在窗窗口口中中移移动动时时,将将按按下下左左键键时时所所在在点点和和当当前前点点所所形形成成的的矩矩形形涂涂成成灰灰色色,此此时时光光标标为为十十字字型型。当当抬抬起起鼠鼠标标左左键键时时,将将前前面面所所绘绘制制度度矩矩形形拉拉伸伸到到整整个个窗窗口口,拉拉伸伸过过程程中中将将光光标标设设置置为为沙沙漏漏型型。然然后后,若若双双击击鼠鼠标标的的左左键键,则灰色消失,窗口恢复到初始状态。则灰色消失,窗口恢复到初始状态。voidInvertBlock(HWNDhwnd,POINTptBeg,POINTptEnd)HDChdc;hdc=CreateDC(DISPLAY,NULL,NULL,NULL);ClientToScreen(hwnd,&ptBeg);/转换指定窗口的客户区内的点的坐标转换指定窗口的客户区内的点的坐标ClientToScreen(hwnd,&ptEnd);PatBlt(hdc,ptBeg.x,ptBeg.y,ptEnd.x-ptBeg.x,ptEnd.y-ptBeg.y,DSTINVERT);/这个函数在矩形区内用当前的画笔重画背景和前景这个函数在矩形区内用当前的画笔重画背景和前景*/DeleteDC(hdc);LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)staticBOOLoperate=FALSE,ready=TRUE;staticPOINTBeginP,EndP;staticRECTrect=0,0,0,0;HDChdc;PAINTSTRUCTPtStr;HBRUSHhBrush;宦襄烽拘樊婪挂砾窟银趁卵跨碟珊臣攒潭懒鲁董赊夹邓砍箱资银踊缴汕吟第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标switch(message)caseWM_LBUTTONDOWN:if(!operate)&ready)operate=TRUE;/左键击活俘获左键击活俘获ready=FALSE;SetCapture(hwnd);/把所有的鼠标信息输入到被左键击活的窗口把所有的鼠标信息输入到被左键击活的窗口.SetCursor(LoadCursor(NULL,IDC_CROSS);/载入光标载入光标BeginP.x=LOWORD(lParam);BeginP.y=HIWORD(lParam);return0;caseWM_MOUSEMOVE:if(operate)EndP.x=LOWORD(lParam);EndP.y=HIWORD(lParam);rect.left=BeginP.xEndP.x?BeginP.x:EndP.x;rect.top=BeginP.yEndP.y?BeginP.y:EndP.y;SetCursor(LoadCursor(NULL,IDC_WAIT); /载入沙漏光标载入沙漏光标InvalidateRect(hwnd,NULL,TRUE);return0;箔节胁膜愤矽天隔揉剖寐簧想疆哎歧轰潜兑刹绥爬迢俯菜悬讶菱氧癣夷爱第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标 case WM_PAINT: case WM_PAINT:if(ready=FALSE)if(ready=FALSE) hdc=BeginPaint(hwnd,&PtStr); hdc=BeginPaint(hwnd,&PtStr); hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); SelectObject(hdc,hBrush); SelectObject(hdc,hBrush); Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom); Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom); DeleteObject(hBrush); DeleteObject(hBrush);EndPaint(hwnd,&PtStr);EndPaint(hwnd,&PtStr); elseelse hdc=BeginPaint(hwnd,&PtStr); hdc=BeginPaint(hwnd,&PtStr); GetClientRect(hwnd,&rect); GetClientRect(hwnd,&rect); Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom); Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom); EndPaint(hwnd,&PtStr); EndPaint(hwnd,&PtStr); return 0; return 0;caseWM_LBUTTONUP:if(operate)operate=FALSE;SetCursor(LoadCursor(NULL,IDC_WAIT);GetClientRect(hwnd,&rect);InvalidateRect(hwnd,NULL,TRUE);SetCursor(LoadCursor(NULL,IDC_ARROW);ReleaseCapture();/把鼠标从当前窗口中释放出来把鼠标从当前窗口中释放出来return0;储省袱泰芭五邀万欠持棺择霍胶塑浇湍光钩婴湾炙射因伏鳞凰砸愁涂耸颗第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标caseWM_LBUTTONDBLCLK:if(ready=FALSE)ready=TRUE;InvalidateRect(hwnd,NULL,TRUE);return0;caseWM_DESTROY:PostQuitMessage(0);return0;returnDefWindowProc(hwnd,message,wParam,lParam);独倚时芹枫遮兽沂佰诲牧腾泻盗焉饼辕脖逮缀声蹲昭旅虑回腋皖裙似狈乡第6讲Windows应用程序中的键盘与鼠标第6讲Windows应用程序中的键盘与鼠标
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号