如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
VC++程序设计第4讲—MFC消息映射2004/9/284.1消息分类4.1.1消息结构定义•Win32消息结构消息结构定义typedefstructtagMSG{HWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;}MSG;4.1消息分类4.1.1消息结构定义•Win32消息结构消息结构说明hwnd—接收消息的窗口句柄message—消息IDwParam—消息的附加信息lParam—消息的附加信息time—提交消息的时间pt—提交消息时光标在屏幕上的位置14.1消息分类4.1.2消息分类•窗口消息窗口消息在创建窗口、绘制窗口、移动窗口、销毁窗口时产生窗口消息的一般形式为WM_XXX,例如•WM_CREATE—创建窗口后发出的消息•WM_PAINT—通知窗口绘制自身•WM_LBUTTONDOWN—鼠标左键按下•WM_CLOSE—窗口关闭4.1消息分类4.1.2消息分类•窗口消息窗口消息用到的消息结构中的字段messagewParamlParamWM_XXX由message决定由message决定窗口消息只能被窗口或窗口对应的对象处理,MFC中的CWnd、CView和CMainFrame及其子类可以处理窗口消息窗口消息的产生途径•用户与窗口交互•系统产生的窗口消息4.1消息分类4.1.2消息分类•命令消息命令消息在用户执行命令(点击菜单)时产生消息格式messagewParamlParamWM_COMMAND低16位为命令ID0L高16位为024.1消息分类4.1.2消息分类•命令消息消息产生途径•选择菜单项•单击工具栏按钮•按加速键•程序产生命令4.1消息分类4.1.2消息分类•命令消息相关宏定义•HIWORD(wParam)—取wParam的高16位•LOWORD(wParam)—取wParam的低16位•MAKELPARAM(wLow,wHigh)—生成lParam•MAKEWPARAM(wLow,wHigh)—生成wParam•模拟发送打开文件命令(ID_FILE_OPEN)::SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(ID_FILE_OPEN,0),0L)4.1消息分类4.1.2消息分类•控件消息控件消息在控件窗口状态改变时产生消息格式•仿窗口消息格式messagewParamlParamWM_XXX由message决定由message决定–WM_CTLCOLOR通知父窗口改变控件的颜色(可以用来改变控件的颜色)–WM_HSCROLL或WM_VSCROLL改变控件的水平或垂直滚动条34.1消息分类4.1.2消息分类•控件消息消息格式•仿命令消息格式messagewParamlParamWM_COMMAND低16位为控件ID控件窗口句柄高16位为消息通知码–对于编辑框(ID_EDIT_NAME)的文本改变消息:LOWORD(wParam)为ID_EDIT_NAME–HIWORD(wParam)为EN_CHANGE4.1消息分类4.1.2消息分类•控件消息消息格式•通知消息格式(用于扩展的控件)messagewParamlParamWM_NOTIFY控件ID指向NMHDR的指针–typedefstructtagNMHDR{HWNDhwndFrom;//发送消息的控件窗口句柄UINTidFrom;//发送消息的控件IDUINTcode;//控件消息的通知码}NMHDR;4.2MFC消息映射原理4.2.1剖析CWinThread::Run()函数•CWinThread::Run()函数源代码及相关函数说明4CWinThread::Run(){//捕获并派送消息直到收到WM_QUIT消息for(;;){//phase1:检查是否空闲状态,是则做空闲循环while(bIdle&&!::PeekMessage(&m_msgCur,…,PM_NOREMOVE)){if(!OnIdle(lIdleCount++))消息循环bIdle=FALSE;}//phase2:接收到消息,派送消息do{//派送消息,如果是WM_QUIT退出if(!PumpMessage())returnExitInstance();//…}while(::PeekMessage(&m_