曲靖师范学院物电学院电子设计创新实验室WENCE程序开发教学第三讲主讲:夏文智内容匈牙利命名法窗体的概念WindowsCE的消息机制对HelloWord程序进行修定匈牙利命名法匈牙利命名法窗体/窗口窗口:就是屏幕上的一个矩形区域作用:1、应用程序通过它和用户进行信息交互2、是Windows应用程序的基本操作单元3、也是应用程序和用户之间的接口环境4、更是系统管理应用程序的基本单位消息机制消息机制Windows操作系统为每个线程维持一个消息队列,当事件产生时,操作系统感知这一事件的发生,并包装成消息发送到消息队列,应用程序通过GetMessage()函数取得消息并存于一个消息结构体中,然后通过一个TranslateMessage()和DispatchMessage()解释和分发消息,下面的代码描述了Windows的消息循环。while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}消息机制TranslateMessage(&msg)对于大多数消息而言不起作用,但是有些消息,比如键盘按键按下和弹起(分别对于KeyDown和KeyUp消息),却需要通过它解释,产生一个WM_CHAR消息。DispatchMessage(&msg)负责把消息分发到消息结构体中对应的窗口,交由窗口过程函数处理。GetMessage()在取得WM_QUIT之前的返回值都为TRUE,也就是说只有获取到WM_QUIT消息才返回FALSE,才能跳出消息循环。消息机制取得的消息将交由窗口处理函数进行处理,对于每个窗口类Windows为我们预备了一个默认的窗口过程处理函数DefWindowProc(),这样做的好处是,我们可以着眼于我们感兴趣的消息,把其他不感兴趣的消息传递给默认窗口过程函数进行处理。每一个窗口类都有一个窗口过程函数,此函数是一个回调函数,它是由Windows操作系统负责调用的,而应用程序本身不能调用它。以switch语句开始,对于每条感兴趣的消息都以一个case引出。消息机制LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){…switch(uMsgId){caseWM_TIMER://对WM_TIMER定时器消息的处理过程return0;caseWM_LBUTTONDOWN://对鼠标左键单击消息的处理过程reurn0;.…default:returnDefWindowProc(hwnd,uMsgId,wParam,lParam);}}消息机制对于每条已经处理过的消息都必须返回0,否则消息将不停的重试下去;对于不感兴趣的消息,交给DefWindowProc()函数进行处理,并需要返回其处理值。对HelloWord程序进行修定LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){PAINTSTRUCTps;HDChdc;RECTrect;GetClientRect(hwnd,&rect);if(message==WM_DESTROY){PostQuitMessage(1);}if(message==WM_PAINT){hdc=BeginPaint(hwnd,&ps);DrawText(hdc,TEXT(GoodGoodStudy!DayDayUp!),-1,&rect,DT_VCENTER|DT_CENTER);EndPaint(hwnd,&ps);}returnDefWindowProc(hwnd,message,wParam,lParam);}修订1LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){PAINTSTRUCTps;HDChdc;RECTrect;switch(message){caseWM_DESTROY:PostQuitMessage(1);break;caseWM_PAINT:GetClientRect(hwnd,&rect);hdc=BeginPaint(hwnd,&ps);DrawText(hdc,TEXT(GoodGoodStudy!DayDayUp!),-1,&rect,DT_VCENTER|DT_CENTER);EndPaint(hwnd,&ps);default:returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}修订2LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_DESTROY:OnDestroy(hwnd,message,wParam,lParam);break;caseWM_PAINT:OnPaint(hwnd,message,wParam,lParam);break;default:returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}头文件为了符合API编程规范,须有函数申明OnDestroy(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam);OnPaint(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam);修订3LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){for(inti=0;idim(MainMsgCod);i++){if(MainMsgCod[i].message==message)(*MainMsgCod[i].fun)(hwnd,message,wParam,lParam);}returnDefWindowProc(hwnd,message,wParam,lParam);}头文件修改内容在头文件中定义结构体structDecodeUnit{UINTmessage;LONG(*fun)(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam);}#definedim(x)(sizeof(x)/sizeof(x[0]))同时在C文件开始的地方定义对应消息的该结构体型数组structDecodeUnitMainMsgCod[]={WM_DESTROY,OnDestroy,WM_PAINT,OnPaint,};