深入浅出MFC:MFC的消息机制
对与这一部分如果有不理解,请先学习设计模式中的观察者模式与命令模式(手动微笑)
对于一个Windows程序,在进行完基本的初始化工作之后,则就将开始进行最最重要也是难以理解的部分:消息循环与消息映射
最简单的消息循环不过如下:
while (GetMessage(&msg, ...)) {TranslateMessage(&msg); //转换键盘消息DispatchMessage(&msg); //分发消息
}
首先,第一步
TranslateMessage(&msg)则是为了将键盘消息转化,而第2句DispatchMessage(&msg)则会将消息分发给窗口函数去处理,消息产生之时操作系统会根据当初状态,为其
标明所属窗口,而窗口所属的窗口类一开始产生指出就已经明白地标识了窗口函数,所以消息就这样被分发到了指定的窗口之中,对于这一部分其实如果有写过MVC或者
其它相关的观察者模式的例子应该会很好理解这一部分。
这里顺便值得一提的是MFC中的窗口函数,对于MFC的窗口函数,其函数的形式总是保持如下形式:
LRESULR CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
无论什么消息,被发送给窗口函数之后都将会被处理,而处理的方法就是最简单的 switch/case 组合中的 default: 处必须调用 DefWindowProc ,这个是Windows内部默认的消息处理函数。
最后为了将消息的具体行为与窗口方法的逻辑分离开来,使用了一点命令模式:分离了具体行为与个体之间的耦合,这里的说法可能有一点不准确
实现方式如下:
struct MSGMAP_ENTRY {UINT nMessahe;LONG(*pfn)(HWND , UINT,WPARAM,LPARAM); //窗口函数的指针
};
以此结构体便可以设计如下的消息列表和命令列表
<pre name="code" class="cpp">struct MSGMAP_ENTRY _messageEntries[] =
{WM_CREATE ,OnCreate ,WM_PAINT , OnPaint ,WM_SIZE , OnSize ,WM_COMMAND , OnCommand ,WM_SETFOCUS , OnSetFocus ,WM_CLOSE , OnClose ,WM_DESTROY , OnDestroy ,
}
struct MSGMAP_ENTRY _commandEntries[] =
{IDM_ABOUT , OnAbort ,IDM_FILEOPEN , OnFileOpen ,IDM_SAVEAS , OnSaveAs ,
}
这样一来窗口函数和命令处理函数将永远都不在需要改变,每当有新的消息,只需要在_messageEntries[] 和 _commandEntries[] 俩个数组加上新元素,并单独攥写新消息的处
理例程即可,这是一次几乎完美的解耦合
这也是MFC的Message Map 的雏形,实际的将会更加复杂。如果大家看完还有迷惑的话,就请重新读一遍本文的第一句话(手动微笑)
深入浅出MFC:MFC的消息机制相关推荐
- Windows消息机制详解
消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...
- Windows消息机制详解-6
消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了.例如, ...
- Windows消息机制详解-2
消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...
- Windows消息机制概述
消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...
- windows消息机制-4(MFC)
消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...
- mfc编程消息机制中消息汇总
做VC开发必须熟悉消息机制,笔试面试重点,自己在这方面很欠缺,搜集学习一下 WM_CREATE CreateWindow 初始化工作 GetMessage 遇到WM_QUIT,程序结束 Dispatc ...
- MFC程序逆向 – 消息篇(上)+(下)
费尔托斯特:单用户终生版,费尔软件 杀毒软件 65.0元 标 题: [原创]MFC程序逆向 – 消息篇(上)+(下) 11楼 作 者: szdbg 时 间: 2007-10-31,06:26 链 ...
- VC/MFC DDX和DDV机制介绍
VC/MFC DDX和DDV机制介绍 C++的MFC类库中为用户提供了在对话框控件和数据变量间交换数据的 DDX/DDV(数据交换/数据验证)机制,而在此之前,用户只能通过调用 ...
- Windows消息机制要点
1. 窗口过程 每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...
- Windows消息机制-PreTranslateMessage
PreTranslateMessage作用和使用方法 Windows消息机制的流程: A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中 B. 应用程序在消息循环中调用GetMe ...
最新文章
- 矩阵论习题:设A,B为投影矩阵,证明A+B仍为投影矩阵当且仅当AB=BA=0。
- 从0到100 | 用户画像的构建思路
- 网络安全人才的发展情况是怎么样的呢?快上车,带你了解
- OJ1064: 加密字符(C语言)
- maven添加外部jar,以及springboot打包
- 用户扫描二维码进入公众号后自动发送指定消息_公众号裂变,社群裂变,个人号裂变,运营操作指南...
- graphics java_Graphics
- Java仓储物流项目_基于jsp的物流仓库管理系统-JavaEE实现物流仓库管理系统 - java项目源码...
- java游戏代码大全_求一个简单的Java小游戏的代码
- 云计算世界里的企业级软件何去何从
- roboware studio教程_2.2.RoboWare Studio安装及使用
- java计算机毕业设计西藏民族大学论文管理系统源码+数据库+系统+lw文档+mybatis+运行部署
- css案例_shortcut快捷导航样式
- HTML小游戏18 —— html5版街头霸王游戏(附完整源码)
- JavaScript在发送AjAX请求时,URL的域名地址是使用绝对地址还是相对地址?
- jzoj 4246【五校联考6day2】san
- 细说MySQL的时间戳(Timestamp)类型
- 一文搞懂什么是前端渲染和后端渲染以及两者的区别
- linux 一次io大小,linux – AWS EBS中IO操作(IOP)的大小是多少?
- protobuf根据有关联的.proto文件进行编译
热门文章
- rtx 加密机制_RTX发送消息提醒实现以及注意事项
- 餐饮销量数据统计量分析
- 蓝桥杯第十届c语言试题答案,蓝桥杯试题答案(C语言)蓝桥杯试题答案(C语言).pdf...
- 笔记-深入理解计算机系统
- 传智播客Java基础入门,浅谈JAVA开发规范与开发细节(上
- Python计算代码的执行时间
- ci框架 乱码 mysql_mysql设置utf8_unicode_ci字符集php页面输出??乱码的解决方法
- Python有哪些作用?
- WPF学习 - .NET相关知识
- 关于发那科机器人程序偏移功能