版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章键盘与鼠标8.1鼠标●鼠标是一种得到广泛应用的定位输入设备。●通过鼠标的单击、双击和拖动功能,用户可以方便的操作Windows的图形界面应用程序。●Windows应用程序的鼠标消息,可以被任何窗口接受,只要鼠标移动到该窗口并有鼠标按键消息,该窗口就可以接受到鼠标消息,而与该窗口是否活动窗口或是否带有输入焦点没有关系。8.1.1鼠标事件和鼠标消息鼠标消息可以分为客户区鼠标消息和非客户区鼠标消息。鼠标在客户区产生的消息由Windows应用程序处理,而在窗口边界、菜单、标题栏和滚动条等非客户区产生的鼠标消息一般由Windows系统处理。
客户区鼠标消息含义WM_MOUSEMOVE鼠标移动WM_LBUTTONUP鼠标左键弹起WM_LBUTTONDOWN鼠标左键按下WM_LBUTTONDBCLK鼠标左键双击WM_RBUTTONUP鼠标右键弹起WM_RBUTTONDOWN鼠标右键按下WM_RBUTTONDBCLK鼠标右键双击WM_MBUTTONUP鼠标中键弹起WM_MBUTTONDOWN鼠标中键按下WM_MBUTTONDBCLK鼠标中键双击表8-1客户区鼠标消息及含义1.客户区鼠标消息表8-2非客户区鼠标消息及含义2.非客户区鼠标消息非客户区鼠标消息含义WM_NCLBUTTONDBCLK双击鼠标左键WM_NCLBUTTONDOWN按下鼠标左键WM_NCLBUTTONUP释放鼠标左键WM_NCMOUSEMOVE在客户区移动鼠标WM_NCRBUTTONDBCLK双击鼠标右键WM_NCRBUTTONDOWN按下鼠标右键WM_NCRBUTTONUP释放鼠标右键8.1.2鼠标消息处理函数
1.用户区鼠标消息处理函数用户区鼠标消息函数WM_MOUSEMOVEOnMouseMove(UINTnFlags,CPointpoint)WM_LBOTTONUPOnLBottonUp(UINTnFlags,CPointpoint)WM_LBOTTONDOWNOnLBottonDown(UINTnFlags,CPoinpoint)WM_LBOTTONDBCLKOnLBottonDbclk(UINTnFlags,CPointpoint)WM_RBOTTONUPOnRBottonUp(UINTnFlags,CPointpoint)WM_RBOTTONDOWNOnRBottonDown(UINTnFlags,CPointpoint)WM_RBOTTONDBCLKOnRBottonDbclk(UINTnFlags,CPointpoint)WM_MBOTTONUPOnMBottonUp(UINTnFlags,CPointpoint)WM_MBOTTONDOWNOnMBottonDown(UINTnFlags,CPointpoint)WM_MBOTTONDBCLKOnMBottonDbclk(UINTnFlags,CPointpoint)(l)nFlags包含额外的鼠标键和键盘键的信息,以指出发生消息时某些鼠标键与键盘键的状态,可能的取值有以下几个。
.MK_CONTROL:键盘上的Ctrl键被按下。
.MK_LBUTTON:鼠标左键被按下。
.MK_MBUTTON:鼠标中键被按下。
.MK_RBUTTON:鼠标右键被按下。
.MK_SHIFT:键盘上的Shift键被按下。
在鼠标消息处理函数内,可用按位逻辑“与”运算检测特定键的信息,例如,鼠标事件发生时如果按下了shift键,则弹出一个消息框,显示“鼠标事件发生时,shift键被按下!”,代码如下:
if(nFlags&MK_SHIFT)//结果若为非零值,则表示键被按下
Messagesox(”鼠标事件发生时,shift键被按下!”);
当按下鼠标左键的同时移动鼠标,响应哪种消息?
(2)point参数包含鼠标指针的坐标位置,其类型为CPoint类,CPoint类是MFC预定义的用来描述点的类,其包含两个数据成员x和y。point.x内为鼠标指针的横坐标,poini.y内为鼠标指针的纵坐标。2.鼠标消息的捕获由于鼠标的随机性,用户可能在一个应用程序的窗口内按下鼠标左键,而移动到另一个应用程序的窗口内后释放鼠标左键。为使所有鼠标消息均定向到某一窗口,而不管鼠标光标位于何处,就必须对鼠标加以捕捉。Windows为了这个目的,声明了一个专门用来捕获鼠标消息的函数:CWnd*SetCapture();一旦某窗口捕捉了鼠标,其他窗口无法得到鼠标消息。因此,应用程序应该及时释放鼠标,以使鼠标可以按系统预定的正常方式发送消息,否则将使鼠标的一些正常作用失效(例如,当用鼠标单击窗口的关闭按钮时,程序将不能被关闭)。释放鼠标要使用下面的这个函数:BOOLReleaseCapture();这两个函数都不带输入参数。例1开发一个用鼠标绘图的程序,当按下鼠标左键的同时移动鼠标可在窗口内绘图,松开鼠标左键后绘图结束。(1)用应用程序向导生成一个新的单文档应用程序Draw1。
(2)在CDraw1View类中添加WM_MOUSEMOVE消息的消息处理函数并填写代码如下voidCDraw1View::OnMouseMove(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereif(nFlags&MK_LBUTTON){CDC*pDC=GetDC();pDC->SetPixel(point,RGB(255,0,0));ReleaseDC(pDC);}CView::OnMouseMove(nFlags,point);}例2开发一个用鼠标绘图的程序,当按下鼠标左键,在窗口中拖动鼠标,可画出一条红色直线,松开鼠标左键后画图结束。
首先分析共有几个消息,几个变量,每个消息响应函数中要做些什么?1、按下鼠标左键2、松开鼠标左键根据题意,设计变量如下:CPen*cpen;//定义画笔类对象CPointstartPoint;CPointendPoint;//画图的起始点和结束点(1)用应用程序向导生成一个新的单文档应用程序Draw2。(2)在CDraw2View类的头文件Draw2View.h中添加以下数据成员:classCDraw2View:publicCView{ //由用户添加的数据成员
public: CDraw2Doc*GetDocument();CPen*cpen;//定义画笔类对象CPointstartPoint;CPointendPoint;//画图的起始点和结束点//Operations}(3)画笔、画刷以及变量的初始化在视图类构造函数中完成,画笔、画刷的销毁在视图类析构函数中完成。代码分别如下:CDraw2View::CDraw2View(){ //TODO:addconstructioncodeherecpen=newCPen(PS_SOLID,0,RGB(255,0,0));}CDraw2ViewView::~CDraw2View(){deletecpen;}(4)在CDraw2View类中添加WM_LBUTTONDOWN消息的消息处理函数OnLButtonDown,并在函数中添加代码如下:voidCDraw2View::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultstartPoint=point;
CView::OnLButtonDown(nFlags,point);}(5)在CDraw2View类中添加WM_LBUTTONUp消息的消息处理函数OnLButtonUp,并在函数中添加代码如下:voidCDraw2View::OnLButtonUp(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultendPoint=point;CDC*pDC=GetDC();pDC->SelectObject(cpen);pDC->MoveTo(startPoint.x,startPoint.y);pDC->LineTo(endPoint.x,endPoint.y);
ReleaseDC(pDC);
CView::OnLButtonUp(nFlags,point);}运行时发现缺点:鼠标移动时看不到画线解决方法:增加鼠标移动消息,使鼠标移动时动态画图voidCDraw2View::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultCDC*pDC=GetDC();pDC->SelectObject(cpen);endPoint=point;pDC->MoveTo(startPoint.x,startPoint.y);pDC->LineTo(endPoint.x,endPoint.y);ReleaseDC(pDC);
CView::OnMouseMove(nFlags,point);}缺点:看到的不是一条直线修改OnMouseMove代码,实现动画voidCDraw2View::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultCDC*pDC=GetDC();pDC->SelectObject(cpen);pDC->SetROP2(R2_XORPEN);
pDC->MoveTo(startPoint.x,startPoint.y);pDC->LineTo(endPoint.x,endPoint.y);endPoint=point;pDC->MoveTo(startPoint.x,startPoint.y);pDC->LineTo(endPoint.x,endPoint.y);ReleaseDC(pDC);CView::OnMouseMove(nFlags,point);}实现了动画,但是鼠标在不按下时也要画线增加一个bool型变量lMouseFlag来标识鼠标左键是否按下如果只有按下鼠标左键时移动鼠标才画图,那么一定设置此变量(1)在CDraw2View类的头文件Draw2View.h中添加一行代码:
boollMouseFlag;(2)CDraw2View::CDraw2View()中增加语句:lMouseFlag=false;(3)OnLButtonDown()修改如下:voidCDraw2View::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultstartPoint=point;endPoint=point;lMouseFlag=true;
CView::OnLButtonDown(nFlags,point);}(4)修改OnMouseMove代码voidCDraw2View::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultIf(lMouseFlag){CDC*pDC=GetDC();pDC->SelectObject(cpen);pDC->SetROP2(R2_XORPEN);
pDC->MoveTo(startPoint.x,startPoint.y);pDC->LineTo(endPoint.x,endPoint.y); endPoint=point;pDC->MoveTo(startPoint.x,startPoint.y);pDC->LineTo(endPoint.x,endPoint.y);ReleaseDC(pDC);}CView::OnMouseMove(nFlags,point);}(5)在CDraw2View类中添加WM_LBUTTONUp消息的消息处理函数OnLButtonUp,并在函数中添加代码如下:voidCDraw2View::OnLButtonUp(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultendPoint=point;CDC*pDC=GetDC();pDC->SelectObject(cpen);pDC->MoveTo(startPoint.x,startPoint.y);pDC->LineTo(endPoint.x,endPoint.y);
lMouseFlag=false;ReleaseDC(pDC);
CView::OnLButtonUp(nFlags,point);}缺少鼠标捕获,解决方法:SetCapture();加到OnLButtonDown()函数中ReleaseCapture();加到OnLButtonUp()函数中思考:改成在OnDraw()函数中画图,怎么修改?(使用Invalidate(true);
函数)【例8-1】开发一个用鼠标绘图的程序,当按下Ctrl键的同时按下鼠标左键,在窗口中拖动鼠标,可画出一个圆;在按下Shift键的同时,按下鼠标左键,在窗口中拖动鼠标,可画出一个矩形;当按下鼠标右键后,移动鼠标可擦除窗口内的图形,松开鼠标右键后擦图结束。
根据题意,设计变量如下:intkeyFlag;//为1表示鼠标左键按下时按下Ctrl键;为2表示鼠标左键按下时按下Shift键;否则为0CPen*cpen;//定义画笔类对象CPen*erasePen;CBrush*cbrush;//定义画刷类对象boollMouseFlag;//表示鼠标左键是否按下boolrMouseFlag;//表示鼠标右键是否按下CPointstartPoint;CPointendPoint;//画图的起始点和结束点(1)用应用程序向导生成一个新的单文档应用程序ex8_1。(2)在CEx8_1View类的头文件ex8_1View.h中添加以下数据成员:classCEx8_1View:publicCView{ //由用户添加的数据成员
public: CEx8_1Doc*GetDocument();intkeyFlag;CPen*cpen;CPen*erasePen;//定义画笔类对象CBrush*cbrush;//定义画刷类对象boollMouseFlag;//表示鼠标左键是否按下boolrMouseFlag;//表示鼠标右键是否按下CPointstartPoint;CPointendPoint;//画图的起始点和结束点//Operations}(3)画笔、画刷以及变量的初始化在视图类构造函数中完成,画笔、画刷的销毁在视图类析构函数中完成。代码分别如下:CEx8_1View::CEx8_1View(){ //TODO:addconstructioncodeherekeyFlag=0;lMouseFlag=false;rMouseFlag=false;cpen=newCPen(PS_SOLID,0,RGB(255,0,0));erasePen=newCPen(PS_SOLID,20,RGB(255,255,255));cbrush=newCBrush(RGB(0,255,0));}CEx8_1View::~CEx8_1View(){deletecpen;deleteerasePen;deletecbrush;}(4)在CEx8_1View类中添加WM_LBUTTONDOWN消息的消息处理函数OnLButtonDown,并在函数中添加代码如下:voidCEx8_1View::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultlMouseFlag=true;SetCapture();//捕获鼠标动作if(nFlags&MK_CONTROL) keyFlag=1;elseif(nFlags&MK_SHIFT) keyFlag=2;elsekeyFlag=0;startPoint=point;endPoint=point; CView::OnLButtonDown(nFlags,point);}(5)在CEx8_1View类中添加WM_LBUTTONUp消息的消息处理函数OnLButtonUp,并在函数中添加代码如下:voidCEx8_1View::OnLButtonUp(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultReleaseCapture();endPoint=point;Invalidate(true);//参数为true则用白刷子刷新用户区后再画,为false则在原来基础上面画图。lMouseFlag=false; CView::OnLButtonUp(nFlags,point);}(6)在视图类的OnDraw()函数中添加如下代码:voidCEx8_1View::OnDraw(CDC*pDC){ CEx8_1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahereif(keyFlag!=0){pDC->SelectObject(cpen);pDC->SelectObject(cbrush);if(keyFlag==1) pDC->Ellipse(startPoint.x,startPoint.y,endPoint.x,endPoint.y);if(keyFlag==2)
pDC->Rectangle(startPoint.x,startPoint.y,endPoint.x,endPoint.y);}}(7)在CEx8_1View类中添加WM_MouseMove消息的消息处理函数OnMouseMove,并在函数中添加代码如下:voidCEx8_1View::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultif(lMouseFlag){ endPoint=point;Invalidate(true);}
CView::OnLButtonUp(nFlags,point);}可以画出图形了(8)在CEx8_1View类中添加WM_RBUTTONDOWN消息的消息处理函数OnRButtonDown,并在函数中添加代码如下:voidCEx8_1View::OnRButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultrMouseFlag=true;SetCapture();//捕获鼠标动作startPoint=point;endPoint=startPoint; CView::OnRButtonDown(nFlags,point);}(9)在CEx8_1View类中添加WM_RBUTTONUP消息的消息处理函数OnRButtonUp,并在函数中添加代码如下:voidCEx8_1View::OnRButtonUp(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultReleaseCapture();//释放鼠标捕获rMouseFlag=false;
CView::OnRButtonUp(nFlags,point);}(10)在CEx8_1View类OnMouseMove函数中添加代码如下:if(rMouseFlag==true){ SetCursor(LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CURSOR1)));//设置鼠标形状
CDC*pDC=GetDC();//获取设备上下文
pDC->SelectObject(erasePen); pDC->SelectObject(cbrush); pDC->SetROP2(R2_COPYPEN);//设置为覆盖绘图方式
pDC->Rectangle(point.x+10,point.y+10,point.x,point.y); ReleaseDC(pDC);//释放设备上下文}(11)增加光标资源IDC_CURSOR1第10步中需要设置鼠标光标的形状为IDC_CURSOR1,这就需要增加IDC_CURSOR1资源,增加光标资源的方法是:在工作空间的RrsourceView面板中右击ex8_1resources文件夹,在弹出的快捷菜单中选择“插入”后弹出插入资源对话框,在资源类型中选中Cursor后点击新建,那么在RrsourceView面板中就出现了新的光标资源,默认名称为IDC_CURSOR1。例鼠标的光标在用户区移动时,在用户区显示鼠标光标的位置。鼠标的光标在标题栏或窗口边框上移动时,也在用户区显示鼠标光标的位置。实现步骤如下:(1)用应用程序向导生成一个新的单文档应用程序Draw3。(2)在CDraw3View类中添加WM_MOUSEMOVE的响应函数OnMouseMove,添加以下代码:voidCDraw3View::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultcharstr[50]; CClientDCdc(this);//获取设备描述表dc.TextOut(200,80,"WM_MOUSEMOVE");wsprintf(str,"X:%dY:%d",point.x,point.y);dc.TextOut(400,80,str);
CFrameWnd::OnMouseMove(nFlags,point);}(3)在主框架窗口类CMainFrame中添加非用户区鼠标移动消息WM_NCMOUSEMOVE的响应函数OnNcMouseMove,(先添加OnMouseMove,然后改3个地方),添加以下代码:voidCMainFrame::OnNcMouseMove(UINTnHitTest,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultcharstr[50]; CClientDCdc(this);//获取设备描述表dc.TextOut(200,40,"WM_NCMOUSEMOVE");wsprintf(str,"X:%6dY:%6d",point.x,point.y);dc.TextOut(400,40,str); CFrameWnd::OnNcMouseMove(nHitTest,point);}【例8-2】鼠标的光标在标题栏或窗口边框上移动时,在用户区显示鼠标光标的位置。当鼠标左键按下且不放开,鼠标移动到窗口外,在用户区中仍然显示鼠标光标的位置。实现步骤如下:(1)用应用程序向导生成一个新的单文档应用程序ex8_2。(2)在主框架窗口类CMainFrame中添加非用户区鼠标移动消息WM_NCMOUSEMOVE的响应函数OnNcMouseMove,(先添加OnMouseMove,然后改3个地方),添加以下代码:voidCMainFrame::OnNcMouseMove(UINTnHitTest,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultcharstr[50]; CClientDCdc(this);//获取设备描述表dc.TextOut(200,40,"WM_NCMOUSEMOVE");wsprintf(str,"X:%6dY:%6d",point.x,point.y);dc.TextOut(400,40,str); CFrameWnd::OnNcMouseMove(nHitTest,point);}(3)在主框架窗口类CMainFrame中添加WM_MOUSEMOVE的响应函数OnMouseMove,添加以下代码:voidCMainFrame::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultcharstr[50]; CClientDCdc(this);//获取设备描述表dc.TextOut(200,80,"WM_MOUSEMOVE");wsprintf(str,"X:%dY:%d",point.x,point.y);dc.TextOut(400,80,str);
CFrameWnd::OnMouseMove(nFlags,point);}发现在客户区移动鼠标时,没有反应。因为没有捕获鼠标(4)在主框架窗口类CMainFrame中添加消息WM_NCLBUTTONDOWN的响应函数OnNcLButtonDown,添加以下代码:voidCMainFrame::OnNcLButtonDown(UINTnHitTest,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultSetCapture();//捕获鼠标消息
CFrameWnd::OnNcLButtonDown(nHitTest,point);}(5)在主框架窗口类CMainFrame中添加消息WM_NCLBUTTONUP的响应函数OnNcLButtonUp,添加以下代码:voidCMainFrame::OnNcLButtonUp(UINTnHitTest,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultReleaseCapture();//释放鼠标捕获
CFrameWnd::OnNcLButtonUp(nHitTest,point);}(6)在主框架窗口类CMainFrame中添加WM_LBUTTONDOWN的响应函数OnLButtonDown,添加以下代码:voidCMainFrame::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultSetCapture();//捕获鼠标消息
CFrameWnd::OnLButtonDown(nFlags,point);}(7)在主框架窗口类CMainFrame中添加WM_LBUTTONUP的响应函数OnLButtonUp,添加以下代码:voidCMainFrame::OnLButtonUp(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefaultReleaseCapture();//释放鼠标捕获
CFrameWnd::OnLButtonUp(nFlags,point);}在鼠标左键按下消息响应函数中使用SetCapture函数捕获鼠标消息,这样只要用户在用户区按下鼠标左键且不放开,那么当鼠标移动到窗口外,该应用程序的窗口仍然会接收到鼠标移动消息。当用户释放鼠标左键后,因为在这个消息的响应函数中使用了ReleaseCapture函数,故这时鼠标将被释放。作业:1开发一个用鼠标绘图的程序,当按下Ctrl键的同时按下鼠标左键,在窗口中拖动鼠标,可画出一个圆;在按下Shift键的同时,按下鼠标左键,在窗口中拖动鼠标,可画出一个矩形;当按下鼠标右键后,移动鼠标可擦除窗口内的图形,松开鼠标右键后擦图结束。2使鼠标的光标在标题栏或窗口边框上移动时,在用户区显示鼠标光标的位置。当鼠标左键按下且不放开,鼠标移动到窗口外,在用户区中仍然显示鼠标光标的位置。8.2键盘●键盘是Windows应用程序一个非常重要的输入手段,当用户按下或释放一个按键时,键盘驱动程序的键盘中断程序将对按键进行编码,并生成键盘消息,最终发送到消息队列中等待处理,而处理键盘消息则是由应用程序的窗口来具体完成的。●在Windows系统下,键盘由所有运行的应用程序共享,但不管用户打开了多少个应用程序,任何情况下只有一个窗口能接受到按键消息。●
Windows环境下接受到按键消息的窗口称为“有输入焦点”的窗口。
8.2.1键盘消息与虚拟键代码
1.键盘消息键盘消息含义WM_KEYDOWN非系统键按下WM_CHAR字符消息,由WM_KEYDOWN衍生WM_DEADCHAR死字符消息,由WM_KEYDOWN衍生WM_KEYUP非系统键释放WM_SYSKEYDOWN系统键按下WM_SYSCHAR系统字符消息,由WM_SYSKEYDOWN衍生WM_SYSDEADCHAR系统死字符消息,由WM_SYSKEYDOWN衍生WM_SYSKEYUP系统键释放
在Windows应用程序运行时若用户按下一个键,就会产生一个键盘消息虚拟键代码键盘上每一个有意义的键都对应着一个唯一的标识值,即键盘扫描码,当用户按下或释放一个按键都会产生扫描码。扫描码是依赖于具体设备的。为了使应用程序不依赖于具体硬件,在Windows应用程序中一般使用与具体设备无关的虚拟码。它是由Windows系统根据键盘扫描码转换而成的一种标准的键标识符,对应用程序而言,它与具体设备无关,从而有效地避免了键盘对应用程序的影响,提高了应用程序的通用性。常用的虚拟键代码在Windows.h中定义,部分常用的虚拟键代码(即Windows标识符)如表8-5所示。
部分常用的虚拟键代码虚拟键代码对应功能键虚拟键代码对应功能键VK_INSERTInsert浆VK_DOWN↓(箭头向下)VK_LEFT←(左箭头)VK_NEXTPageDown键VK_RIGHT→(右箭头)VK_BACKBackSpace键VK_UP↑(箭头向上)VK_RETURNEnter键VK_A~Z字母A~ZVK_TABTab键afx_msgvoidOnChar(UNITnChar,UINTnRepCnt,UINTnFlags)8.2.2键盘消息处理函数●nChar表示按键的字符代码值;●nRepCnt表示按键的重复次数,因此若用户按下某键不放,该参数值将不断增加;●nFlags用于传递按键的扫描码、转换码、键的先前状态、上一次按键状态等相关信息。afx_msgvoidOnKeyDown(UNITnChar,UINTnRepCnt,UINTnFlags)afx_msgvoidOnKeyUp(UNITnChar,UINTnRepCnt,UINTnFlags)●nChar表示按键的虚拟码(对于字母是大写字母的ASCII码)
●nRepCnt、nFlags同上键盘事件的处理原则WM_CHAR消息通常是最有用的消息,它的消息参数中包含可显示字符的ASCII码,WM_CHAR消息能区分字母的大小写,但不能处理非显示字符,如键盘上的“→”"←"“↓”“↑”键。WM_KEYDOWN和WM_KEYUP的消息参数中包含键的虚拟码,它可处理非显示字符,但虚拟码不区分大小写字母,故处理字母比较麻烦。通常需要处理可显示字符时响应WM_CHAR消息,Enter、Backspace、Escape等键也可在WM_CHAR消息中处理。当要处理非显示字符时响应WM_KEYDOWN和WM_KEYUP消息,比如要读取光标键、功能键、Delete键、Insert键、Shift键、Ctrl键、Alt键等。8.2.3键盘应用实例【例8-3】开发一个键盘应用程序,将键盘的输入信息在窗口客户区中显示出来。为简单起见,可以不处理各种控制键和功能键,也不处理换行。实现步骤如下:(1)用应用程序向导生成一个新的单文档应用程序ex8_3。(2)在应用程序框架中添加数据成员。文档类的主要功能是保存应用程序数据,并提供磁盘文件操作等,因此,数据成员应添加在文档类声明的头文件中,即在ex8_3Doc.h文件中定义数据成员m_MyText,用于保存字符数据。public:CStringm_MyText;⑶在应用程序框架中添加消息处理函数。键盘输入的字符消息是窗口消息,需要在视图类中添加字符消息处理函数,消息映射的方法已经在6.5小节中介绍过了,利用类向导在CEx8_3View类中添加WM_CHAR消息处理函数OnChar()(4)在消息处理函数OnChar中添加源代码。voidCEx8_3View::OnChar(UINTnChar,UINTnRepCnt,UINTnFlags){//TODO:Addyourmessagehandlercodehereand/orcalldefaultif(nChar<32){ MessageBeep(MB_OK);//ASCII码小于32发出蜂鸣声
MessageBox(“按键ASCII码不符合要求!”); return;}CClientDCDc(this);//获取窗口客户区设备环境CMyKeyDoc*pDoc=GetDocument();//取得文档类的指针pDoc->m_MyText+=nChar;//所按字符的ASCII码加入到文档中,nChar为OnChar函数的第一个参数Dc.SetTextColor(RGB(0,0,255));//蓝色字体Dc.TextOut(0,0,pDoc->m_MyText);CView::OnChar(nChar,nRepCnt,nFlags);}添加完以上代码之后,可以直接编译和运行该应用程序,这时窗口客户区可以显示键盘所输入的信息。但若窗口大小被改变或窗口被覆盖时,窗口客户区所显示的字符就消失了,因此该程序还应在函数OnDraw中添加如下代码:voidCEx8_3View::OnDraw(CDC*pDC){ CMyKeyDoc*pDC=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedataherepDC->TextOut(0,0,pDoc->m_MyText);//窗口大小改变或被覆盖时输出字符}【例8-4】开发一个键盘应用程序,在该窗口中练习键盘的响应,要求如下:(1)单击键盘上的向上箭头时,窗口中显示“Youhadhittedtheupkey”(2)单击<Shift+B>键时,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考物理总复习专题三牛顿运动定律第1讲牛顿第一定律、牛顿第三定律练习含答案
- 美容美发工具采购协议
- 《大数据分析》课件
- 江西省万载县高中地理 第三章 生产活动与地域联系 3.1 农业区位因素教案 中图版必修2
- 2024-2025学年新教材高中地理 第2单元 不同类型区域的发展 单元活动 开展小区域调查教案 鲁教版选择性必修2
- 2024秋四年级英语上册 Unit 6 Meet my family第3课时(Let's spell Lets sing)教案 人教PEP
- 2024-2025学年高中物理 第十二章 机械波 1 波的形成和传播教案3 新人教版选修3-4
- 高考地理一轮复习第四章地球上的水及其运动第二节海水的性质课件
- 包豪斯设计课件
- 租赁备案代办委托合同
- 幼儿园游戏方案与案例-完整版PPT课件
- 生产安全事故风险评估报告(参考模板)
- ASME培训教程ASME规范第VIII-1卷-压力容器
- 过磅管理制度管理办法
- 绳子的故事(课堂PPT)
- 医学人文与修养(课堂PPT)
- 第2章 行车荷载分析-3
- 华为交换机常用配置
- 社区居家养老服务需求论文
- 110米钢桁梁顶推架设监理实施细则
- 金属间化合物要点
评论
0/150
提交评论