Windows应用程序对键盘与鼠标的响应课件

PPT
  • 阅读 62 次
  • 下载 0 次
  • 页数 37 页
  • 大小 612.500 KB
  • 2022-11-13 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
Windows应用程序对键盘与鼠标的响应课件
可在后台配置第一页与第二页中间广告代码
Windows应用程序对键盘与鼠标的响应课件
可在后台配置第二页与第三页中间广告代码
Windows应用程序对键盘与鼠标的响应课件
可在后台配置第三页与第四页中间广告代码
Windows应用程序对键盘与鼠标的响应课件
Windows应用程序对键盘与鼠标的响应课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 37
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】Windows应用程序对键盘与鼠标的响应课件.ppt,共(37)页,612.500 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-7186.html

以下为本文档部分文字说明:

第6章Windows应用程序对键盘与鼠标的响应第1页,共37页。扫描码是依赖于具体设备的,为达到设备无关性的要求,往往使用与具体设备无关的虚拟码,虚拟码是由Windows系统定义的与设备无关的键的标识由于键盘的输入产生一条消息扫描码、虚拟码以及其他与击键有关的消息设

备驱动程序截取键的扫描码翻译虚拟码它含键盘上的键对应一个唯一的标识值(扫描码)按下或释放某键时产生取出键盘消息进行处理消息设备驱动程序把消息放到系统的消息队列中Windows从系统消息队列中取出消息发送到相应的

线程消息队列中窗口过程6.1键盘在应用程序中的应用第2页,共37页。虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟码已经在Windows.h中定义。常用的虚拟码符号常量名称等价的键盘键或

鼠标按钮符号常量名称等价的键盘键或鼠标按钮VK_LBUTTON鼠标左按钮VK_BACK退格键VK_RBUTTON鼠标右按钮VK_TAB制表键VK_MBUTTON鼠标中按钮VK_RETURN回车键VK_SHIFTShift键VK_CO

NTROLCtrl键VK_MENUAlt键VK_PAUSEPause键VK_CAPITALCapsLock键VK_ESCAPEEsc键VK_PRIORPageUp键VK_NEXTPageDown键VK_ENDEnd键VK_HOMEHome键VK_LEFT左键头键

VK_RIGHT右箭头键VK_UP上箭头键VK_DOWN下箭头键VK_0~VK_90~9键VK_A~VK_ZA~Z键第3页,共37页。操作系统在接收到键盘输入后把消息发送给具有“输入焦点(inputfocus)的窗口应用程序一般有几个窗口,但当

按下某一个键时,只有一个窗口能接收到该键盘消息,接收这个键盘消息的窗口称为有“输入焦点”的窗口有“输入焦点”的窗口应是活动窗口或者活动窗口的子窗口窗口正在接收输入焦点窗口函数通过捕获WM_SETFOCUS和WM_KILLFOCUS消息确定当前窗口是否具有输入焦点。

窗口失去输入焦点第4页,共37页。键盘消息按键消息字符消息按下或松开一个键时就产生了一按键消息一个按键的组合产生了一个可以显示的字符时,就产生了一个字符消息系统按键消息非系统按键消息Alt键与相关输入键的组合产生的消息,这些键一般由Windows系统内部直

接处理,应用程序不处理若应用程序处理了这些系统键消息,还要调用DefWindowsProc()函数,以便不影响系统对它们的处理不使用Alt键组合的的按键消息第5页,共37页。消息类型含义WM_KEYDOWN非系统按下了非系统键消息WM_KEYUP非系统松开了非系统键消息WM_SYS

KEYDOWN系统按下了系统键消息WM_SYSKEYUP系统松开了系统键消息按键消息的两个变量wParamlParam32位的变量重复计数位(0~15位)OEM扫描码(16~23位)扩展键标志(24位)保

留位(25~28位)关联码(29位)键的先前状态(位30)转换状态(31位)包含了识别按下的键的虚键码第6页,共37页。在WinMain函数的消息循环中包含了TranslateMessage函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程

序把键盘字符映射成ASCII码后才能产生WM_CHAR消息。消息类型含义WM_CHAR非系统非系统字符WM_DEADCHAR非系统非系统死字符WM_SYSCHAR系统系统字符WM_SYSDEADCHAR系统系统死字符字符消息系统非系统WM_KEYDOWN和WM_KEYUP的按键消息只能产生非系统

消息WM_SYSKEYDOWN和WM_SYSKEYUP按键消息只能产生系统消息第7页,共37页。【例6-1】设计一个窗口,在该窗口中练习键盘的响应,要求如下:(1)单击键盘上的向上箭头时,窗口中显示“Youhadhittedtheupkey”(2)单

击<Shift>键时,窗口中显示“YouhadhittedtheSHIFTkey”(3)单击<Ctrl>键时,窗口中显示“YouhadhittedtheCTRLkey”(4)单击<Ctrl+A>键时,窗口

中显示“YouhadhittedtheCTRLAkey”(5)单击<Shift+B>键时,窗口中显示“YouhadhittedtheSHIFTBkey”第8页,共37页。longWINAPIWndPr

oc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam){HDChDC;//定义设备环境句柄PAINTSTRUCTps;//定义包含绘图信息的结构体变量HPENhPen;//定义画笔句柄HBRUS

HhBrush;//定义画刷句柄//以下定义输出的字符串staticcharcUp[]="YouhadhittedtheUPkey";staticcharcCtrl[]="YouhadhittedtheCtrlkey";staticcharcShift[]="Youhadh

ittedtheSHIFTkey";staticcharcCtrl_A[]="YouhadhittedtheCTRLAkey";staticcharcShift_B[]="YouhadhittedtheSHIFTBkey";//下面定义并初始化按键标志变量stati

cBOOLnUpKeyDown=FALSE,nShiftKeyDown=FALSE,nCtrlKeyDown=FALSE,nCtrlAKeyDown=FALSE,nShiftBKeyDown=FALSE;第9页,共37页。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;cas

eWM_KEYUP:InvalidateRect(hWnd,NULL,FALSE);break;第10页,共37页。caseWM_CHAR:if(wParam==(65&VK_CONTROL)){if(nCtr

lKeyDown==TRUE){nCtrlAKeyDown=TRUE;nCtrlKeyDown=FALSE;}}elseif(wParam==98||wParam==66)//当按下b键时{if(nShiftK

eyDown==TRUE)//检查Shift键是否处于按下状态。{nShiftBKeyDown=TRUE;//当Shift键按下时,变量置为真nShiftKeyDown=FALSE;}}break;cas

eWM_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));//设置字体颜色为红色。第11页,共3

7页。//输出信息。if(nUpKeyDown==TRUE){Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cUp,strlen(cUp));nUpKeyDown=FALSE;}el

seif(nCtrlAKeyDown==TRUE){Rectangle(hDC,0,0,300,200);TextOut(hDC,0,100,cCtrl_A,strlen(cCtrl_A));nCtrlAKeyDown=FALSE;nCtrlKeyDown=

FALSE;}elseif(nCtrlAKeyDown==TRUE)elseif(nCtrlKeyDown==TRUE&&nCtrlAKeyDown==FALSE){Rectangle(hDC,0,0,300,200);TextOut(hDC,0,60,c

Ctrl,strlen(cCtrl));nCtrlKeyDown=FALSE;}第12页,共37页。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(h

Pen);DeleteObject(hBrush);EndPaint(hWnd,&ps);break;caseWM_DESTROY:PostQuitMessage(0);return0;default:ret

urn(DefWindowProc(hWnd,iMessage,wParam,lParam));}return0;}第13页,共37页。用户窗口区输入“这是一个有关键盘操作的示例程序”的字符串程序中缓冲区大小只设30个

字符,当缓冲区满时若再输入任何字符,就出现(1)号错误提示用户按下左箭头键直至光标到达本行起始位置时,就无法再往左移动,则出现(2)号错误信息若此时您按下Esc键,就出现(3)号错误提示信息若当前光标位置处

于本行的起始位置,此时按下回退键(BackSpace),则出现编号为(4)的错误提示信息若字符缓冲区中已没有任何字符,此时按下了Delete键,则出现(5)号错误提示信息【例6-2本例演示键盘输入时所产生的消息序列并在窗口的客户区显示对应的字符6.2键盘

操作应用举例第14页,共37页。#include<windows.h>#include<stdlib.h>#include<string.h>voidWINAPICaretPos(int*xCaret,int*yCaret)

;longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam);BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindo

ws(HINSTANCEhInstance,intnCmdShow);HWNDhWndMain;longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam){#defineB

ufSize30//设置存放字符的缓冲区大小staticcharcCharBuf[BufSize];//设置静态字符数组,//存放输入的字符,字符个数不能超出缓冲区大小staticintnNumChar=0;//现有字符个数staticintnArrayPos=0;//字符的位置

staticintnLnHeight;staticintnCharWidth;staticintxCaret,yCaret;intx;HDChDC;TEXTMETRICtm;PAINTSTRUCTPtStr;//定义指向包含绘图信息的结构体变量第15页,共37页。switch(iMess

age)//处理消息{caseWM_CHAR://遇到非系统字符所作的处理{if(wParam==VK_BACK)//处理遇到回退键的消息{if(nArrayPos==0)//若已在一行文字的开始处,则提示"不能回退"MessageBox(hWnd,“当前位置是文

本的起始位置,不能回退",NULL,MB_OK);else{nArrayPos=nArrayPos-1;//按一次回退键就回退一字符位置CaretPos(&xCaret,&yCaret);nNumChar=nNumChar-1;//对现有字符总

数进行计数InvalidateRect(hWnd,NULL,TRUE);//刷新并发送WM_PAINT消息}break;}if(wParam==VK_ESCAPE)//处理按下Escape键消息{MessageBox(hWnd,“您现在

不能按ESC键,请继续其它操作",NULL,MB_OK);break;}第16页,共37页。if(nNumChar>=BufSize)//如写入的字符数超过缓冲区大小,则报警{MessageBox(hWnd,“缓冲区已满,不能

再输入字符了\n若需要删除字符,请用BackSpace键",NULL,MB_OK);break;}for(x=nNumChar;x>nArrayPos;x=x-1)cCharBuf[x]=cCharBuf[x-1];cCharBuf[nArra

yPos]=(unsignedchar)wParam;nArrayPos=nArrayPos+1;nNumChar=nNumChar+1;CaretPos(&xCaret,&yCaret);InvalidateRect(hWnd,NUL

L,TRUE);}break;caseWM_CREATE://处理窗口创建消息{hDC=GetDC(hWnd);GetTextMetrics(hDC,&tm);//获取字体信息nLnHeight=tm.tmHeight+tm.tmExternalLea

ding;nCharWidth=tm.tmAveCharWidth;yCaret=nLnHeight;ReleaseDC(hWnd,hDC);}break;第17页,共37页。caseWM_SETFO

CUS://处理活动焦点消息{CreateCaret(hWnd,0,0,nLnHeight);CaretPos(&xCaret,&yCaret);ShowCaret(hWnd);//在活动焦点的窗口中显示插字符}break;caseWM_KILLFOCUS://处理失

去焦点消息DestroyCaret();break;caseWM_KEYDOWN://处理按下键消息{switch(wParam){caseVK_END://处理按下键为End时的消息nArrayPos=nNumChar;//输入位置从本行的末尾开始CaretP

os(&xCaret,&yCaret);break;caseVK_HOME://处理按下键为Home时的消息nArrayPos=0;//输入位置为本行的起始位置CaretPos(&xCaret,&yCaret);break;第18页,共37页。

caseVK_DELETE://处理按下键为Delete时的消息if(nArrayPos==nNumChar)//输入位置处于本行的末尾MessageBox(hWnd,"缓冲区已空,没有字符可供删除",

NULL,MB_OK);else{for(x=nArrayPos;x<nNumChar;x=x+1)cCharBuf[x]=cCharBuf[x+1];//每删一字符,缓冲区中总字符数减1nNumChar=nNumChar-1;InvalidateRect(hWnd,NULL,TR

UE);//用户区刷新}break;caseVK_LEFT://处理按下左方向键时的消息if(nArrayPos>0){nArrayPos=nArrayPos-1;//当前输入位置往前移一个位置,再输入字符时,等于插入字符CaretPos(&xCaret,&yCaret);}el

se//已经移到起始输入位置,不能再往前了MessageBox(hWnd,“您已经移动到起始位置,不能再往左移动了",NULL,MB_OK);break;第19页,共37页。caseVK_RIGHT://处理按下右方向键时的消息if(nArrayPos<nNumChar)

//如果当前位置没有到缓冲区的最后位置,还能向右移动{nArrayPos=nArrayPos+1;CaretPos(&xCaret,&yCaret);}elseMessageBox(hWnd,“已经到缓冲区的末尾,不能再向右移动了",NULL,MB_

OK);break;}}break;caseWM_PAINT://处理重画消息{hDC=BeginPaint(hWnd,&PtStr);TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNu

mChar);//输出缓冲区中文本EndPaint(hWnd,&PtStr);}break;caseWM_DESTROY:PostQuitMessage(0);break;default:return(DefWindowProc(hWnd,iMessage,wParam,lParam));}r

eturn0;}第20页,共37页。BOOLInitWindowsClass(HINSTANCEhInstance)//初始化窗口类{WNDCLASSWndClass;WndClass.cbClsExtra=0;.

.....WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{HWNDhW

nd;hWnd=CreateWindow(......);if(!hWnd)returnFALSE;hWndMain=hWnd;ShowWindow(hWnd,nCmdShow);//显示窗口UpdateWindow(hWnd);//绘制用户区retu

rnTRUE;}voidWINAPICaretPos(int*xCaret,int*yCaret)//处理插字符位置的函数{SetCaretPos(*xCaret,*yCaret);}//设置插字符位置坐标第21页,共37页。鼠标作为定位输入设备,通过鼠标单击、双击和拖

动功能,用户可以很容易地操作基于Windows图形界面的应用程序。代表预定义光标的常量光标属性描述IDC_ARROW箭头光标IDC_CROSS十字光标IDC_IBEAMI形文本光标IDC_ICON空图标IDC_SIZEALL十字箭头光标IDC_SIZENESW带有指向东北方

和西南方箭头的光标IDC_SIZENS带有指向北方和南方箭头的光标IDC_SIZENWSE带有指向西北方和东南方箭头的光标ISC_SIZEWE带有指向东方和西方箭头的光标IDC_UPARROW垂直箭头光标IDC_WAIT计时光标(也称沙漏光标)Windows中通过光

标来指示当前鼠标的位置,在Windows操作系统中预定义了几种光标,并在Windows.h头文件中加以定义。6.3鼠标在应用程序中的应用第22页,共37页。例如,下面的语句为窗口类wndclassWNDCLASSwndc

lass;…wndclass.hCursor=LoadCursor(hThislnst,IDC_WAIT);…此外,还可在应用程序中调用LoadCursor函数改变光标形式。用户自定义光标自定义光标保存在扩展名为.cur的文件中。光标名

CURSOR光标文件(.cur)采用自定义光标时,需在资源文件中定义光标资源加载光标资源(常在定义窗口类时进行)LoadCursor(hThisInst,lpszCursorname)当前实例句柄当前光标第23页,共37页。值含义MK_CONTROL按下键按上的

Ctrl键MK_LBUTTON按下了鼠标左键,等同与WM_LBUTTONDOWNMK_MBUTTON按下了鼠标中键,等同与WM_MBUTTONDOWNMK_RBUTTON按下了鼠标右键,等同与WM_RBUTTONDOWNMK_SHIFT按下键盘上的Shift键鼠标消息lParam

包含了鼠标位置低位包含鼠标位置的x坐标值高位包含鼠标位置的y坐标wParam包含了指示各种虚键状态的值相当于窗口的左上角为原点的坐标值第24页,共37页。对于鼠标消息的处理要对Shift和Ctrl键进行监测caseWM

_LBUTTONDOWN://按下鼠标左键if((wParam&MK_CONTROL)&&(wParam&MK_SHIFT))…//Shift和Ctrl键都被按下break;caseWM_LBUTTONUP://释放鼠标左键…break;…case

WM_LBUTTONDOWN://按下鼠标左键…break;caseWM_LBUTTONUP://释放鼠标左键…break;…不监测第25页,共37页。Windows系统默认的时间间隔为0.5秒,也可以调用SetDoubleC

lickTime()重新设定间隔值若窗口不包含上述属性的定义,即使进行了双击操作,该窗口也只能接收到两条WM_BUTTONDOWN消息或两条WN_BUTTONUP消息。鼠标双击wndclass.style=CS_HEADRA

W|CS_VERDRAW|CS_DBLCLKS;要使窗口函数能接收鼠标双击产生的消息在注册窗口类时必须具有CS_DBLCLKS属性第26页,共37页。由于鼠标移动的随机性,如果要使某一个窗口能不间断地捕获鼠标消息,就必须对鼠标加以捕获SetCapture(h

Wnd):可以向句柄为hWnd的窗口发送所有的鼠标消息调用SetCapture()函数一旦从窗口捕获了鼠标,系统的键盘功能就暂时失效,其它窗口也无法得到鼠标消息当该窗口不再需要捕获鼠标消息时,应及时调用Rele

aseCapture()以释放鼠标,否则,其他窗口无法接收鼠标信息。菜单、滚动条工具条和标题条等处不由应用程序处理而是送往函数DefWindowProc用户区以外的地方产生的鼠标事件产生一个非用户区鼠标消息第27页

,共37页。【例6-2】鼠标输入示范程序,本例介绍如何响应鼠标信息、并改变光标形状等用法,用户在窗口的不同区域移动鼠标时,光标将显示如下图所标识的不同箭头的形状6.4鼠标应用程序实例第28页,共37页。#include

<windows.h>#include<stdio.h>LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInst

ance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClass

Name[]="窗口";charlpszTitle[]="My_Windows";wndclass.style=0;„„wndclass.lpszClassName=lpszClassName;if(!RegisterClass

(&wndclass)){MessageBeep(0);returnFALSE;}hwnd=CreateWindow(lpszClassName,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEBOX,50,50,450,450,

NULL,NULL,hInstance,NULL);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);while(GetMessage(&Msg,NULL,0,0)){TranslateMessage(&

Msg);DispatchMessage(&Msg);}returnMsg.wParam;}第29页,共37页。LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam

,LPARAMlParam){PAINTSTRUCTps;HDChdc;TEXTMETRICtm;HBRUSHhbrush;HPENhpen;HCURSORhcursor;charstr[15];staticintx,y;switch(message){caseWM_MOU

SEMOVE:x=LOWORD(lParam);y=HIWORD(lParam);if(x>50&&x<150&&y>50&&y<150){hcursor=LoadCursor(NULL,IDC_CROSS);//十字光标SetCursor(hcursor);}if(x>150&

&x<250&&y>50&&y<150){hcursor=LoadCursor(NULL,IDC_SIZEALL);//十字箭头光标SetCursor(hcursor);}第30页,共37页。if(x>250&&x<350&&y>50&&y<150){hcursor=Load

Cursor(NULL,IDC_SIZENESW);SetCursor(hcursor);}//西南-东北光标if(x>50&&x<150&&y>150&&y<250){hcursor=LoadCursor(NULL,IDC_IBEAM);SetCursor(hcursor);}//I字型光标

if(x>50&&x<150&&y>250&&y<350){hcursor=LoadCursor(NULL,IDC_SIZEWE);SetCursor(hcursor);}//东西向箭头if(x>150&&x<250&&y>150&&y

<250){hcursor=LoadCursor(NULL,IDC_WAIT);SetCursor(hcursor);}//沙漏光标if(x>250&&x<350&&y>150&&y<250){hcursor=LoadCursor(NULL,IDC_UPARROW)

;SetCursor(hcursor);}//向上箭头光标if(x>150&&x<250&&y>250&&y<350){hcursor=LoadCursor(NULL,IDC_SIZENWSE);SetCursor(hcur

sor);}//西北-东南箭头if(x>250&&x<350&&y>250&&y<350){hcursor=LoadCursor(NULL,IDC_SIZENS);SetCursor(hcursor);}//南北向箭头第31页,共37页。hdc=Get

DC(hwnd);GetTextMetrics(hdc,&tm);hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);SelectObject(hdc,hbrush);hpen=(HPEN)GetStockObje

ct(WHITE_PEN);SelectObject(hdc,hpen);Rectangle(hdc,5,5,tm.tmAveCharWidth*8,tm.tmHeight+3);sprintf(str,"%d,%d\0

",x,y);TextOut(hdc,5,5,str,lstrlen(str));EndPaint(hwnd,&ps);break;第32页,共37页。caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);hpen=(HPEN)GetStockObject(

BLACK_PEN);SelectObject(hdc,hpen);Rectangle(hdc,50,50,350,350);MoveToEx(hdc,50,150,NULL);LineTo(hdc,350,150);MoveToEx(hdc,50,250,NULL);LineTo(

hdc,350,250);MoveToEx(hdc,150,50,NULL);LineTo(hdc,150,350);MoveToEx(hdc,250,50,NULL);LineTo(hdc,250,350);En

dPaint(hwnd,&ps);break;caseWM_DESTROY:PostQuitMessage(0);default:returnDefWindowProc(hwnd,message,wParam,lParam);}retur

n(0);}第33页,共37页。【6-3】编写一个鼠标应用程序,按下鼠标左键在窗口中移动时,将按下左键时所在点和当前点所形成的矩形涂成灰色,此时光标为十字型。当抬起鼠标左键时,将前面所绘制度矩形拉伸到整个窗口,拉伸过程中将光标设置为沙漏型。然后,

若双击鼠标的左键,则灰色消失,窗口恢复到初始状态。voidInvertBlock(HWNDhwnd,POINTptBeg,POINTptEnd){HDChdc;hdc=CreateDC("DISPLAY",NULL,NUL

L,NULL);ClientToScreen(hwnd,&ptBeg);//转换指定窗口的客户区内的点的坐标ClientToScreen(hwnd,&ptEnd);PatBlt(hdc,ptBeg.x,ptBeg

.y,ptEnd.x-ptBeg.x,ptEnd.y-ptBeg.y,DSTINVERT);//这个函数在矩形区内用当前的画笔重画背景和前景*/DeleteDC(hdc);}LRESULTCALLBACKWndPro

c(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){staticBOOLoperate=FALSE,ready=TRUE;staticPOINTBeginP,EndP;staticRECTrect={0,0,0,0};HDChdc;PAI

NTSTRUCTPtStr;HBRUSHhBrush;第34页,共37页。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);}return

0;caseWM_MOUSEMOVE:if(operate){EndP.x=LOWORD(lParam);EndP.y=HIWORD(lParam);rect.left=BeginP.x<EndP.x?BeginP.x:EndP.x;rect.right=Be

ginP.x>EndP.x?BeginP.x:EndP.x;rect.top=BeginP.y<EndP.y?BeginP.y:EndP.y;rect.bottom=BeginP.y>EndP.y?Begin

P.y:EndP.y;SetCursor(LoadCursor(NULL,IDC_WAIT));//载入沙漏光标InvalidateRect(hwnd,NULL,TRUE);}return0;第35页,共37页。caseWM_P

AINT:if(ready==FALSE){hdc=BeginPaint(hwnd,&PtStr);hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);SelectObject(hdc,hBrush);R

ectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);DeleteObject(hBrush);EndPaint(hwnd,&PtStr);}else{hdc=BeginPaint(hwnd,&PtStr);GetClientRect(

hwnd,&rect);Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);EndPaint(hwnd,&PtStr);}return0;caseWM_LBUTTONUP:if(operate){operat

e=FALSE;SetCursor(LoadCursor(NULL,IDC_WAIT));GetClientRect(hwnd,&rect);InvalidateRect(hwnd,NULL,TRUE);SetCursor(LoadCursor(NULL,IDC_ARROW)

);ReleaseCapture();//把鼠标从当前窗口中释放出来}return0;第36页,共37页。caseWM_LBUTTONDBLCLK:if(ready==FALSE){ready=TRUE;Inval

idateRect(hwnd,NULL,TRUE);}return0;caseWM_DESTROY:PostQuitMessage(0);return0;}returnDefWindowProc(hwnd,message,

wParam,lParam);}第37页,共37页。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?