欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    使用MFC消息机制.ppt

    • 资源ID:4951895       资源大小:267.49KB        全文页数:21页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    使用MFC消息机制.ppt

    第二章 使用MFC消息机制,学习目标,MFC的六大关键技术,MFC的六大关键技术,是六大黑箱技术。使开发者只要做简单的局部修改,即可处理大部分窗口事物。其他复杂处理过程被完美的封装起来,这样的技术使程序员不需要懂太多,即可进行窗口软件的开发。具体的MFC的六大技术,包括:(1)MFC程序的初始化过程:建立一个最简单的MFC程序只用两步。从CWinApp派生一个应用程序类(CMyApp),然后建立对象(theApp)。之后整个程序的编写,就只需要改写一个InitInstance()函数。(2)运行时类型识别(RTTI)运行时类型识别(RTTI)即是程序执行过程中知道某个对象属于某个类,参见CRuntimeClass类。(3)动态创建:动态创建就是运行时创建指定类的对象,而创建的对象在MFC内部能够被动态识别。在MFC中大量使用。如框架窗口对象、视对象,还有文档对象等等。参见CFrameWnd,CView和CDocument等类,按F12查阅相关的宏定义,例如:DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE。,使用AppWizard,(4)永久保存(串行化):MFC的连续存储(serialize)机制俗称串行化,参见CDocument类。网上流传“弄懂它以后,你就越来越像个程序员了!”。MFC刚发布的开始阶段,好多软件开发者都将文件存储方式,改到了串行化的模式上去。实际上,串行化存储模式也有一定的局限性,因此目前也有很多软件又脱离开串行化,使用自定义的文件存储模式。(5)消息映射:消息映射机制,就是将窗口消息与窗口类函数地址进行对应。当消息发生时,自动调用该类对应的类成员函数的机制。参见BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP宏定义(6)命令传递:命令传递机制,主要处理WM_COMMAND消息在不同窗口之间的传递。例如,主窗口接收消息后传递给相应的子窗口。最常用于CMainFrame类的OnCmdMsg函数。参见 CCmdTarget:OnCmdMsg函数,,MFC系统消息分类,一般程序员在做2-3年的VC开发后,会自动进入阅读MFC源代码以及剖析以上VC内部技术。但是对于初学者我们建议,应该重点放在使用MFC提供的关键技术。Windows提供了大量的窗口消息,开发者可以在对应的消息函数下,编写代码来修饰窗口的属性。常用的窗口消息如下:(1)键盘消息:WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP和WM_CHAR等(2)鼠标消息:左:WM_LBUTTONDOWN、WM_LBUTTONUP和WM_LBUTTONDBLCLK中:WM_MBUTTONDOWN、WM_MBUTTONUP和WM_MBUTTONDBLCLK 右:WM_RBUTTONDOWN、WM_RBUTTONUP和WM_RBUTTONDBLCLK(3)窗口创建和摧毁:普通窗口:WM_CREATE、WM_DESTROY和WM_CLOSEMDI窗口:WM_MDICREATE、WM_MDIDESTROY对话框:WM_INITDIALOG,MFC系统消息分类,(4)客户区消息:WM_PAINT、WM_ERASEBKGND、WM_CTLCOLOR、WM_CTLCOLORBTN和WM_SIZE等(5)非客户区消息:WM_NCPAINT、WM_NCCREATE和WM_NCLBUTTONDOWN等(6)事件消息:WM_COMMAND、WM_SYSCOMMAND、WM_TIMER和WM_HOTKEY等,使用MFC系统消息,建立一个基于对话框的MFC工程,按ALT+W打开ClassWizard。在Messages消息列表中选择WM_LBUTTONDOWN双击。在下面生成OnLButtonDown函数处双击。,编辑消息映射函数,查看ClassWizard生成的消息函数代码除了生成OnLButtonDown成员函数外,在BEGIN_MESSAGE_MAP下面还生成了映射宏。按F12查看ON_WM_LBUTTONDOWN的定义,了解该宏建立的关联。#define ON_WM_LBUTTONDOWN()WM_LBUTTONDOWN,0,0,0,AfxSig_vwp,(AFX_PMSG)(AFX_PMSGW)(void(AFX_MSG_CALL CWnd:*)(UINT,CPoint)删除消息映射函数打开ClassWizard选择OnLButtonDown成员函数,再点删除函数按钮。查看删除消息函数后的代码,消息映射宏和头文件中的函数声明已经被删除,一般ClassWizard会保留函数体中的代码,以备开发者保存。,关闭时的系统消息,点击标题栏上的关闭按钮,或者系统菜单中的关闭菜单时,系统内会触发多种与关闭有关的系统消息。例如:WM_SYSCOMMAND:该消息不只支持处理关闭消息,而且支持最大化、最小化、移动、拉伸以及系统菜单等多种消息。在对应的消息函数中参数nID代表系统消息的种类,例如:SC_CLOSE,SC_MINIMIZE等。参见CWnd:OnSysCommand函数。WM_CLOSE:相当于WM_SYSCOMMAND关于SC_CLOSE类型的专用处理。WM_DESTROY:通用于任何窗口在摧毁时发出的消息。WM_NCDESTROY:通用于窗口在摧毁时,发出的最后一个消息。在对话框窗口中,在WM_CLOSE消息之后还会发出WM_COMMAND消息,调用OnCancel函数。但是在点击取消按钮(IDCANCEL)后,并不会发出WM_SYSCOMMAND消息和WM_CLOSE消息。,建立自定义消息,从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF应用程序消息从 WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFFFF,范围内的消息由应用程序自己使用;在MFC窗口类中定义消息成员函数:函数的格式:LRESULT MsgProc(WPARAM wParam,LPARAM lParam)定义消息映射宏:在BEGIN_MESSAGE_MAP下面加入ON_MESSAGE(WM_USER+1,MsgProc)在其他函数中发送自定义消息:SendMessage(WM_USER+1,3,9);或者PostMessage(WM_USER+1,22,11);在MsgProc消息函数中设置断点,运行并调试:查看是否接收到该消息,SendMessage和PostMessage,、首先是返回值意义的区别,我们先看一下 MSDN 里的声明:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);WBOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);其中 4 个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是 Post 成功。、PostMessage 是异步的,SendMessage 是同步的。PostMessage 只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage 等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。、如果在同一个线程内,SendMessage 发送消息时,由 USER32.DLL 模块调用目标窗口的消息处理程序,并将结果返回。SendMessage 在同一线程中发送消息并不入线程消息队列。PostMessage 发送消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。,SendMessage和PostMessage,如果在不同线程内,SendMessage 发送消息到目标窗口所属线程的消息队列,然后发送消息的线程在 USER32.DLL 模块内监视和等待消息处理,直到目标窗口处理完返回。SendMessage 在返回前还做了很多工作,比如,响应别的线程向它 SendMessage。Post 到别的线程时,最好用 PostThreadMessage 代替 PostMessage,PostMessage 的 hWnd 参数可以是 NULL,等效于 PostThreadMessage+GetCurrentThreadId。Post WM_QUIT 时,应使用 PostQuitMessage 代替。、系统只整编(marshal)系统消息(0 到 WM_USER 之间的消息),发送用户消息(WM_USER 以上)到别的进程时,需要自己做整编。用 PostMessage、SendNotifyMessage、SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。、在 Windows 2000/XP 里,每个消息队列最多只能存放 10,000 个 Post 的消息,超过的还没被处理的将不会被处理,直接丢掉。这个值可以改得更大:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWindows USERPostMessageLimit,最小可以是 4000。,建立一个简单的Win32工程,使用AppWizard建立基于Win32的应用程序,建立一个简单的Win32工程,选择第2项A simple Win32 application.,编辑Win32项目资源,生成的代码只有一个空的WinMain函数:在Workspace中只有ClassView和FileView,没有ResourceView。也就说明目前的工程中没有任何资源。为了生成基于对话框的Windows应用程序,我们需要在工程中添加一个资源文件从主菜单中选择File-New,打开新建文件向导。选择Resource Script,并在Add to project上打钩。填入与工程相同的名字,例如Test,再按确定。在Workspace中出现了ResouceView的选项卡页面。点关闭按钮,关闭编辑器中的Test.rc,以便在Resource View中编辑。如果Test.rc处于打开状态,点击ResourceView中的资源会提示“This file is open in a editor.”以及“Load Failed”等错误。按Ctrl+1添加对话框资源IDD_DIALOG1,按Ctrl+1,2,3,4。一直到Ctrl+9分别代表插入不同的资源。包括菜单,图标,光标,字符串表以及版本信息等。,编辑Win32项目资源,编辑Win32代码了解消息,编辑WinMain函数加入一行代码:DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,NULL);补充头文件:#include“resource.h”。编译后运行执行文件,查看结果发现出现的对话框,不能关闭。也就是不能响应关闭的消息。甚至只能通过Windows任务管理器,来强制结束Win32.exe打开MSDN,查看DialogBox函数,第4个参数需要一个回调函数地址编辑DialogProc函数INT CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)return 0;修改WinMain函数,指定DialogBox的回调函数DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);,编写代码响应Win32消息,修改Dialog函数,加入相应命令消息的代码,编译后运行。switch(uMsg)case WM_COMMAND:switch(wParam)case IDCANCEL:case IDOK:EndDialog(hwndDlg,wParam);break;break;return 0;运行结果可以关闭,对话框响应了关闭的消息处理。,Windows编程中的句柄,在上面的代码中,我们看到了这样的类型定义HINSTANCE执行实体(程序自身)句柄 HWND窗口句柄 句柄实际上就是 结构体指针(参见教材第2章 理解句柄)但是系统不允许你直接访问该结构体成员 所以称其为“句柄”,只应该用专门的处理函数取操作该句柄,而不应该直接访问结构体成员 回忆一下C标准库中的文件操作,fopen的返回值是什么?是一个FILE指针,而FILE是一个结构体。平时我们按照规定用文件处理函数来操作该FILE指针,但是C语法没有阻止我们直接访问FILE结构体,所以有可能会被程序员弄乱数据。此时,也不是没有解决办法,既在每个文件处理函数中检查参数,但这样严重影响工作效率,且造成代码重复,增加维护成本例如:我们可以假设HWND的结构体为struct HWND BOOL bVisible,int x,int y,int cx,int cy;那么,MoveWindow改变的就是其中的x,y,cx,cy字段。而ShowWindow就是改变bVisible字段等等。,本章作业,练习:(不提交)在MFC的工程中,使用ClassWizard中,给主对话框添加所有消息映射函数。设置断点测试该消息在什么条件下被你设置的断点截获,函数体上注释该消息的中文翻译。例如:/当鼠标光标移动时调用该消息void CTest1Dlg:OnMouseMove(UINT nFlags,CPoint point)。作业:(提交)1、在MFC工程中,根据WM_SYSCOMMAND或者WM_CLOSE消息,编写代码实现当点击关闭按钮时,最小化窗口或者隐藏窗口。参考函数:CWnd:ShowWindow2、在基于对话框的Win32工程中,编辑资源管理器。加入图标和关于对话框,根据WM_INITDIALOG消息:在对话框初始化时校正对话框的位置(CenterWindow)给对话框设置系统图标(LoadIcon,SetIcon)和关于系统菜单(GetSystemMenu,AppendMenu)3、建立一个简单的Win32对话框工程,加入3个Edit控件,做一个简单数字计算(GetDlgItemInt或GetDlgItemText,SetDlgItemInt),阅读测试MSDN函数资料,MSDN相当于一个大的辞海,如果把程序员比做一个作家,就要有丰富的词汇量。这个词汇量就是我们了解的函数资料,不是一定要背熟每个函数及参数,而只要了解函数的功能,便于在以后的开发中用得上。本章可以阅读CWnd类库函数,其中主要分为两大段。一、窗口操作函数:Initialization Window State Functions Window Size and Position Window Access Functions Update/Painting Functions。二、窗口消息:Message Handlers窗口类是MFC的基本类,几乎每个窗口操作函数,在以后的软件开发中都可能用得到。但本章重点阅读第二部分各种消息函数,可以加强对消息机制的理解。,

    注意事项

    本文(使用MFC消息机制.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开