对与这一部分如果有不理解,请先学习设计模式中的观察者模式与命令模式(手动微笑)

对于一个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的消息机制相关推荐

  1. Windows消息机制详解

    消息是指什么?      消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...

  2. Windows消息机制详解-6

    消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了.例如, ...

  3. Windows消息机制详解-2

    消息是指什么?      消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...

  4. Windows消息机制概述

    消息是指什么?      消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...

  5. windows消息机制-4(MFC)

    消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...

  6. mfc编程消息机制中消息汇总

    做VC开发必须熟悉消息机制,笔试面试重点,自己在这方面很欠缺,搜集学习一下 WM_CREATE CreateWindow 初始化工作 GetMessage 遇到WM_QUIT,程序结束 Dispatc ...

  7. MFC程序逆向 – 消息篇(上)+(下)

    费尔托斯特:单用户终生版,费尔软件 杀毒软件 65.0元   标 题: [原创]MFC程序逆向 – 消息篇(上)+(下) 11楼 作 者: szdbg 时 间: 2007-10-31,06:26 链 ...

  8. VC/MFC DDX和DDV机制介绍

    VC/MFC DDX和DDV机制介绍 C++的MFC类库中为用户提供了在对话框控件和数据变量间交换数据的         DDX/DDV(数据交换/数据验证)机制,而在此之前,用户只能通过调用     ...

  9. Windows消息机制要点

    1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...

  10. Windows消息机制-PreTranslateMessage

    PreTranslateMessage作用和使用方法 Windows消息机制的流程: A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中 B. 应用程序在消息循环中调用GetMe ...

最新文章

  1. 矩阵论习题:设A,B为投影矩阵,证明A+B仍为投影矩阵当且仅当AB=BA=0。
  2. 从0到100 | 用户画像的构建思路
  3. 网络安全人才的发展情况是怎么样的呢?快上车,带你了解
  4. OJ1064: 加密字符(C语言)
  5. maven添加外部jar,以及springboot打包
  6. 用户扫描二维码进入公众号后自动发送指定消息_公众号裂变,社群裂变,个人号裂变,运营操作指南...
  7. graphics java_Graphics
  8. Java仓储物流项目_基于jsp的物流仓库管理系统-JavaEE实现物流仓库管理系统 - java项目源码...
  9. java游戏代码大全_求一个简单的Java小游戏的代码
  10. 云计算世界里的企业级软件何去何从
  11. roboware studio教程_2.2.RoboWare Studio安装及使用
  12. java计算机毕业设计西藏民族大学论文管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  13. css案例_shortcut快捷导航样式
  14. HTML小游戏18 —— html5版街头霸王游戏(附完整源码)
  15. JavaScript在发送AjAX请求时,URL的域名地址是使用绝对地址还是相对地址?
  16. jzoj 4246【五校联考6day2】san
  17. 细说MySQL的时间戳(Timestamp)类型
  18. 一文搞懂什么是前端渲染和后端渲染以及两者的区别
  19. linux 一次io大小,linux – AWS EBS中IO操作(IOP)的大小是多少?
  20. protobuf根据有关联的.proto文件进行编译

热门文章

  1. rtx 加密机制_RTX发送消息提醒实现以及注意事项
  2. 餐饮销量数据统计量分析
  3. 蓝桥杯第十届c语言试题答案,蓝桥杯试题答案(C语言)蓝桥杯试题答案(C语言).pdf...
  4. 笔记-深入理解计算机系统
  5. 传智播客Java基础入门,浅谈JAVA开发规范与开发细节(上
  6. Python计算代码的执行时间
  7. ci框架 乱码 mysql_mysql设置utf8_unicode_ci字符集php页面输出??乱码的解决方法
  8. Python有哪些作用?
  9. WPF学习 - .NET相关知识
  10. 关于发那科机器人程序偏移功能