MFC学习(二):消息映射】的更多相关文章

1.应用程序类 CWinApp https://docs.microsoft.com/zh-cn/cpp/mfc/reference/cwinapp-class?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(AFXWIN%2FCWinApp);k(CWinApp);k(DevLang-C%2B%2B);k(TargetOS-Windows)…
本章将会对MFC的消息映射和 命令传递机制做深入探讨. MFC规定了消息传递的路线,消息会按照这个路线传递下去,找不到归宿的话就交给DefWindowProc. 在产生窗口之前,如果我们在创建窗口时指定的窗口类为NULL时,MFC会自动注册五个默认的窗口类,每个窗口类有自己的窗口函数.不同窗口得到的消息应该交由不同的窗口函数来处理.所谓的命令传递机制是为了让消息的流动有线路可循,实现一个巨大的网,实现所有可能的路线.这就是所谓的消息映射图. WM_COMMAND是来自菜单或工具栏,被称为命令消息…
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1.基于外键的单向1-1的配置将与无连接表N-1关联的many-to-one增加unique="true"属性即可. 一.模型介绍 一个人(account)对应一个地址(address). 二.实体 account类…
今天在工作中遇到一个问题,一个动态菜单,每个菜单的菜单项ID是我自己定义的,定义如下: #define IDM_SEARCHRECORD0 222240 #define IDM_SEARCHRECORD1 222241 #define IDM_SEARCHRECORD2 222242 #define IDM_SEARCHRECORD3 222243 #define IDM_SEARCHRECORD4 222244 #define IDM_SEARCHRECORD5 222245 #define…
多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多. 嗯…怎么办呢?于是各大c++名库(比如QT,MFC,VCL…)在消息映射的实…
首先,先看整体的消息流向图: 上图解释: 起点是消息循环,在winmain函数中(mfc中winmain函数是隐含的调用的,在app全局对象构造完后紧接着调用winmain函数),while循环中不断从应用程序队列中取消息,当取得一个消息时(含HWnd句柄),调用全局的AfxWndProc窗口函数(含有HWnd句柄作为参数),这个全局的函数根据HWnd得到具体的窗体wnd对象,然后调用对象的Cwnd::WindowProc窗口函数(此时不含HWnd句柄作为参数了).至此就从全局进入到具体窗体对象…
1. 消息映射表的组成 宏DECLARE_MESSAGE_MAP,用在类的声明中,用来声明消息映射表. 宏BEGIN_MESSAGE_MAP,在使用类声明外,用来定义链接节点和填写链表节点中的数据,其格式为BEGIN_MESSAGE_MAP(类名称, 基类名称). 宏ON_XXXX,用于填写类消息映射表中的单个表项,使用在BEGIN_MESSAGE_MAP的后面. 宏END_MESSAGE_MAP,消息处理函数表的结束宏,是表示消息映射表结束的标志. 2. 单个表项的消息类型 标准消息/窗口消息…
题外话:刚开始学视窗程序设计的时候,我就打印了一本Windows消息详解,里面列举了各种已定义消息的意义和作用,共10多页,在编程的时候翻翻,有时觉得很受用.我发觉很多编程的朋友,虽然每天都面对消息,却很少关注它.C++程序员有一个通病,很想写“自己”的程序,即每一行代码都想自己写出来.如果用了一些库,总希望能完全理解库里的类或函数是怎么一回事,否则就“不踏实”.对于消息,许多朋友只关心常用的几个,对其余的漠不关心.其实,Windows中有很多不常用的消息却很有用,程序员可能通过响应这些消息实现…
说到消息,在MFC中,“最熟悉的神秘”可算是消息映射,那是我们刚开始接触MFC时就要面对的东西.有过SDK编程经验的朋友转到MFC编程的时候,一下子觉得什么都变了样.特别是窗口消息及对消息的处理跟以前相比,更是风马牛不相及的.如文档不是窗口,是怎样响应命令消息的呢? 初次用MFC编程,我们只会用MFC ClassWizard为我们做大量的东西,最主要的是添加消息响应.记忆中,如果是自已添加消息响应,我们应何等的小心翼翼,对BEGIN_MESSAGE_MAP()……END_MESSAGE_MAP(…
MFC原理第五讲.消息映射.以及如何添加消息 一丶消息映射是什么 我们知道.Win32程序.都是通过消息去驱动的. 不断的在处理消息. 只要我们使用固定的宏.就可以让我们的框架知道一旦消息发生.该往哪一个类传递. 每一个类可以拥有一个映射表格. 也可以没有. 关键宏 1. DECLARE_MESSAGE_MAP  声明宏.放在类中 2. BEGIN_MESSAGE_MAP      实现宏放在类实现外 3. END_MESSAGE_MAP   实现宏放在类外面 如何添加消息. 如果我们添加了 B…
作为C++程序员,我们总是希望自己程序的所有代码都是自己写出来的,如果使用了其他的一些库,也总是千方百计想弄清楚其中的类和函数的原理,否则就会感觉不踏实.所以,我们对于在进行MFC视窗程序设计时经常要用到的消息机制也不满足于会使用,而是希望能理解个中道理.本文就为大家剖析MFC消息映射和命令传递的原理. 理解MFC消息机制的必要性 说到消息,在MFC中,“最熟悉的神秘”可以说是消息映射了,那是我们刚开始接触MFC时就要面对的东西.有过SDK编程经验的朋友转到MFC编程的时候,一下子觉得什么都变了…
---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Draw,运行如图所示: 下面主要用来讲解函数和变量添加方法,以此弄明白MFC消息映射机制,接着实现一个简单的画线功能. 右击工程名,选择Class Wizard,在Project项选择工程名Draw(此为要处理的工程),在Class name项选择CDrawView(此为添加函数的类,此处表示要在视图…
在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什么是消息?  窗口消息一般由三个部分组成:1.一个无符号整数,是消息值:2.消息附带的WPARAM类型的参数:3.消息附带的LPARAM类型的参数.其实,我们一般所说的消息是侠义上的消息值,也就是一个无符号整数,经常被定义为宏. 二.什么是消息映射机制?  MFC使用一种消息映射机制来处理消息,在应…
////////////////////////////////////////////////////////////////////////////////////                     /********* 文章系列:MFC技术内幕系列***********/                     /************MFC技术内幕系列之(四)***********/                     /*****文章题目:MFC消息映射与消息传递内幕***…
MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快.为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一.  同MFC消息映射机制有关的宏有下面几个:  DECLARE_MESSAGE_MAP()宏  BEGIN_MESSAGE_MAP(theClass, baseClass)和END_MESSAGE_MAP()宏  弄懂MFC消息映射机制的最好办法是将找出一个具体的实例,将这些宏展开,并找出相关的数…
转自: 1.http://blog.sina.com.cn/s/blog_6b5180bf01012kbz.html 2.http://blog.csdn.net/happyhhb/article/details/1623278 3.http://njufsh.blog.163.com/blog/static/1917928162011103104222589/ 孙鑫的MFC教程第4课主要讲了消息机制和MFC作图. MFC使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处…
学习孙鑫的那个深入详解C++视频时,有一处给编辑框空间改写窗口过程函数的例子,其中需要添加一个WM_INITDIALOG消息响应函数,但在类向导的消息栏下找不到WM_INITDIALOG消息.解决方法如下: 1.给你的对话框添加相应的映射类:2.在“类视图”中选中该对话框的映射类 :3.右键点击,选择“属性”,在属性视图中切换到“重写”选项,即可找到OnInitDialog,点击选出OnInitDialog()函数即可.(注:消息映射表中会多加一个registered,ON_REGISTERED…
VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用程序框架,这一讲是关于MFC消息映射机制的内容. 前面已经说过,Windows应用程序是消息驱动的.在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 什么是…
博文分析的很不错,尤其是替换默认窗口过程的这块,本人觉得,所有的这些都可以参阅侯杰的<深入浅出MFC >. 来自:http://blog.csdn.net/sryan/article/details/7392814 1.MFC的入口点与简单的执行过程 MFC隐藏了windows程序的入口点winMain,其实是在appmodule.cpp文件下,该入口点调用MFC的全局函数AfxWinMain作为MFC的入口点 然后AfxWinMain会进行一些初始化操作,并执行全局CWinApp的InitI…
1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口(CMainFrame)上创建的面板等,不是必要的.   C-App类处理消息,将收到的消息分发给相应的对象. CMainFrame是视图C-View的父窗口,视图C-View就显示在CMainFrame的客户区中. 视图类C-View用来显示文档类C-Doc中的数据,并根据对视图类的操作修改文档类的…
1. 消息分类: 2. 万流归宗——Command Target(CCmdTarget): 3. "消息映射"是MFC内建的一个信息分派机制.通过三个宏(DECLARE_MESSAGE_MAP/BEGIN.../ON.../END...)完成消息网的建构. 4. 注意:CWinThread派生自CCmdTarget,但没有DECLARE_/BEGIN_/END_宏组. 5. 消息映射与虚函数: 6.MFC2.5在AfxWinInit之中,自动为程序注册四个Windows窗口类,并且把窗…
初学MFC添加函数时,总是纠结于是 Add  windows message handler or Add virtual function 说到底不理解MFC中虚函数与消息处理函数的设计区别 本人理解:虚函数是层层继承的,子类Add virtual function只是去改写相应功能.虚函数一般都是程序框架必须调用的,子类没有改写就会默认调用基类的. 而消息映射只在相应类中添加自己感兴趣的处理函数,不存在继承性.所以没必要把windows消息映射函数设计成虚函数.有需要时程序才会执行这些操作.…
深入浅出MFC对于虚函数实现方式的缺点,它指出:虚函数耗费大量内存,系统最终将被这些额外负担拖垮. 但是现在对于容量巨大的白菜价格的内存来说,这种额外负担是否已经过时了呢~?    书中提到,虚函数表中的每一个项目都是一个函数指针,价值4字节,如果基类的虚函数表有100项 (MFC里面的消息数量是否在这个数量级?),经过十层继承,开支散叶,总共需要耗费多少内存?    我粗略地算了下,不知道这种计算方法是否正确,4Byte*100项=400Byte.如果CCmdTarget中定义100个消息,那…
长时间人容易遗忘,从新捡起!特做下记录 MFC消息映射 1.在MFC中消息映射主要牵扯到三个宏分别为: DECLARE_MESSAGE_MAP() BEGIN_MESSAGE_MAP(theClass, baseClass) END_MESSAGE_MAP() 2.先看源码 #define DECLARE_MESSAGE_MAP() \ protected: \ static const AFX_MSGMAP* PASCAL GetThisMessageMap(); \ virtual cons…
几个重要的结构体: struct AFX_MSGMAP { AFX_MSGMAP* pBaseMessageMap; AFX_MSGMAP_ENTRY* lpEntries; } struct AFX_MSGMAP_ENTRY { UINT nMessage;// Windows消息 UINT nCode;// 控制消息的通知码 UINT nID;// 其控制组件的ID UINT nLastID;// 如果是一定范围的消息映射,此值表示区间的最大值 UINT nSig; // 消息的动作标识 A…
对于消息映射宏,不用多说了,用过 MFC 的人都很清楚.但目前有不少程序由于各种原因并没有使用 MFC,所以本帖讨论一下如何在 Win32 程序中实现类似MFC的消息映射宏.其实 Windows 的头文件 “WindowsX.h”(注意:不是“Windows.h”) 中提供了一些有用的宏来帮助我们实现消息映射.本座是也基于这个头文件实现消息映射,首先看看宏定义文件: #pragma once #include <windowsx.h> /****************************…
消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息.例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息,按下键盘上的字母键,将产生WM_CHAR消息. 消息处理:在MFC中,每个专门的处理函数单独处理每个消息.消息处理函数通常是某一类的成员函数,编写消息处理函数是编写框架应用程序的主要任务.可以使用ClassWizard创建消息处事函数,然后从Classwizard直接跳到源文件消息处理函数,编写处…
利用MFC创建窗口: 1.mfc的头文件:afxwin.h 2.自定义类,继承于CWinApp,应用程序类(app应用程序对象,有且仅有一个) 3.程序入口:Initinstance 4.在程序入口中创建窗口 5.窗口类继承于CFrameWind 6.窗口中构造Create(NULL,标题名称) 7.创建窗口对象 8.显示和更新 9.保存指向应用程序的主窗口的指针 10.return TRUE 11.对项目进行配置 消息映射机制 1.声明宏写到.h中 2.分界宏写到.cpp中 3.找消息宏 写到…
转自:http://www.jizhuomi.com/software/147.html 前面已经说过,Windows应用程序是消息驱动的.在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 什么是消息 窗口消息一般由三个部分组成:1.一个无符号整数,是消息值:(2)消息附带的WPARAM类型的参数:(3)消息附带的LPARAM类型的参数.其实我们一般所说…
MFC把消息主要分为三大类: 1. 标准Windows消息(WM_XXX) 2. 命令消息(WM_COMMAND):凡由UI对象产生的消息都是这种命令消息,可能来自菜单或加速键或工具栏按钮. 3. 控件Notification消息 下面是各种消息的消息映射及对应处理函数原型: WM_COMMAND消息与处理对应规则: 消息映射 对应处理函数原型 ON_COMMAND(<id>, <memberFxn>) afx_msg void memberFxn(); ON_COMMAND_EX…