




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
windows sdk编程系列文章 - 处理键盘输入消息2008-04-08 20:22在本课中,我们将要学习WINDOWS程序是如何处理键盘消息的。理论: 因为大多数的PC只有一个键盘,所以所有运行中的WINDOWS程序必须共用它。WINDOWS 将负责把击键消息送到具有输入焦点的那个应用程序中去。尽管屏幕上可能同时有几个应用程序窗口,但一个时刻仅有一个窗口有输入焦点。有输入焦点的那个应用程序的标题条总是高亮度显示的。 实际上您可以从两个角度来看键盘消息:一是您可以把它看成是一大堆的按键消息的集合,在这种情况下,当您按下一个键时,WINDOWS就会发送一个WM_KEYDOWN给有输入焦点的那个应用程序,提醒它有一个键被按下。当您释放键时,WINDOWS又会发送一个WM_KYEUP消息,告诉有一个键被释放。您把每一个键当成是一个按钮;另一种情况是:您可以把键盘看成是字符输入设备。当您按下“a”键时,WINDOWS发送一个WM_CHAR消息给有输入焦点的应用程序,告诉它“a”键被按下。实际上WINDOWS 内部发送WM_KEYDOWN和WWM_KEYUP消息给有输入焦点的应用程序,而这些消息将通过调用TranslateMessage翻译成WM_CHAR消息。WINDOWS窗口过程函数将决定是否处理所收到的消息,一般说来您不大会去处理WM_KEYDOWN、WM_KEYUP消息,在消息循环中TranslateMessage函数会把上述消息转换成WM_CHAR消息。在我们的课程中将只处理WM_CHAR。例子: (见光盘FirstWindow4)#include Windows.h#include tchar.hHWND hWinMain;TCHAR szClassName = _T(MyClass);TCHAR szCaptionMain = _T(My First Window!);TCHAR FontName = _T(script);WNDCLASSEX stdWndClass;WPARAM keyChar = 0x20; /0x20是空格的ascii码,保证没有按键的时候程序正常显示。LRESULT CALLBACK ProcWinMain( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) PAINTSTRUCT stPs; HDC hDC; HFONT hFont,hOldFont; switch(Msg) case WM_PAINT: hDC = BeginPaint(hWnd,&stPs); hFont = CreateFont(24,16,0,0,400,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SCRIPT,FontName); hOldFont = (HFONT)SelectObject(hDC,hFont); SetTextColor(hDC,RGB(200,200,50); SetBkColor(hDC,RGB(0,0,255); TextOut(hDC,0,0,(char *)&keyChar,1); SelectObject(hDC,hOldFont); EndPaint(hWnd,&stPs); break; case WM_CHAR: keyChar = wParam; InvalidateRect(hWnd,NULL,TRUE); break; case WM_DESTROY: PostQuitMessage(NULL); break; default: return DefWindowProc(hWnd, Msg, wParam, lParam ); return 0;int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) MSG stMsg; WNDCLASSEX stdWndClass; RtlZeroMemory(&stdWndClass, sizeof(stdWndClass); stdWndClass.hCursor = LoadCursor(0,IDC_ARROW); stdWndClass.cbSize = sizeof(stdWndClass); stdWndClass.style = CS_HREDRAW|CS_VREDRAW; stdWndClass.lpfnWndProc = ProcWinMain; stdWndClass.hbrBackground = (HBRUSH)COLOR_WINDOW; stdWndClass.lpszClassName = szClassName; stdWndClass.hInstance = hInstance; RegisterClassEx(&stdWndClass); hWinMain = CreateWindowEx(WS_EX_CLIENTEDGE,szClassName,szCaptionMain, WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,NULL,hInstance,NULL); if(!hWinMain) return 0; ShowWindow(hWinMain,SW_SHOWNORMAL); UpdateWindow(hWinMain); while(GetMessage(&stMsg,NULL,0,0) TranslateMessage(&stMsg); DispatchMessage(&stMsg); return stMsg.wParam;分析: WPARAM keyChar = 0x20; 这个变量将保存从键盘接收到的字符。因为它是在窗口过程中通过WPARAM型变量传送的,所以我们简单地把它定义为WPARAM型。由于我们的窗口在初次刷新时(也即刚被创建的那一次)是没有键盘输入的所以我们把他设成空格符(20h),这样显示时您就什么都看不见。 case WM_CHAR: keyChar = wParam; InvalidateRect(hWnd,NULL,TRUE); 这一段是用来处理WM_CHAR消息的。它把接收到的字符放入变量keyChar 中,接着调用InvalidateRect,而InvalidateRect使得窗口的客户区无效,这样它会发出WM_PAINT消息,而WM_PAINT消息迫使WINDOWS重新绘制它的客户区。该函数的语法如下:BOOL InvalidateRect( HWND hWnd, / handle to window CONST RECT* lpRect, / rectangle coordinates BOOL bErase / erase state );lpRect是指向客户区我们想要其无效的一个正方形结构体的指针。如果该值等于NULL,则整个客户区都无效;布尔值bErase告诉WINDOWS是否擦除背景,如果是TRUE,则WINDOWS在调用BeginPaint函数时把背景擦掉。 所以我们此处的做法是:我们将保存所有有关重绘客户区的数据,然后发送WM_PAINT消息,处理该消息的程序段然后根据相关数据重新绘制客户区。尽管这么做事有点像走了弯路,但WINDOWS要处理那么庞大的消息群,没有一定的规矩可不行。 实际上我们完全可以通过调用GetDC 获得设备上下文句柄,然后绘制字符,然后再调用ReleaseDC释放设备上下文句柄,毫无疑问这样也能在客户区绘制出正确的字符。但是如果这之后接收到WM_PAINT消息要处理时,客户区会重新刷新,而我们这稍前所绘制的字符就会消失掉。所以为了让字符一直正确地显示,就必须把它们放到WM_PAINT的处理过程中处理。而在本消息处理中发送WM_PAINT消息即可。 TextOut(hDC,0,0,(char *)&keyChar,1);在调用InvalidateRect时,WM_PAINT消息被发送到了WINDOWS窗口处理过程,程序流程转移到处理W
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025合同违约责任的新变化与特点
- 2024年2月化粪池作业现场卫生防护距离测量协议
- 2025年滤紫外石英玻璃灯管项目建议书
- 幼儿园课程评价的科学化探索计划
- 绿色水利工程建设实践计划
- 降低成本的创新思路计划
- 2024年7月招生代理协议中的多世界诠释法律声明
- 加强市场竞争力的工作策略计划
- 班主任角色定位与工作方法计划
- 社交媒体学校社交媒体社团计划
- 重症医学科诊疗常规
- 黑龙江省哈尔滨市香坊区2022年中考一模化学试题含解析
- 外贸业务员面试试卷
- 老年病老年综合征及老年综合评估培训课件
- DB14T 1925-2019 流通领域供应链标准体系
- GB∕T 23293-2021 氮化物结合耐火制品及其配套耐火泥浆
- 东北财经大学《服务礼仪X》综合作业答卷
- 四川大学-刘龙飞-毕业答辩PPT模板
- 5关于进一步规范建设工程质量检测服务收费的通知湘价服2009186号
- 致橡树朗诵ppt(1) 2
- 交通安全设施摆放图
评论
0/150
提交评论