版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第6 6章章 WindowsWindows应用程序应用程序对键盘与鼠标的响应对键盘与鼠标的响应 扫描码是依赖于具体设备的,为达到设备无关性的要求,往往使用扫描码是依赖于具体设备的,为达到设备无关性的要求,往往使用与具体设备无关的虚拟码,虚拟码是由与具体设备无关的虚拟码,虚拟码是由Windows系统定义的与设备无系统定义的与设备无关的键的标识关的键的标识由于键盘的输入由于键盘的输入产生一条产生一条消息消息扫描码、虚拟码以及其他与击键有关的消息扫描码、虚拟码以及其他与击键有关的消息设备驱动程序设备驱动程序截取键的扫描码截取键的扫描码翻译翻译虚拟码虚拟码它含它含键盘上的键键盘上的键对应对应一个唯一
2、的标识值一个唯一的标识值(扫描码扫描码)按下或释放某键时按下或释放某键时产产生生取出键盘消息进行处理取出键盘消息进行处理消息消息设备驱动程序设备驱动程序把消息放到系统的把消息放到系统的消息队列中消息队列中Windows从系统消息队从系统消息队列中取出消息列中取出消息发送到相应的线程消息队列中发送到相应的线程消息队列中窗口过程窗口过程6.1 键盘在应用程序中的应用键盘在应用程序中的应用 虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的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 Lock 键键VK_ESCAPEEs
4、c 键键VK_PRIORPage Up 键键VK_NEXTPage Down 键键VK_ENDEnd 键键VK_HOMEHome 键键VK_LEFT左左键键头头键键VK_RIGHT右右箭箭头头键键VK_UP上上箭箭头头键键VK_DOWN下下箭箭头头键键VK_0VK_909 键键VK_AVK_ZAZ 键键操作系统在接收到键盘输入后操作系统在接收到键盘输入后把消息发送给具有把消息发送给具有“输入焦点输入焦点input focus的窗口的窗口应用程序一般有几个窗应用程序一般有几个窗口,但当按下某一个键口,但当按下某一个键时,只有一个窗口能接时,只有一个窗口能接收到该键盘消息,接收收到该键盘消息,接收
5、这个键盘消息的窗口称这个键盘消息的窗口称为有为有“输入焦点的窗口输入焦点的窗口有有“输入焦点输入焦点”的窗口应是活的窗口应是活动窗口或者活动窗口或者活动窗口的子窗口动窗口的子窗口窗口正在接窗口正在接收输入焦点收输入焦点 窗口函数通过捕获窗口函数通过捕获WM_SETFOCUS和和WM_KILLFOCUS消息确消息确定当前窗口是否具有输入焦点。定当前窗口是否具有输入焦点。窗口失去窗口失去输入焦点输入焦点键盘消息键盘消息按键消息按键消息字符消息字符消息按下或松开一个键时按下或松开一个键时就产生了一按键消息就产生了一按键消息一个按键的组合产生了一个按键的组合产生了一个可以显示的字符时,一个可以显示的字
6、符时,就产生了一个字符消息就产生了一个字符消息系统按键消息系统按键消息非系统按键消息非系统按键消息Alt键与相关输入键的组合键与相关输入键的组合产生的消息,这些键一般产生的消息,这些键一般由由Windows系统内部直接系统内部直接处置,应用程序不处理处置,应用程序不处理若应用程序处理了这若应用程序处理了这些系统键消息,还要调些系统键消息,还要调用用DefWindowsProc()函函数,以便不影响系统对数,以便不影响系统对它们的处理它们的处理不使用不使用Alt键组合键组合的的按键消息的的按键消息消消 息息类类 型型含含 义义W M _K E Y D O W N非非 系系 统统按按 下下 了了
7、非非 系系 统统 键键 消消 息息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位)位)扩展键标志扩展键标志24位)位)保留位保留位2528位)位)关联码关联码29位)位)键的先前状态位键的先前状态位30)转换状态转换
8、状态31位)位)包含了识别按下包含了识别按下的键的虚键码的键的虚键码 在在WinMain函数的消息循环中包含了函数的消息循环中包含了TranslateMessage函数,函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘字符映射成盘字符映射成ASCII码后才能产生码后才能产生WM_CHAR消息。消息。消消 息息 类类 型型 含含 义义 W WM M_ _C CH HA AR R 非非 系系 统统 非非 系系 统统 字字 符符 W WM M_ _D DE EA AD DC CH HA AR R 非非 系系 统统 非非 系系
9、 统统 死死 字字 符符 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_SYSKEYUP按键消息只能产生系统消息按键消息只能产生系统消息【例【例6-1】 设计一个窗口,在该窗口中练习键盘的响应,要求如下:设计一个窗口,在该窗口中练习键盘的响应,要求如下
10、:(1) 单击键盘上的向上箭头时,窗口中显示单击键盘上的向上箭头时,窗口中显示“You had hitted the up key”(2) 单击单击键时,窗口中显示键时,窗口中显示“You had hitted the SHIFT key”(3) 单击单击键时,窗口中显示键时,窗口中显示“You had hitted the CTRL key”(4) 单击单击键时,窗口中显示键时,窗口中显示“You had hitted the CTRL A key”(5) 单击单击键时,窗口中显示键时,窗口中显示“You had hitted the SHIFT B key”long WINAPI WndP
11、roc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)HDC hDC;/定义设备环境句柄定义设备环境句柄 PAINTSTRUCT ps;/定义包含绘图信息的结构体变量定义包含绘图信息的结构体变量 HPEN hPen;/定义画笔句柄定义画笔句柄 HBRUSH hBrush;/定义画刷句柄定义画刷句柄 /以下定义输出的字符串以下定义输出的字符串 static char cUp=You had hitted the UP key; static char cCtrl=You had hitted the Ctrl key; static char c
12、Shift=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, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE; switch(iMessage)
13、case WM_KEYDOWN: switch(wParam) case VK_UP:/当按上箭头键时,变量置为真当按上箭头键时,变量置为真nUpKeyDown = TRUE; break; case VK_SHIFT:/当按当按Shift键时,变量置为真键时,变量置为真nShiftKeyDown = TRUE; break; case VK_CONTROL:/当按当按Control键时,变量置为真键时,变量置为真nCtrlKeyDown = TRUE; break; default: break; break; case WM_KEYUP:InvalidateRect(hWnd,NULL,F
14、ALSE);break; 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键是否处于按下状态。键是否处于按下状态。nShiftBKeyDown = TRUE;/当当Shift键按下时,变量置为真键按下时,变量置为真 nShiftKeyDown = FALSE; break;case
15、WM_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);/设置字体颜色为红色。设置字体颜色为红色。/输出信息。输出信息。if(nUpKe
16、yDown = 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;else if(nCtrlAKeyDown = TRUE) else if(nCtrlKeyDown = TRUE&nCtrl
17、AKeyDown = FALSE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,60,cCtrl,strlen(cCtrl);nCtrlKeyDown = FALSE;else if(nShiftBKeyDown = TRUE) Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cShift_B,strlen(cShift_B);nShiftBKeyDown = FALSE;nShiftKeyDown = FALSE;else if(nShiftBKeyDown = FALSE&nShiftKeyDown = TRUE)R
18、ectangle(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,iMessage,wParam,lParam);return 0;用户窗口区输入用户窗口区输入“这是
19、这是一个有关键盘操作的示一个有关键盘操作的示例程序的字符串例程序的字符串程序中缓冲区大小只设程序中缓冲区大小只设30个字符,当缓冲区满时若个字符,当缓冲区满时若再输入任何字符,就出现再输入任何字符,就出现(1)号错误提示号错误提示用户按下左箭头键直至光用户按下左箭头键直至光标到达本行起始位置时,标到达本行起始位置时,就无法再往左移动,则出就无法再往左移动,则出现现(2)号错误信息号错误信息若此时您按下若此时您按下Esc键,就出现键,就出现(3)号错号错误提示信息误提示信息若当前光标位置处于本行的起若当前光标位置处于本行的起始位置,此时按下回退键始位置,此时按下回退键(BackSpace),则出
20、现编号为,则出现编号为(4)的错误提示信息的错误提示信息若字符缓冲区中已没有任若字符缓冲区中已没有任何字符,此时按下了何字符,此时按下了Delete键,则出现键,则出现(5)号错号错误提示信息误提示信息【例【例6-2本例本例演示键盘输演示键盘输入时所产生入时所产生的消息序列的消息序列并在窗口的并在窗口的客户区显示客户区显示对应的字符对应的字符6.2 键盘操作应用举例键盘操作应用举例#include#include#include#include#include#includevoid WINAPI CaretPos(int void WINAPI CaretPos(int * *xCaret,
21、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(HINSTANCE hInstance);BOOL InitWindows(HINSTANCE hInstance,int n
22、CmdShow);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 BufSize 30 #define BufSize 30/设置存放字符的缓冲区大小设置存放字符的缓冲区大小 static char
23、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
24、 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; /定义指向包含绘图信息的结构体变量定义指向包含绘图信息的结构体变量switch(iMessage) switch(iMessage) /处理消息处理消息case WM_CHAR: case WM_CHAR: /遇到非系统字符所作的处理遇到非系统字符所作的处理 if(
25、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; /按一次回退键就回退一字符位
26、置按一次回退键就回退一字符位置 CaretPos(&xCaret,&yCaret);CaretPos(&xCaret,&yCaret); 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) /处理按下处理按下Escap
27、eEscape键消息键消息 MessageBox(hWnd,“ MessageBox(hWnd,“您现在不能按您现在不能按ESCESC键,请继续其它操作键,请继续其它操作,NULL,MB_OK);,NULL,MB_OK); break; break;if(nNumChar=BufSize) if(nNumChar=BufSize) /如写入的字符数超过缓冲区大小,则报警如写入的字符数超过缓冲区大小,则报警 MessageBox(hWnd,“ MessageBox(hWnd,“缓冲区已满,不能再输入字符了缓冲区已满,不能再输入字符了nn 若需要删除字符,请用若需要删除字符,请用BackSpace
28、BackSpace键键,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; nNumChar=nNumChar+1; nArrayPos=nA
29、rrayPos+1; nNumChar=nNumChar+1; CaretPos(&xCaret,&yCaret); CaretPos(&xCaret,&yCaret); InvalidateRect(hWnd,NULL,TRUE); InvalidateRect(hWnd,NULL,TRUE); break; break;case WM_CREATE: /case WM_CREATE: /处理窗口创建消息处理窗口创建消息 hDC=GetDC(hWnd);hDC=GetDC(hWnd);GetTextMetrics(hDC,&tm); /GetTextMetrics(hDC,&tm); /获取
30、字体信息获取字体信息nLnHeight=tm.tmHeight+tm.tmExternalLeading;nLnHeight=tm.tmHeight+tm.tmExternalLeading;nCharWidth=tm.tmAveCharWidth;nCharWidth=tm.tmAveCharWidth;yCaret=nLnHeight;yCaret=nLnHeight;ReleaseDC(hWnd,hDC);ReleaseDC(hWnd,hDC); break;break;case WM_SETFOCUS: /case WM_SETFOCUS: /处理活动焦点消息处理活动焦点消息 Crea
31、teCaret(hWnd,0,0,nLnHeight); CreateCaret(hWnd,0,0,nLnHeight); CaretPos(&xCaret,&yCaret); CaretPos(&xCaret,&yCaret); ShowCaret(hWnd); / ShowCaret(hWnd); /在活动焦点的窗口中显示插字符在活动焦点的窗口中显示插字符 break;break;case WM_KILLFOCUS: case WM_KILLFOCUS: /处理失去焦点消息处理失去焦点消息 DestroyCaret();DestroyCaret(); break; break;case W
32、M_KEYDOWN: case WM_KEYDOWN: /处理按下键消息处理按下键消息 switch(wParam) switch(wParam) case VK_END: case VK_END: /处理按下键为处理按下键为EndEnd时的消息时的消息nArrayPos=nNumChar;nArrayPos=nNumChar;/输入位置从本行的末尾开始输入位置从本行的末尾开始CaretPos(&xCaret,&yCaret);CaretPos(&xCaret,&yCaret);break;break; case VK_HOME: case VK_HOME:/处理按下键为处理按下键为HomeH
33、ome时的消息时的消息 nArrayPos=0;nArrayPos=0;/输入位置为本行的起始位置输入位置为本行的起始位置CaretPos(&xCaret,&yCaret);CaretPos(&xCaret,&yCaret);break;break;case VK_DELETEcase VK_DELETE处理按下键为处理按下键为DeleteDelete时的消息时的消息 if(nArrayPos=nNumChar) /if(nArrayPos=nNumChar) /输入位置处于本行的末尾输入位置处于本行的末尾 MessageBox(hWnd,MessageBox(hWnd,缓冲区已空,没有字符可
34、供删除缓冲区已空,没有字符可供删除,NULL,MB_OK);,NULL,MB_OK); else else for(x=nArrayPos;xnNumChar;x=x+1) for(x=nArrayPos;x0)if(nArrayPos0) nArrayPos=nArrayPos-1; / nArrayPos=nArrayPos-1; /当前输入位置往前移一个位当前输入位置往前移一个位 置,再输入字符时,等于插入字符置,再输入字符时,等于插入字符 CaretPos(&xCaret,&yCaret);CaretPos(&xCaret,&yCaret); else else/已经移到起始输入位置,
35、不能再往前了已经移到起始输入位置,不能再往前了 MessageBox(hWnd,“MessageBox(hWnd,“您已经移动到起始位置,不能再往左移动了您已经移动到起始位置,不能再往左移动了,NULL,MB_OK);,NULL,MB_OK); break; break;case VK_RIGHT:case VK_RIGHT:/ / 处理按下右方向键时的消息处理按下右方向键时的消息 if(nArrayPosnNumChar) /if(nArrayPosnNumChar) /如果当前位置没有到缓冲区的最后位置,还能向如果当前位置没有到缓冲区的最后位置,还能向右移动右移动 nArrayPos=nA
36、rrayPos+1; CaretPos(&xCaret,&yCaret); nArrayPos=nArrayPos+1; CaretPos(&xCaret,&yCaret); else else MessageBox(hWnd,“ MessageBox(hWnd,“已经到缓冲区的末尾已经到缓冲区的末尾, ,不能再向右移动了不能再向右移动了,NULL,MB_OK);,NULL,MB_OK); break; break; break;break;case WM_PAINT: /case WM_PAINT: /处理重画消息处理重画消息 hDC=BeginPaint(hWnd,&PtStr); hDC
37、=BeginPaint(hWnd,&PtStr); TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar); / TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar); /输出缓冲区中文本输出缓冲区中文本 EndPaint(hWnd,&PtStr);EndPaint(hWnd,&PtStr); break;break;case WM_DESTROY:case WM_DESTROY:PostQuitMessage(0);PostQuitMessage(0);break;break;default:
38、return(DefWindowProc(hWnd,iMessage,wParam,lParam) ;default: return(DefWindowProc(hWnd,iMessage,wParam,lParam) ; return 0; return 0; BOOL InitWindowsClass(HINSTANCE hInstance)/BOOL InitWindowsClass(HINSTANCE hInstance)/初始化窗口类初始化窗口类 WNDCLASS WndClass;WNDCLASS WndClass;WndClass.cbClsExtra=0;WndClass.cb
39、ClsExtra=0;.WndClass.style=CS_HREDRAW|CS_VREDRAW;WndClass.style=CS_HREDRAW|CS_VREDRAW;return RegisterClass(&WndClass);return RegisterClass(&WndClass); BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)/BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)/初始化窗口初始化窗口 HWND hWnd; HWND hWnd; hWnd=CreateWin
40、dow(.); hWnd=CreateWindow(.);if(!hWnd)if(!hWnd)return FALSE;return FALSE;hWndMain=hWnd;hWndMain=hWnd;ShowWindow(hWnd,nCmdShow);ShowWindow(hWnd,nCmdShow);/显示窗口显示窗口UpdateWindow(hWnd);UpdateWindow(hWnd);/绘制用户区绘制用户区return TRUE;return TRUE; void WINAPI CaretPos(int void WINAPI CaretPos(int * *xCaret,int
41、xCaret,int * *yCaret)yCaret)/处理插字符位置的函数处理插字符位置的函数 SetCaretPos( SetCaretPos(* *xCaret,xCaret,* *yCaret); yCaret); /设置插字符位置坐标设置插字符位置坐标鼠标作为定位输入设备,通过鼠标单击、双击和拖动功能,用户可以鼠标作为定位输入设备,通过鼠标单击、双击和拖动功能,用户可以很容易地操作基于很容易地操作基于Windows图形界面的应用程序。图形界面的应用程序。代表预定义光标的常量代表预定义光标的常量光标属性描述光标属性描述IDC_ARROW箭头光标箭头光标IDC_CROSS十字光标十字光
42、标IDC_IBEAMI 形文本光标形文本光标IDC_ICON空图标空图标IDC_SIZEALL十字箭头光标十字箭头光标IDC_SIZENESW带有指向东北方和西南方箭头的光标带有指向东北方和西南方箭头的光标IDC_SIZENS带有指向北方和南方箭头的光标带有指向北方和南方箭头的光标IDC_SIZENWSE带有指向西北方和东南方箭头的光标带有指向西北方和东南方箭头的光标ISC_SIZEWE带有指向东方和西方箭头的光标带有指向东方和西方箭头的光标IDC_UPARROW垂直箭头光标垂直箭头光标IDC_WAIT计时光标计时光标(也称沙漏光标也称沙漏光标)Windows中通过光标来指示当前鼠标的位置,在
43、中通过光标来指示当前鼠标的位置,在Windows操作系统中操作系统中预定义了几种光标,并在预定义了几种光标,并在Windows.h头文件中加以定义。头文件中加以定义。6.3 鼠标在应用程序中的应用鼠标在应用程序中的应用例如,下面的语句为窗口类例如,下面的语句为窗口类wndclassWNDCLASS wndclass;wndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT);此外,还可在应用程序中调用此外,还可在应用程序中调用LoadCursor函数改变光标形式。函数改变光标形式。用户自定义光标用户自定义光标 自定义光标保存在扩展名为自定义光标保存在扩展
44、名为.cur的文件中。的文件中。 光标名光标名 CURSOR 光标文件光标文件(.cur)采用自定义光标采用自定义光标时,需在资源文时,需在资源文件中定义光标资源件中定义光标资源加载光标资源加载光标资源(常在定义窗口类时进行常在定义窗口类时进行) LoadCursor(hThisInst,lpszCursorname)当前实例句柄当前实例句柄当前光标当前光标值值含义含义MK_CONTROL按下键按上的按下键按上的 Ctrl 键键MK_LBUTTON按下了鼠标左键,等同与按下了鼠标左键,等同与 WM_LBUTTONDOWNMK_MBUTTON按下了鼠标中键,等同与按下了鼠标中键,等同与 WM_M
45、BUTTONDOWNMK_RBUTTON按下了鼠标右键,等同与按下了鼠标右键,等同与 WM_RBUTTONDOWNMK_SHIFT按下键盘上的按下键盘上的 Shift 键键鼠标鼠标消息消息lParam包含了鼠标位置包含了鼠标位置低位包含鼠标位置的低位包含鼠标位置的x坐标值坐标值高位包含鼠标位置的高位包含鼠标位置的y坐标坐标wParam包含了指示各种虚键状态的值包含了指示各种虚键状态的值相当于窗口的左上相当于窗口的左上角为原点的坐标值角为原点的坐标值对于鼠标消息对于鼠标消息的处理的处理要对要对Shift和和Ctrl键进行监测键进行监测case WM_LBUTTONDOWN: /case WM_L
46、BUTTONDOWN: /按下鼠标左键按下鼠标左键 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_LBUTTONU
47、P:case WM_LBUTTONUP:/释放鼠标左键释放鼠标左键 break; break; 不监测不监测Windows系统默认的时间间隔为系统默认的时间间隔为0.5秒,也可以调用秒,也可以调用SetDoubleClickTime()重新设定间隔值重新设定间隔值若窗口不包含上述属性的定义,即使进行了双击操作,该窗若窗口不包含上述属性的定义,即使进行了双击操作,该窗口也只能接收到两条口也只能接收到两条WM_BUTTONDOWN消息或两条消息或两条WN_BUTTONUP消息。消息。鼠标双击鼠标双击wndclass.style=CS_HEADRAW|CS_VERDRAW|CS_DBLCLKS;wn
48、dclass.style=CS_HEADRAW|CS_VERDRAW|CS_DBLCLKS;要使窗口函数能接收要使窗口函数能接收鼠标双击产生的消息鼠标双击产生的消息在注册窗口类时必须在注册窗口类时必须具有具有CS_DBLCLKS属性属性 由于鼠标移动的随机性,如果要使某一个窗口能不间断地捕由于鼠标移动的随机性,如果要使某一个窗口能不间断地捕获鼠标消息,就必须对鼠标加以捕获获鼠标消息,就必须对鼠标加以捕获SetCapture(hWnd):可以向句柄为:可以向句柄为hWnd的窗口发送所有的鼠标消息的窗口发送所有的鼠标消息调用调用SetCapture()函数函数一旦从窗口捕获了鼠标,一旦从窗口捕获了
49、鼠标,系统的键盘功能就暂时失系统的键盘功能就暂时失效,其它窗口也无法得到效,其它窗口也无法得到鼠标消息鼠标消息当该窗口不再需要捕获鼠标消息时,应及时调用当该窗口不再需要捕获鼠标消息时,应及时调用ReleaseCapture()以释以释放鼠标,否则,其他窗口无法接收鼠标信息。放鼠标,否则,其他窗口无法接收鼠标信息。菜单、滚动条菜单、滚动条工具条和标题条等处工具条和标题条等处不由应用程序处理不由应用程序处理而是送往函数而是送往函数DefWindowProc用户区以外用户区以外的地方产生的地方产生的鼠标事件的鼠标事件产生一个产生一个非用户区非用户区鼠标消息鼠标消息【例【例6-2】鼠标输入】鼠标输入示
50、范程序,本例介示范程序,本例介绍如何响应鼠标信绍如何响应鼠标信息、并改变光标形息、并改变光标形状等用法,用户在状等用法,用户在窗口的不同区域移窗口的不同区域移动鼠标时,光标将动鼠标时,光标将显示如下图所标识显示如下图所标识的不同箭头的形状的不同箭头的形状6.4 鼠标应用程序实例鼠标应用程序实例#include#include#include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(
51、 HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)lpszCmdLine,int nCmdShow) HWND hwnd; HWND hwnd;MSG Msg;MSG Msg; WNDCLASS wndclass; WNDCLASS wndclass; char lpszClassName= char lpszClassName=窗口窗口; char lpszTitle=
52、My_Windows; char lpszTitle=My_Windows; wndclass.style=0; wndclass.style=0; wndclass.lpszClassName=lpszClassName; wndclass.lpszClassName=lpszClassName; if(!RegisterClass(&wndclass) if(!RegisterClass(&wndclass) MessageBeep(0); MessageBeep(0); return FALSE; return FALSE; hwnd=CreateWindow(lpszClassName
53、,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEhwnd=CreateWindow(lpszClassName,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEB BOX,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
54、); 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; LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM LRESULT CALLBACK WndProc(HWND hwnd,
55、UINT message,WPARAM wParam,LPARAM 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_MOUSEM
56、OVE: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_SIZEN
57、S);SetCursor(hcursor); hcursor=LoadCursor(NULL,IDC_SIZENS);SetCursor(hcursor); / /南北向箭头南北向箭头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,
58、hbrush);hpen=(HPEN)GetStockObject(WHITE_PEN);hpen=(HPEN)GetStockObject(WHITE_PEN);SelectObject(hdc,hpen);SelectObject(hdc,hpen);Rectangle(hdc,5,5,tm.tmAveCharWidthRectangle(hdc,5,5,tm.tmAveCharWidth* *8,tm.tmHeight+3);8,tm.tmHeight+3);sprintf(str,%d,%d0,x,y);sprintf(str,%d,%d0,x,y);TextOut(hdc,5,5,s
59、tr,lstrlen(str);TextOut(hdc,5,5,str,lstrlen(str);EndPaint(hwnd,&ps);EndPaint(hwnd,&ps);break;break;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);Rec
60、tangle(hdc,50,50,350,350);Rectangle(hdc,50,50,350,350);MoveToEx(hdc,50,150,NULL);MoveToEx(hdc,50,150,NULL);LineTo(hdc,350,150);LineTo(hdc,350,150);MoveToEx(hdc,50,250,NULL);MoveToEx(hdc,50,250,NULL);LineTo(hdc,350,250);LineTo(hdc,350,250);MoveToEx(hdc,150,50,NULL);MoveToEx(hdc,150,50,NULL);LineTo(hd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度餐饮业SaaS运营管理软件销售合同3篇
- 2024版物流仓储中心租赁及运营管理合同
- 2025年度销售合同违约责任补充协议
- 年度回转窑式垃圾焚烧炉市场分析及竞争策略分析报告
- 二零二五版城市更新项目借款合同规范2篇
- 2024-2025学年高中历史专题七近代以来科学技术的辉煌7.2追寻生命的起源同步课时作业含解析人民版必修3
- 二零二四年仓储物流园建设项目融资合同
- 二零二五年度酒店客房安全监控服务合同3篇
- 2025年度林业生态补偿项目评估合同4篇
- 2025版茅台酒经销商培训及销售技能提升合同3篇
- GB/T 7588.2-2020电梯制造与安装安全规范第2部分:电梯部件的设计原则、计算和检验
- GB/T 14600-2009电子工业用气体氧化亚氮
- 小学道德与法治学科高级(一级)教师职称考试试题(有答案)
- 申请使用物业专项维修资金征求业主意见表
- 河北省承德市各县区乡镇行政村村庄村名居民村民委员会明细
- 实用性阅读与交流任务群设计思路与教学建议
- 应急柜检查表
- 通风设施标准
- 酒店市场营销教案
- 房屋买卖合同简单范本 房屋买卖合同简易范本
- 环保有限公司营销策划方案
评论
0/150
提交评论