码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2016-07-23 14:58:36      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

?

编写程序: 设计一个窗口, 当单击鼠标左键时, 窗口中显示"LEFT BUTTON"; 当单击鼠标右键时, 窗口中显示"RIGHT BUTTON"; 当单击向上箭头键时, 窗口中显示"UP Key"; 当单击Ctrl键时, 窗口中显示"CTRL Key"; 当单击 Ctrl+A 键时, 窗口中显示"CTRL+A Key":

程序主要代码如下:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

????int wmId, wmEvent;

????PAINTSTRUCT ps;

????HDC hDC;

????//TCHAR szHello[MAX_LOADSTRING];

????//LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

????static char cLEFT[]="LEFT BUTTON";

????static char cRIGHT[]="RIGHT BUTTON";

????static char cUp[]="UP key";

????static char cCTRL[]="CTRL key";

????static char cCTRLA[]="CTRL+A key";

????static BOOL nUpKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE,nLeftDown=FALSE,nRightDown=FALSE;

????int xOrg,yOrg;

????switch (message)

????{

????????case WM_KEYDOWN:

????????{

????????????switch(wParam)

????????????{

????????????case VK_UP:

????????????????nUpKeyDown=TRUE;

????????????????break;

????????????case VK_CONTROL:

????????????????nCtrlKeyDown=TRUE;

????????????????break;

????????????

????????????default:

????????????????break;

????????????}

????????}

????????????break;

?

????????case WM_KEYUP:

????????????InvalidateRect(hWnd,NULL,TRUE);????//刷新用户区。

????????????break;

????????case WM_CHAR:

????????????{

????????????????????if(wParam==(65&VK_CONTROL))????

????????????????????{

????????????????????????if(nCtrlKeyDown == TRUE)

????????????????????????{

????????????????????????????nCtrlAKeyDown = TRUE;

????????????????????????????nCtrlKeyDown = FALSE;

????????????????????????}

????????????????????}

????????????????????

????????????????}

????????????????break;

????????case WM_LBUTTONDOWN:

????????????nLeftDown=TRUE;

????????????InvalidateRect(hWnd,NULL,TRUE);????//刷新用户区。

????????????break;

????????case WM_RBUTTONDOWN:

????????????nRightDown=TRUE;

????????????InvalidateRect(hWnd,NULL,TRUE);????//刷新用户区。

????????????break;

?

????????case WM_COMMAND:

????????????wmId = LOWORD(wParam);

????????????wmEvent = HIWORD(wParam);

????????????// Parse the menu selections:

????????????switch (wmId)

????????????{

????????????????case IDM_ABOUT:

???????????????? DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);

???????????????? break;

????????????????case IDM_EXIT:

???????????????? DestroyWindow(hWnd);

???????????????? break;

????????????????default:

???????????????? return DefWindowProc(hWnd, message, wParam, lParam);

????????????}

????????????break;

????????case WM_PAINT:

????????????hDC = BeginPaint(hWnd, &ps);

????????????// TODO: Add any drawing code here...

????????????RECT rt;

????????????GetClientRect(hWnd, &rt);

????????????xOrg=(rt.left+rt.right)/2;

????????????yOrg=(rt.top +rt.bottom)/2;

????????????if(nUpKeyDown == TRUE)

????????????{

????????????????TextOut(hDC,xOrg,yOrg,cUp,strlen(cUp));

????????????????nUpKeyDown = FALSE;

(续前表)

}

????????????else if(nCtrlAKeyDown == TRUE)

????????????{

????????????????TextOut(hDC,xOrg,yOrg,cCTRLA,strlen(cCTRLA));

????????????????nCtrlAKeyDown = FALSE;

????????????????nCtrlKeyDown = FALSE;

????????????}

????????????else if(nCtrlKeyDown == TRUE&&nCtrlAKeyDown == FALSE)

????????????{

????????????????TextOut(hDC,xOrg,yOrg,cCTRL,strlen(cCTRL));

????????????????nCtrlKeyDown = FALSE;

????????????}

????????????else if(nLeftDown == TRUE)

????????????{

????????????????TextOut(hDC,xOrg,yOrg,cLEFT,strlen(cLEFT));

????????????????nLeftDown = FALSE;

????????????}

????????????else if(nRightDown == TRUE)

????????????{

????????????????TextOut(hDC,xOrg,yOrg,cRIGHT,strlen(cRIGHT));

????????????????nRightDown = FALSE;

????????????}

???? ?

????????????//DrawText(hdc, lpString, _tcsclen(lpString), &rt, DT_CENTER);

????????????EndPaint(hWnd, &ps);

????????????break;

????????case WM_DESTROY:

????????????PostQuitMessage(0);

????????????break;

????????default:

????????????return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

?

编译并调试程序

程序运行结果运行结果如下图:

技术分享

单击鼠标左键

技术分享

单击鼠标右键

技术分享

单击向上箭头

技术分享

单击Ctrl键

技术分享

单击Ctrl+A

刚开始刷新客户区时使用

InvalidateRect(hWnd,NULL,FALSE);

结果导致背景客户区背景不更新,输出的文本重叠,了解了InvalidateRect()的使用方式后,将语句改为

InvalidateRect(hWnd,NULL,TRUE);

即成功解决了问题;

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

标签:

原文地址:http://www.cnblogs.com/leftshine/p/5698617.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!