资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,键盘与鼠标响应,键盘响应,鼠标响应,键盘响应编程示例,键盘响应,窗口焦点,虚拟码,窗口焦点,键盘消息只有具有输入焦点的窗口才能接收到:,窗口函数通过获取以下消息确定窗口是否具有输入焦点:,WM_SETFOCUS:窗口接收输入焦点,WM_KILLFOCUS:窗口失去输入焦点,虚拟码,扫描码:键盘上的键的唯一性标识。,虚拟码:与设备无关的键盘编码,其值存放在键盘消息的wParam,用以标识哪一个键被按下或释放。,设备驱动程序截取扫描码后,翻译成虚拟码,由应用程序处理。,常用虚拟码,VK_LBUTTON鼠标左键,VK_MBUTTON鼠标中键,VK_RBUTTON鼠标右键,VK_SHIFTShift键,VK_MENUAlt键,VK_CAPITALCapsLock键,VK_PRIORPageUp键,VK_ENDEnd键,VK_LEFT左箭头键,VK_UP上箭头键,VK_0VK_909键,按键消息,当用户按下或松开一个键时产生按键消息。,系统按键消息:,使用Alt键与相关输入键产生的消息。由windows系统内部直接处理,应用程序不必处理。,WM_SYSKEYDOWN按下系统键,WM_SYSKEYUP松开系统键,WM_KEYDOWN按下非系统键,WM_KEYUP松开非系统键,非系统按键消息:,不使用,Alt,键组合的按键消息,由应用程序处理,例如:,Home,End,,上、下、左、右移动键。,lParam表示的含义常用的有四位:,015位:重复计数位。当键一直被按着时,计算按键次数,29位:标识该键是否与Alt键一同被按下。,30位:标识键的先前状态,31位:标识键被按下还是被松开。,按键消息的wParam包含了识别按下的键的虚拟码。,字符消息,当一个按键的组合(按下键松开键附加字符消息)是一个可显示的字符时,就产生了一个字符消息。,非系统字符消息,函数TranslateMessage处理WM_KEYDOWN产生的消息),WM_CHAR非系统字符,WM_DEADCHAR非系统死字符,系统字符消息,函数TranslateMessage处理WM_SYSKEYDOWN产生的消息,WM_SYSCHAR系统字符,WM_SYSDEADCHAR系统死字符,死字符:本身不能显示但是能修改其他字符显示的字符,鼠标响应,加载光标:,HCURSOR hCursor1;,hCursor1LoadCursor(,hInstance,/应用程序当前实例句柄,IDC_ARROW/系统光标,),SetCursor(hCursor1);,系统预定义的光标,IDC_ARROW箭头光标,IDC_CROSS十字光标,IDC_IBEAMI形光标,IDC_ICON空图标,IDC_SIZEALL,IDC_SIZENESW,IDC_SIZENS,IDC_SIZENWSE,IDC_SIZEWE方向箭头光标,IDC_UPARROW垂直箭头光标,IDC_WAIT计时光标,鼠标消息,lParam,LOWORD(lParam)光标X坐标,HIWORD(lParam)光标Y坐标,窗口左上角为原点,向右为正,向下为正。,wParam,描述虚键状态,常用来检测Shift和Ctrl键是否按下,MK_CONTROL按下Ctrl键,MK_LBUTTON按下鼠标左键,MK_MBUTTON按下鼠标中键,MK_RBUTTON按下鼠标右键,MK_SHIFT按下Shift键,例如:,Case WM_LBUTTONDOWN:,if(wParam&MK_CONTROL),/检测Ctrl键是否按下,break;,鼠标双击,使窗口函数能接受到鼠标双击的消息:,第一步,定义窗口类:,wndclass.style=CS_DBLCLKS;,第二步,接受鼠标双击消息:,case WM_LBUTTONDBLCLK:,case WM_MBUTTONDBLCLK:,case WM_RBUTTONDBLCLK;,捕获鼠标,SetCapture(hwnd);,不管鼠标光标处于何处(包括窗口外),窗口都能接收到鼠标消息,同时系统功能键失效,而且其他窗口都得不到鼠标消息。,ReleaseCapture();,释放鼠标,其它窗口可正常接受鼠标消息。,键盘响应编程示例,#define X 5/每行5个字符,#define Y(4+1)/每页显示4行,long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam),static char charbufXY;,static int nArrayPosY=0,0,0,0,0;,static int nXCharY=0,0,0,0,0;,static int nYCharY=0,0,0,0,0;,static int nNumCharY=0,0,0,0,0;,static int nTextStartXY=0,0,0,0,0;,static int nTextStartYY=0,0,0,0,0;,static SIZE sizeY;,static int n=0;,static int home;,static int nAddTextNotAtEnd;,static int nCharWidth=0;,static PAINTSTRUCT ps;,int i;,HDC hdc;,switch(iMessage),case WM_SETFOCUS:,/设置输入焦点,CreateCaret(hWnd,0,0,15);,SetCaretPos(nXCharn,nYCharn);,ShowCaret(hWnd);,break;,case WM_KILLFOCUS:,/取消输入焦点,DestroyCaret();,break;,case WM_CHAR:,/响应字符消息,if(n=Y-1),MessageBox(hWnd,“缓冲器已满”,NULL,MB_OK);,break;,if(wParam=VK_BACK),/响应回退消息,if(nArrayPosn=0),if(n=0),MessageBox(hWnd,“不能回退“,NULL,MB_OK);,else,/消去一行,n-;,else,/消去行中字符,for(i=nArrayPosn;inNumCharn;i+),/.,charbufni=charbufni+1;,nArrayPosn-;,nNumCharn-;,hdc=GetDC(hWnd);,GetCharWidth32(hdc,charbufnnArrayPosn,charbufnnArrayPosn,nXCharn=nXCharn-nCharWidth;,ReleaseDC(hWnd,hdc);,InvalidateRect(hWnd,NULL,1);,break;,if(nNumCharn=X-1),/该行已满,换一行,if(nY-1),PostMessage(hWnd,WM_CHAR,VK_RETURN,0);,if(wParam=VK_RETURN),/处理回车键,换一行显示,n+;,if(nnArrayPosn;i-),/键入一个有效字符,/.,charbufni=charbufni-1;,charbufni=(unsigned char)wParam;,nArrayPosn+;,nNumCharn+;,hdc=GetDC(hWnd);,GetCharWidth32(hdc,(UINT)wParam,(UINT)wParam,/得到键入字符的宽度,nXCharn=nXCharn+nCharWidth;,/计算光标的新位置,ReleaseDC(hWnd,hdc);,InvalidateRect(hWnd,NULL,0);,break;,case WM_KEYDOWN:,switch(wParam),case VK_HOME:,/处理HOME键消息,home=1;,/光标位置移到0位,nAddTextNotAtEnd=1;,InvalidateRect(hWnd,NULL,0);,break;,case VK_END:,/处理END键消息,nArrayPosn=nNumCharn;,hdc=GetDC(hWnd);,nXCharn=sizen.cx;,InvalidateRect(hWnd,NULL,0);,ReleaseDC(hWnd,hdc);,break;,case WM_PAINT:,hdc=BeginPaint(hWnd,HideCaret(hWnd);,if(home),SetCaretPos(nTextStartX0,nTextStartY0);,home=0;,else,SetCaretPos(nXCharn+nTextStartXn,nYCharn+nTextStartYn);,ShowCaret(hWnd);,for(i=0;i=n;i+),GetTextExtentPoint32(hdc,charbufn,nNumCharn,TextOut(hdc,nTextStartXi,nTextStartYi+nYChari,charbufi,nNumChari);,EndPaint(hWnd,break;,case WM_DESTROY:,PostQuitMessage(0);,break;,default:/其他消息处理程序,return(DefWindowProc(hWnd,iMessage,wParam,lParam);,return wParam;,
展开阅读全文