消息映射及MFC入门

上传人:jin****ng 文档编号:177084603 上传时间:2022-12-25 格式:DOCX 页数:10 大小:184.04KB
收藏 版权申诉 举报 下载
消息映射及MFC入门_第1页
第1页 / 共10页
消息映射及MFC入门_第2页
第2页 / 共10页
消息映射及MFC入门_第3页
第3页 / 共10页
资源描述:

《消息映射及MFC入门》由会员分享,可在线阅读,更多相关《消息映射及MFC入门(10页珍藏版)》请在装配图网上搜索。

1、MFC消息映射及MFC入门一、MFC消息映射机制在前面Win32Class工程中,我们进行了 Win32环境下的“消息映射”其实,通过前面 的过程,我们已经不知不觉的接触到了 MFC消息映射的核心。MFC环境下的消息映射,其原理和我们讲解过的Win32下的消息映射是类似的。简单 地讲,就是让程序员指定要某个MFC类(有消息处理能力的类)处理某个消息。MFC提供 了工具ClassWizard来帮助实现消息映射,在处理消息的类中添加一些有关消息映射的内容 和处理消息的成员函数。程序员负责编写消息处理函数的代码,实现所希望的功能。可以通过如下的3个重要的宏来实现MFC消息映射,这些宏功能强大,其实现

2、相对也 比较复杂。这里只要求我们会用就可以。稍后我们会用其实际代码替换这些宏,就能理解了。 DECLARE_MESSAGE_MAP :初始化消息映射表,实际上是给所在类添加几个用 于消息处理的静态成员变量和静态或虚拟函数。 BEGIN_MESSAE_MAP:开始消息映射。 END_MESSAE_MAP :结束消息映射。其他常见的、用于实现MFC消息的宏还有: 前缀为“ON_WM_”的宏:用于 Windows消息的宏(不带参数)如:ON_WM_PAINT() 把消息WM_PAINT映射到OnPaint函数。 ON_COMMAND宏:通过参数指定命令ID和消息处理函数。女口 ON_COMMAND(

3、ID_EDIT_PASTE, OnEditPaste),其中第二个参数 OnEditPaste 的原型说明为: void CView:OnEditPaste()。 ON_UPDATE_COMMAND_UI宏:用于更新菜单的状态。 前缀为”ON_”控件通知消息宏:这类宏可能带有三个参数,如ON_CONTROL,就 需要指定控制窗口 ID,通知码和消息处理函数;也可能带有两个参数,如具体处 理 特 定 通 知 消 息 的 宏 ON_BN_CLICKED 、 ON_LBN_DBLCLK 、 ON_CBN_EDITCHANGE等,需要指定控制窗口 ID和消息处理函数。 实现用户自定义消息的 ON_ME

4、SSAGE 宏:ON_MESSAGE(message, memberFxn)。 第一个参数为消息号,第二个参数为消息处理函数。二、手工进行消息映射上面是使用类向导工具自动进行的消息映射,下面我们通过手工的方式来实现同样的功 能,以加深对消息映射的理解。手工映射的主要步骤是: 在.h头文件中:声明消息响应函数、声明消息映射。如:afx_msg void OnPaint();/声明消息响应函数DECLARE_MESSAGE_MAP()/声明消息映射 在.cpp文件中:进行消息映射。如:BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd) /消息映射开始 ON_WM_PAINT()

5、/WM_PAINT 消息映射宏END_MESSAGE_MAP()/结束消息映射详见下例 (工程 1Win32MFC):使用VC6.0建立一个Win32应用程序空工程Win32MFC,按Alt + F7调出工程设置界面,或者点击菜单-Project-Settings-General-Microsoft Foundation Classes-选择 UseMFC in a Shared DLL,使该工程支持MFC类库。Win32MFCDebug | C/C+ | Link | Resources M匚叵Reseticrosoft Foundation Classes:Use MFC in a Sha

6、red DLLOutput directoriesIntermediate files:Output files:如果使用VS2008,贝I还需要另外进行如下的设置:将项目属性9链接器9高级9入口点的值设置为 WinMainCRTStartup配置:活动(Jebug)test8屋性页配置管理器(Q).:田:日蠶蠶C/C+I件文规A单试统化常输渚调丟忧中+中+中+由Tinlai nCRTS t ar tup 二二,入口点无A 口点_设置校验和否基址随机基址启用映像随机化(/BYNAMICBASE)固定基址默认值数据执行保护(EEF)映像与 BEF 兼(/NXC0MFAT)关闭程序集生成否延迟加载

7、的DLL不支持卸载导入库合并医目标计算机 achineX86 (/BACHIffE:X86)探查否cm线程厘性无线程厘性集C应图像类型默认图像类型密钥文件密钥容器延迟签名否错泯报告立即提示(/EEEORKEFORT: FRDMFT)cm非托管代码检查否平台():活动Win32)入口点设置 exe文件或ELI的起始地址(/ENTRY : symbol)取消应用然后添加如下2个文件:(其中用到了 MFC中的CWinApp和CFrameWnd类,后面会 讲,这里只是为了理解消息映射,先不用理会这2个类)头文件:/Win32MFC.h#include class CMyApp : public CWi

8、nApppublic:virtual BOOL InitInstance();class CMyWnd : public CFrameWndpublic:CMyWnd();protected:afx_msg void OnPaint(); /手工声明消息响应函数DECLARE_MESSAGE_MAP() /手工声明消息映射;实现文件:/Win32MFC.cpp#include Win32MFC.hCMyApp theApp;BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)/消息映射开始ON_WM_PAINT()/WM_PAINT 消息映射宏END_MESSAGE_MAP(

9、)/结束消息映射BOOL CMyApp:InitInstance()m_pMainWnd = new CMyWnd;m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow();return TRUE;CMyWnd:CMyWnd()Create(NULL, Win32 MFC Application);/手工定义消息响应函数OnPaintO,并添加函数处理代码void CMyWnd:OnPaint()CPaintDC dc(this);CRect rect;GetClientRect(&rect);dc.DrawText(大地震,海啸

10、一天灾;核危机,利比亚战火一人祸,-1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);编译运行。以上就是最简单的MFC工程,我们即将学习的MFC单文档工程和对话框工程等都是 在这种简单MFC的基础上扩展而来的。三、翻译 DECLARE_MESSAGE_MAP()等宏,发现和我们前面讲过的 Win32Class 几乎是一样的。见工程“ 2Win32MFC_翻译宏”四、第一个MFC程序1、建立一个SDI程序“ 3SDI”2、介绍SDI程序中的App类,Frame类,View类,Doc类,以及他们之间的相互关系。3、WinMain咋不见了?简单的跟踪

11、执行,理解SDI执行过程。4、在 View 类的 OnDraw 中输出Hello world!”5、事件、消息、虚函数afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);ON_WM_CREATE()afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlag); ON_WM_KEYDOWN()afx_msg void OnLButtonDown(UINT nFlags, CPoint point);ON_WM_LBUTTONDOWN()ON_COMMAND(ID_FILE_NEW,CW

12、inApp:OnFileNew) /staticafx_msg void OnAppAbout();ON_COMMAND(ID_APP_ABOUT, OnAppAbout)virtual BOOL PreCreateWindow(CREATESTRUCT& cs);virtual void OnDraw(CDC* pDC); / overridden to draw this viewafx_msg BOOL OnEraseBkgnd(CDC* pDC);ON_WM_ERASEBKGND()BOOL CSDIView:OnEraseBkgnd(CDC* pDC)static BOOL bDon

13、e = FALSE;if (bDone = FALSE)bDone = TRUE;HBRUSH hBrush = (HBRUSH):GetStockObject(BLACK_BRUSH);:SetClassLong(m_hWnd, GCL_HBRBACKGROUND, (LONG)hBrush);联想到:SetWindowLong()函数,作用是?return CView:OnEraseBkgnd(pDC); 在前面的课程中,我们处理消息时,除了要判断主消息值 uMsg 外,总是要判断 wParam 和 lParam 这 2 个附加消息参数,以完整的表达一个消息的全部含义。但上面的 OnKey

14、Down 和 OnLButtonDown 中,我们没有见到 wParam 和 lParam 的身影,这是因为 MFC 已经智能 的帮助我们将这 2 个参数转换成了相应消息函数的参数了,转换后的参数直接表明了参数的 具体含义,更加人性化了。PreCreateWindow和OnCreate的不同在于:OnCreate是消息 WM_CREATE的响应函数, 是由:CreateWindow函数触发的消息。而PreCreateWindow不对应任何消息,它只是一个虚 函数,是在其父类中的:CreateWindow函数之前调用的,是为了给程序员一个在 CreateWindow 执行之前改变窗口外观的机会。

15、 OnCreate 和 PreCreateWindow 函数的参数中 都涉及到了一个CREATESTRUCT结构,其作用相同。PreCreateWindow先执行,OnCreate 后执行。由此可以推断,虚函数OnDraw也是类似的作用,是在消息WM_PAINT的响应函数 OnPaint中进行调用的。实际情况也是如此,可以跟踪MFC的核心代码可以证实这点。/文件 VIEWCORE.CPP 代码片段:void CView:OnPaint()/ standard paint routineCPaintDC dc(this);OnPrepareDC(&dc);OnDraw(&dc);对 MFC 源代

16、码的引用就在这里。/ MFC 核心和标准组/ MFC 扩展/ MFC自动化类/ MFC支持的IE4的通用控件6、预编译头文件 stdafx.h#include #include #include #include #ifndef _AFX_NO_AFXCMN_SUPPORT#include afxcmn.h/ MFC 支持的 Windows 通用控件#endif / _AFX_NO_AFXCMN_SUPPORT五、Windows消息分类Windows 消息可以分为以下 4 类:1、标准消息:即以WM_开头的消息,但WM_COMMAND除外。从CWnd派生的所 有类均可接收该类消息。2、命令消息

17、:即以WM_COMMAND形式出现的消息,如菜单、快捷键、工具条按钮 消息都是命令消息。从 CCmdTarget 派生的类可以接收该类消息。(重温第一天第一个作业 Win32自动创建Hello world的代码,其中就有 WM_COMMAND的用法实例)3、通告消息:控件产生的消息,如按钮、编辑框产生的消息等。从 CCmdTarget 派生 的类可以接收该类消息。4、用户自定义消息:为了跟系统消息区分,系统专门划分一段消息编号区间,让用户 定义自己的消息。其中,菜单命令的传递路径如下:消息传递:框架类-视类 消息处理:视类-文档类-视类-框架-应用程序类完成一个自定义消息的完整步骤如下: 定义

18、消息值:#define UM_SEND_DATA WM_USER + 1 定义消息响应函数:afx_msg void OnSendData(); 消息映射: ON_MESSAGE(UM_SEND_DATA, OnSendData) 实现消息响应函数,编写其中的代码 在需要的地方调用: SendMessage(hWnd, UM_SEND_DATA);六、MFC类向导工具class wizard用法介绍可以使用类向导(class wizard)工具来建立消息映射、添加类成员变量和成员函数等。一 般类向导生成的代码最好不要手动修改。如对一个菜单项使用类向导进行消息映射:1、点击右键选择class w

19、izard,如下图:2、选择合适的类,要进行映射的资源ID,和要进行映射的消息种类,使他们高亮显示 如下图。然后点击Add function按钮,系统为给对应的消息处理函数起名。如果ID名称起 的合理,该函数名也会相应合理。类向导会自动生成该函数的声明和定义。当然,函数体一 般情况是空的,需要自己写代码。3、生成的消息映射、函数声明和函数实现分别如下消息映射:-Ivc resources *由 21 AcceleratorH 口 Dialog由闔 Icon-曰 MenuSFidr MAINFRAME 申 Q String Table$ O Toolbar亩 _J VersionttiFdeF

20、_DEBUGttdeFinenew DEBUG_NEWttundeF THIS_FILE static charTHIS_FILE = _FILE_;ttendiFttdeFine WM USEROx0400ttdeFine MVJ-1ESSAGE WM_USER + 1/ 用户自定义消息,/7/7/./ CUcUiewIMPLEMENT_DVNCREATE(CUcUiew, CUiew)BEGIN_MESSAGE_MAP(CUcUiew, CUiew)/7AFX_MSG_MAP(CUcUiew)0N_C0MMAND(ID_EDIT_PASTE, OnEditPaste)/AFX_MSG_MA

21、P/ Standard printing commands0 N_C 0 MMA ND(ID_FIL EP RI NT, CUiew:0nFilePrint)0 NC 0 MMA ND(IDFIL EP RINT_DIR E C T, CUiew::OnFilePrint)0 NC 0 MMA ND(IDFIL EP RINT R E UIE W, CUiew:OnFilePrintPreuiew)onjiessageo _END_MESSfiGE_MfiP()/a / CUcUiew construction/destructionCUcUiew:CUcUiewf)函数声明:S O Icon

22、3 Menu 5pR_MAINFRAME 宙 |LJ String Tablej 2j ToolbarS O Version/ special ouerrides for implementation uirtual uoid CalcWindowRect(LPRECT IpCIientRect,UINT nAdjustType = adjustBorder);/IsKindOF(RUNTIME_CLASS(CUcDoc);return (CUcDoc*)n_pDocument;ttendif /_DEBUG/ CUcUiew message handlers生成的画数体uoid CUcUiew:OnEditPaste()/ TODO: Add your command handler code here作业:1、在工程“lWin32MFC”的基础上,手工添加WM_CLOSE消息,实现退出前询问是否真 的要退出的功能。进一步理解 MFC 消息映射。2、预习性作业:将前面的实现时钟程序作业的功能移植到工程1Win32MFC”中。该作业 涉及到了 MFC中的2个类CPaintDC, CWnd,后面会讲解,大家通过该作业进行预习。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!