Windows应用程序对键盘与鼠标的响应课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Windows应用程序对键盘与鼠标的响应课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 应用程序 键盘 鼠标 响应 课件
- 资源描述:
-
1、第第6 6章章 WindowsWindows应用程序应用程序对键盘与鼠标的响应对键盘与鼠标的响应第1页,共37页。扫描码是依赖于具体设备的,为达到设备无关性的要求,往往使用与具体设备无关的虚扫描码是依赖于具体设备的,为达到设备无关性的要求,往往使用与具体设备无关的虚拟码,虚拟码是由拟码,虚拟码是由Windows系统定义的与设备无关的键的标识系统定义的与设备无关的键的标识由于键盘的输入由于键盘的输入产生一条产生一条消息消息扫描码、虚拟码以及其他与击键有关的消息扫描码、虚拟码以及其他与击键有关的消息设备驱动程序设备驱动程序截取键的扫描码截取键的扫描码翻译翻译虚拟码虚拟码它含它含键盘上的键键盘上的键
2、对应对应一个唯一的标识值一个唯一的标识值(扫描码扫描码)按下或释放某键时按下或释放某键时产产生生取出键盘消息进行处理取出键盘消息进行处理消息消息设备驱动程序设备驱动程序把消息放到系统的把消息放到系统的消息队列中消息队列中Windows从系统消息队从系统消息队列中取出消息列中取出消息发送到相应的线程消息队列中发送到相应的线程消息队列中窗口过程窗口过程6.1 键盘在应用程序中的应用键盘在应用程序中的应用第2页,共37页。虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟码参数
3、中,用以标识哪一个键被按下或释放,最常用的虚拟码已经在已经在Windows.h中定义。中定义。常用的虚拟码符符号号常常量量名名称称等等价价的的键键盘盘键键或或鼠鼠标标按按钮钮符符号号常常量量名名称称等等价价的的键键盘盘键键或或鼠鼠标标按按钮钮VK_LBUTTON鼠鼠标标左左按按钮钮VK_BACK退退格格键键VK_RBUTTON鼠鼠标标右右按按钮钮VK_TAB制制表表键键VK_MBUTTON鼠鼠标标中中按按钮钮VK_RETURN回回车车键键VK_SHIFTShift 键键VK_CONTROLCtrl 键键VK_MENUAlt 键键VK_PAUSEPause 键键VK_CAPITALCaps Lo
4、ck 键键VK_ESCAPEEsc 键键VK_PRIORPage Up 键键VK_NEXTPage Down 键键VK_ENDEnd 键键VK_HOMEHome 键键VK_LEFT左左键键头头键键VK_RIGHT右右箭箭头头键键VK_UP上上箭箭头头键键VK_DOWN下下箭箭头头键键VK_0VK_909 键键VK_AVK_ZAZ 键键第3页,共37页。操作系统在接收到键盘输入后操作系统在接收到键盘输入后把消息发送给具有把消息发送给具有“输入焦点(输入焦点(input focus)的窗口)的窗口应用程序一般有几个窗应用程序一般有几个窗口,但当按下某一个键口,但当按下某一个键时,只有一个窗口能接时
5、,只有一个窗口能接收到该键盘消息,接收收到该键盘消息,接收这个键盘消息的窗口称这个键盘消息的窗口称为有为有“输入焦点输入焦点”的窗口的窗口有有“输入焦点输入焦点”的窗口应是活的窗口应是活动窗口或者活动窗口或者活动窗口的子窗口动窗口的子窗口窗口正在接窗口正在接收输入焦点收输入焦点 窗口函数通过捕获窗口函数通过捕获WM_SETFOCUS和和WM_KILLFOCUS消息确消息确定当前窗口是否具有输入焦点。定当前窗口是否具有输入焦点。窗口失去窗口失去输入焦点输入焦点第4页,共37页。键盘消息键盘消息按键消息按键消息字符消息字符消息按下或松开一个键时按下或松开一个键时就产生了一按键消息就产生了一按键消息
6、一个按键的组合产生了一个按键的组合产生了一个可以显示的字符时,一个可以显示的字符时,就产生了一个字符消息就产生了一个字符消息系统按键消息系统按键消息非系统按键消息非系统按键消息Alt键与相关输入键的组合键与相关输入键的组合产生的消息,这些键一般产生的消息,这些键一般由由Windows系统内部直接系统内部直接处理,应用程序不处理处理,应用程序不处理若应用程序处理了这若应用程序处理了这些系统键消息,还要调些系统键消息,还要调用用DefWindowsProc()DefWindowsProc()函函数,以便不影响系统对数,以便不影响系统对它们的处理它们的处理不使用不使用Alt键组合键组合的的按键消息的
7、的按键消息第5页,共37页。消消 息息类类 型型含含 义义W M _K E Y D O W N非非 系系 统统按按 下下 了了 非非 系系 统统 键键 消消 息息W M _K E Y U P非非 系系 统统松松 开开 了了 非非 系系 统统 键键 消消 息息W M _SY SK E Y D O W N系系 统统按按 下下 了了 系系 统统 键键 消消 息息W M _SY SK E Y U P系系 统统松松 开开 了了 系系 统统 键键 消消 息息按键消息的按键消息的两个变量两个变量wParamlParam32位的变量位的变量重复计数位(重复计数位(015位)位)OEM扫描码(扫描码(1623位
8、)位)扩展键标志(扩展键标志(24位)位)保留位(保留位(2528位)位)关联码(关联码(29位)位)键的先前状态(位键的先前状态(位30)转换状态(转换状态(31位)位)包含了识别按下包含了识别按下的键的虚键码的键的虚键码第6页,共37页。在在WinMain函数的消息循环中包含了函数的消息循环中包含了TranslateMessage函数,函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘字符映射成盘字符映射成ASCII码后才能产生码后才能产生WM_CHAR消息。消息。消消 息息 类类 型型 含含 义义 W WM M_
9、_C CH HA AR R 非非 系系 统统 非非 系系 统统 字字 符符 W WM M_ _D DE EA AD DC CH HA AR R 非非 系系 统统 非非 系系 统统 死死 字字 符符 W WM M_ _S SY YS SC CH HA AR R 系系 统统 系系 统统 字字 符符 W WM M_ _S SY YS SD DE EA AD DC CH HA AR R 系系 统统 系系 统统 死死 字字 符符 字符消息字符消息系统系统非系统非系统WM_KEYDOWN和和WM_KEYUP的按键消息只能产生非系统消息的按键消息只能产生非系统消息WM_SYSKEYDOWN和和WM_SYSK
10、EYUP按键消息只能产生系统消息按键消息只能产生系统消息第7页,共37页。【例【例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 hitt
11、ed the CTRL A key”(5)单击单击键时,窗口中显示键时,窗口中显示“You had hitted the SHIFT B key”第8页,共37页。long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)HDC hDC;/定义设备环境句柄定义设备环境句柄 PAINTSTRUCT ps;/定义包含绘图信息的结构体变量定义包含绘图信息的结构体变量 HPEN hPen;/定义画笔句柄定义画笔句柄 HBRUSH hBrush;/定义画刷句柄定义画刷句柄/以下定义输出的字符串以下定义输出的字符串 static
12、 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 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,nShiftKey
13、Down=FALSE,nCtrlKeyDown=FALSE,nCtrlAKeyDown=FALSE,nShiftBKeyDown=FALSE;第9页,共37页。switch(iMessage)case WM_KEYDOWN:switch(wParam)case VK_UP:/当按上箭头键时,变量置为真当按上箭头键时,变量置为真nUpKeyDown=TRUE;break;case VK_SHIFT:/当按当按Shift键时,变量置为真键时,变量置为真nShiftKeyDown=TRUE;break;case VK_CONTROL:/当按当按Control键时,变量置为真键时,变量置为真nCtrl
14、KeyDown=TRUE;break;default:break;break;case WM_KEYUP:InvalidateRect(hWnd,NULL,FALSE);break;第10页,共37页。case WM_CHAR:if(wParam=(65&VK_CONTROL)if(nCtrlKeyDown=TRUE)nCtrlAKeyDown=TRUE;nCtrlKeyDown=FALSE;else if(wParam=98|wParam=66)/当按下当按下b键时键时 if(nShiftKeyDown=TRUE)/检查检查Shift键是否处于按下状态。键是否处于按下状态。nShiftBKe
15、yDown=TRUE;/当当Shift键按下时,变量置为真键按下时,变量置为真 nShiftKeyDown=FALSE;break;case WM_PAINT:/处理绘图消息处理绘图消息.hDC=BeginPaint(hWnd,&ps);hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);/创建创建 白画刷。白画刷。hPen=(HPEN)GetStockObject(WHITE_PEN);/创建白画笔。创建白画笔。SelectObject(hDC,hPen);/选入白画刷选入白画刷SelectObject(hDC,hBrush);/选入白画笔选入白画笔SetT
16、extColor(hDC,RGB(255,0,0);/设置字体颜色为红色。设置字体颜色为红色。第11页,共37页。/输出信息。输出信息。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(cCtrl_A);nCtrlAKeyDown=FALSE;nCtrlKeyDown=FALSE;el
17、se if(nCtrlAKeyDown=TRUE)else if(nCtrlKeyDown=TRUE&nCtrlAKeyDown=FALSE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,60,cCtrl,strlen(cCtrl);nCtrlKeyDown=FALSE;第12页,共37页。else if(nShiftBKeyDown=TRUE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cShift_B,strlen(cShift_B);nShiftBKeyDown=FALSE;nShiftKeyDown=FALS
18、E;else if(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;case WM_DESTROY:PostQuitMessage(0);return 0;default:return(DefWindowProc(hWnd,iM
19、essage,wParam,lParam);return 0;第13页,共37页。用户窗口区输入用户窗口区输入“这是这是一个有关键盘操作的示一个有关键盘操作的示例程序例程序”的字符串的字符串程序中缓冲区大小只设程序中缓冲区大小只设30个字个字符,当缓冲区满时若再输入任符,当缓冲区满时若再输入任何字符,就出现何字符,就出现(1)号错误提示号错误提示用户按下左箭头键直至光标用户按下左箭头键直至光标到达本行起始位置时,就无到达本行起始位置时,就无法再往左移动,则出现法再往左移动,则出现(2)号号错误信息错误信息若此时您按下若此时您按下Esc键键,就出现,就出现(3)号错误提号错误提示信息示信息若当前
20、光标位置处于本行的起始位若当前光标位置处于本行的起始位置,此时按下回退键置,此时按下回退键(BackSpace),则出现编号为则出现编号为(4)的错误提示信息的错误提示信息若字符缓冲区中已没有任何字若字符缓冲区中已没有任何字符,此时按下了符,此时按下了Delete键,则键,则出现出现(5)号错误提示信息号错误提示信息【例【例6-2本例本例演示键盘输演示键盘输入时所产生入时所产生的消息序列的消息序列并在窗口的并在窗口的客户区显示客户区显示对应的字符对应的字符6.2 键盘操作应用举例键盘操作应用举例第14页,共37页。#include#include#include#include#include
21、#includevoid WINAPI CaretPos(int void WINAPI CaretPos(int*xCaret,int xCaret,int*yCaret);yCaret);long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);BOOL InitWindowsClass(HINSTANCE hInstance);BOOL InitWindowsClass(H
22、INSTANCE hInstance);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);HWND hWndMain;HWND hWndMain;long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)#define BufSiz
23、e 30#define BufSize 30/设置存放字符的缓冲区大小设置存放字符的缓冲区大小 static char cCharBufBufSize;static char cCharBufBufSize;/设置静态字符数组,设置静态字符数组,/存放输入的字符,字符个数不能超出缓冲区大小存放输入的字符,字符个数不能超出缓冲区大小 static int nNumChar=0;static int nNumChar=0;/现有字符个数现有字符个数 static int nArrayPos=0;static int nArrayPos=0;/字符的位置字符的位置 static int nLnHei
24、ght;static int nLnHeight;static int nCharWidth;static int nCharWidth;static int xCaret,yCaret static int xCaret,yCaret;int x;int x;HDC hDC;HDC hDC;TEXTMETRIC tm;TEXTMETRIC tm;PAINTSTRUCT PtStr;/PAINTSTRUCT PtStr;/定义指向包含绘图信息的结构体变量定义指向包含绘图信息的结构体变量第15页,共37页。switch(iMessage)switch(iMessage)/处理消息处理消息case
25、 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
展开阅读全文