《MFC程序开发参考大全》学习笔记_1

《MFC程序开发参考大全》学习笔记_4 MFC消息映射 1.消息映射的产生 为了解决传统窗口函数的缺点(需要程序员了解许多窗口消息;许多窗口的窗口函数大部分消息处理相同;switch语句逐一判断窗口发生的消息,使编译代码的效率非常低),MFC引入了消息映射的概念。 消息映射实际上是采用一张表(消息映射表),将消息标识和消息处理函数存储在其中,当调用窗口函数处理消息时,窗口函数搜索消息映射表,就可以调用消息映射表中对应消息的消息处理... 阅读详情

Windows应用程序是以消息为基础、以事件为驱动的应用程序。应用程序在运行时,会不断的等待操作系统发送给自身的消息(利用一个while循环),然后依据不同的消息进行相应的处理(switch语句)。

接收并处理消息的主角是窗口,每一个窗口都有一个负责处理消息的函数——称“窗口函数”或“回调函数”。当窗口获得一个消息时,“窗口函数”会判断消息的类型,并确定如何处理消息。

1.消息结构

typedef struct tagMSG
{
    HWND hWnd;
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    DWORD time;
    POINT pt;
}MSG;
  • hWnd:窗口句柄,操作系统可以通过它将消息分派到正确的窗口中(即可以确定是哪个窗口有此消息)。句柄起到标识对象的作用,系统在创建内核对象(进程、线程、事件等)或GDI对象(窗口、图标、光标等)时,会为其分配内存,同事返回这些对象的标识,即句柄。此后,程序对这些对象进行的操作,都是通过句柄进行的。
  • message:消息标识符,确定是哪个消息。例如:WM_PAINT、WM_CREATE。
  • wParam:表示消息的附加信息。
  • lParam:表示消息的附加信息。

例如:以消息WM_MOUSEMOVE为例,wParam表示的是被用户按下的虚拟键;lParam的低字节表示鼠标的横坐标,高字节表示鼠标的纵坐标。如果要查看某一个具体消息的附加信息所表示的含义,可以在MSDN中查看。

  • time:消息被放入消息队列中的时间。
  • pt:消息被放入消息队列的鼠标位置(以屏幕坐标表示)。

2.消息类型

Windows系统将消息分为两大类,一类是系统预定义的消息,一类是用户自定义的消息。

系统消息由前缀和后缀两部分组成,前缀表示处理该消息的窗口类别,后缀描述消息的内容。例如:WM_CLOSE,"WM"表示处理该消息的窗口为一般窗口,"CLOSE"表示窗口关闭。

用户自定义消息的时候,应保证消息值是唯一的,不能与系统中定义的消息冲突。系统保留了0x0000~0x03FF的消息值,应用程序不能使用。用户可以使用0x0400(WM_USER)~0x7FFF的消息值。

3.消息队列

为了保证消息不被遗失,操作系统必须为应用程序暂时存储消息,等待应用程序依次进行处理。为此,操作系统为应用程序建立了消息队列。每当有消息发生时,系统将消息分派到消息队列中,等待应用程序从中取出来进行处理。

消息队列是由线程拥有的,应用程序是一个进程,进程除了拥有主线程外,还可以创建多个线程。线程一旦调用了与GDI有关的函数或检查消息队列的时候,系统就会为线程建立消息队列。系统为线程建立消息队列,实际是分配一个THREADINFO结构的数据,使其与线程关联。

问:消息时如何传递到消息队列中的?

答:可以通过调用PostMessage函数将消息放入到线程的等级消息队列中。

BOOL PostMessage(
    HWND hWnd,      //窗口句柄
    UINT Msg,       //消息标识
    WPARAM wParam,  //消息附加信息
    LPARAM lParam   //消息附加信息 
);

在调用PostMessage函数时,系统首先确定是哪个线程创建了hWnd参数标识的窗口(如果判断某一个窗口是由哪个线程创建的,可以调用GetWindowThreadProcessId函数实现,该函数的返回值是创建窗口的线程ID),然后系统分配一块内存区域,将消息信息存储在内存区域中,并将该内存区域添加到线程的等级消息队列中。PostMessage函数在执行后会立即返回,因此,调用该函数的线程并不知道放入到登记消息队列中的消息是否被处理了。

系统除了为每个线程维护一个消息队列,还维护一个全局的消息队列,称为系统硬件输入队列,用于存储系统中硬件触发的消息。在系统初始化时,会建立一个特殊的线程——原始输入线程(Raw Input Thread, RIT),并且建立一个系统硬件输入队列(System Hardware Input Queue, SHIQ)。RIT与SHIQ构成了系统的硬件输入模型核心。

问:系统硬件消息是如何传递到线程的消息队列的?

答:以鼠标消息为例,系统通过设备驱动程序将消息放入到SHIQ,此时,RIT会唤醒,通过当前鼠标光标之下的窗口,获取创建窗口的线程ID,然后将鼠标消息放入到线程的虚拟输入队列中。

4.消息循环

拥有消息队列的线程,需要不断的从消息队列中取出消息,进行处理。在处理消息的过程中,可能会有新的消息被放入到消息队列中,如此反复构成消息循环。

MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

GetMessage函数从当前的线程消息队列中获取消息,将消息信息存储在参数中。

BOOL GetMessage(
    LPMSG lpMsg,       //是MSG结构指针,用于存储获取的消息信息
    HWND hWnd,         //表示函数返回与指定窗口有关的消息,为NULL时,函数返回与所有窗口有关的消息
    UINT wMsgFilterMin,//表示返回消息的最小值 
    UINT wMsgFilterMax //表示返回消息的最大值
);

函数返回值:如果获得的消息为WM_QUIT,返回值为零(即FALSE,消息循环函数结束),如果函数执行过程中出现错误,返回值为-1(消息循环不会结束),其他情况返回值为非零。

TranslateMessage函数用于将虚拟键消息转换为字符消息。该函数检查是否有WM_KEYDOWN或WM_SYSKEYDOWN消息从虚拟输入队列中取出,如果有,系统检测虚拟键是否能够转换为等价的字符,如果能够转换,则TranslateMessage函数调用PostMessage函数将WM_CHAR或WM_SYSCHAR消息放入到登记消息队列中。下次执行GetMessage函数时,发现登记消息队列中有WM_CHAR或WM_SYSCHAR消息,将其取出并返回。

DispatchMessage函数用于将获取的消息回传给操作系统,由于消息中已经包含了窗口的句柄等信息,因此操作系统能够正确的调用窗口函数处理消息。

用VS进行MFC程序开发基础 近几年随时技术的发展越来越多的年轻程序员选择当下时髦和流行的编程语言,它们上手快、网络资源多、应用广,而一些老牌的编程语言和工具不怎么受欢迎,特别是VC++,从招人上也能看出来,能够熟练应用VS进行MFC编辑的人越来越少,一些高水平的年轻一代程序 员更是风毛菱角,所以想着重新开启优快云博客写一些关于VC++、MFC编程的文章,希望能够为年轻一代MFC编程人员的成长提供一点点帮助! 虽然现在已经... 阅读详情

相关推荐

VS2015之博大精深的MFC项目开发(一)

not captured,就是当鼠标移出了对话框窗口客户区之外的时候,标题栏上的文字就不响应了(不响应鼠标移动消息了),离开窗口的话光标就无效了,光标在窗口内的话就响应鼠标移动消息,也就是说包含光标的窗口才能收到这个消息;the window that has captured the mouse,也就是把这个光标绑到这个窗口,离开窗口之后光标仍然有效。继续研究wParam参数,如何把按下左键拖动也能显示出来呢?

zhaopeng01zp的博客 5225

MFC程序开发

mfc基础

qq_59328991的博客 2049

全面MFC程序开发手册

本文还有配套的精品资源,点击获取 简介:MFC是微软为Windows应用程序开发提供的C++库,通过面向对象的封装简化了API的使用,便于构建用户界面、数据库和网络通信软件。本参考大全深入解析了MFC的框架结构、核心概念以及关键组成部分,包括文档/视图架构、消息映射、控件与对话框、数据库支持、网络编程、异常处理、国际化和本地化、打印功能、以及DLL支持。这些知识点的熟练掌握...

weixin_42315569的博客 1275

《MFC程序开发参考大全》学习笔记_3

1.MFC的诞生 开发人员发现撰写Windows应用程序是重复、厌烦的过程,而且效率极低。因为每一个窗口都需要在窗口函数中处理大量的消息,导致出现大量的重复代码。 随着C++语言的盛行,开发人员发现利用C++语言的特性来封装Windows API和Windows应用程序的开发可以明显地提高程序的开发效率。于是,MFC就诞生了。 2.MFC简单介绍 MFC的英文全称是Microsoft Fu...

Small_SaltedFish的博客 866

全面MFC编程参考指南

MFC(Microsoft Foundation Classes)是一个为简化Windows应用程序开发而构建的C++类库。它提供了面向对象的封装,让我们能够用更少的代码创建具有丰富用户界面的应用程序。MFC自1992年发布以来,一直是Windows开发的重要工具之一。CWinApp类在 MFC 应用程序中扮演着至关重要的角色,它是所有 MFC 程序的入口点和应用程序框架的核心。通过继承CWinApp,开发者可以创建一个应用程序类,管理应用程序的初始化、运行和终止过程。

weixin_34718952的博客 856

基于MFC的多功能绘图程序开发实战

Microsoft Foundation Classes(MFC)是微软提供的一套C++类库,封装了Windows API,极大地简化了Windows应用程序的开发流程。MFC采用面向对象的设计思想,将Windows的窗口、消息机制、图形设备接口(GDI)等核心功能封装成类,便于开发者快速构建图形界面应用。

weixin_35751194的博客 802

《MFC程序开发参考大全》学习笔记_5

窗口消息处理 MFC中的窗口函数 在MFC类库中,CWnd封装了窗口类的基类,并提供了处理消息的窗口函数WindowProc。在注册窗口类的时候,它是如何成为类的窗口函数的呢?以对话框的创建为例介绍WindowProc如何成为窗口类的窗口函数。 CMyDlg dlg; dlg.Create(IDD_MYDLG_DIALOG,this); 当对话框执行Create方法时,会执行一系列的动作...

Small_SaltedFish的博客 361

C++与MFC程序开发实践宝典

本文还有配套的精品资源,点击获取 简介:《经典-------C++程序开发范例宝典》是C++程序员的宝贵资源,特别专注于使用MFC库开发Windows应用程序。本书从C++基础讲起,包括面向对象编程概念、基本语法、函数、指针等,再到MFC的基础知识和核心概念,如应用框架、文档/视图架构、对话框、控件和消息映射。通过源码实例的深入分析,读者能够理解C++与MFC结合使用的方法...

weixin_33205138的博客 944

Windows 10 ARM64平台MFC串口程序开发

Windows 10 IoT ARM64平台除了支持新的UWP框架,也兼容支持老框架MFC。使得用户在下可以对原MFC工程进行功能升级,不用在新框架下重写整个工程。熟悉MFC开发的工程师也可以在平台下继续使用MFC进行开发。

sinat_39142649的博客 831

《MFC程序开发参考大全》光盘源代码.rar

《MFC程序开发参考大全》这本书里面的例子源代码。

mfc 程序开发 参考大全

mfc 程序开发 参考大全第15章内容

《MFC程序开发参考大全》源码(第一章)

明日科技编的《MFC程序开发参考大全》现在正在热卖中,其中的源代码很有参考价值,现在先提供第一章的源代码,如果得到大家的好评,本人还将继续上传其他章节的源代码。

MFC程序开发参考大全 源码

本书详细介绍了MFC框架中所有常用类及控件的应用,其中以Visual C++ 6.0为主,Visual C++ 2005为辅。同时在讲解中结合了大量实用而又有代表性的示例。   全书共分19章,包括MFC应用程序概述,C++面向对象程序开发,消息映射与命令处理,对话框程序设计,MFC通用控件,菜单,工具栏和状态栏设计,GDI绘图,文档,视图结构程序设计,MFC打印技术,文件与注册表操作,数据库编程,系统内核对象,MFC链接库,串口程序开发,网络程序开发,Internet程序开发,程序调试与异常处理,Visual C++ 2005介绍,C++托管扩展编程等。书中各部分内容由浅入深,逐步让读者掌握MFC编程的知识、方法和技巧,是Visual C++爱好者、学习者和开发人员必备的参考书。   本书附有配套光盘。光盘提供了书中全部源代码,所有源代码都经过精心调试,在Windows 2000下测试通过,保证能够正常运行。   本书内容精练,重点突出,实例丰富,是各级程序开发人员必备的案头参考书,同时也非常适合大中专院校师生阅读。

MFC Windows程序开发究竟是什么?

MFC Windows程序开发究竟是什么? MFC是一个Application Framework.他是一个完整的程序模型。 什么是MFC?MFC是微软公司出品一个Application Framework。基本上,我们可以认为Application Framework就是一个完整的程序模型,具备标准软件所需的一切基本功能,比如文件存取、打印等等。从C++语言层面来看,Application ...

平凡 3815

[软件工程师典藏:MFC 程序开发参考大全].宋坤.课本光盘资料代码

[软件工程师典藏:MFC 程序开发参考大全].宋坤.课本光盘资料代码

MFC程序开发参考大全书籍源码

学习VC++的资料

MFC学习笔记

本文主要介绍MFC的底层运行原理,不涉及控件接口的调用,其内容主要包含:MFC基础程序框架、MFC六大运行机制、MFC程序架构、菜单与工具栏、视图与文档、绘图以及对象与控件的关系等。

weixin_44553525的博客 3850

MFC程序开发参考大全源代码(全)

MFC程序开发参考大全1-19章所有例题源代码

下一篇: 《MFC程序开发参考大全》学习笔记_2
LemonnnLee
博客等级 码龄9年 8粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值