VC++杂七杂八的笔记(二)

在Windows中,不仅用户程序可以调用系统的API函数,系统也会调用用户程序,这个调用是通过消息来进行的。wParam和lParam表示的信息随消息的不同而不同。

每一个Windows应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口消息。

Windows程序中的消息分为进队消息和不进队消息。进队消息将由系统放入到应用程序的消息队列中,然后由应用程序取出并发送。不进队消息在系统调用窗口过程时直接发送给窗口。不管进队消息还是不进队消息,最终都由系统调用窗口过程函数对消息进行处理。

创建一个完整的窗口步骤:设计窗口类、注册窗口类、创建窗口、显示及更新窗口。当窗口发生重绘时,窗口中的文字和图形将被擦除。

窗口过程函数是一个回调函数。回调函数不是由函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。回调函数的实现机制是:

(1)定义一个回调函数。

(2)提供函数实现的一方在初始化的时候,将回调函数的指针注册给调用者。

(3)当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

一个Windows程序可以包含多个窗口过程函数,一个窗口过程总是与某一个特定的窗口类相关联,基于该窗口类创建的窗口使用同一个窗口函数。

GetMessage函数接收到除WM_QUIT外的消息均返回非零值。对于WM_QUIT消息,该函数返回0。如果出现错误,该函数返回-1。

TranslateMessage函数用于将虚拟键消息转换为字符消息。字符消息被投递到调用线程,当下一次调用GetMessage时被取出。TranslateMessage函数并不会修改原有的消息,它只是产生新的消息并投递到消息队列中。

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

Windows应用程序的消息处理机制如图:

(1)操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。

(2)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应或调用TranslateMessage产生新的消息。

(3)应用程序调用DispatchMessage,将消息回传给操作系统。

(4)系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。

从消息队列中获取消息还可以调用PeekMessage函数。发送消息可以使用SendMessage和PostMessage。SendMessage将消息直接发送给窗口,并调用窗口过程进行处理。在窗口过程对消息处理完毕后,该函数才返回(SendMessage发送的消息为不进队消息)。PostMessage将消息放入与创建窗口的线程相关联的消息队列后立即返回。此外,PostThreadMessage用于向线程发送消息。对于线程消息,MSG结构体中的hwnd为NULL。

时间: 2024-08-24 12:35:58

VC++杂七杂八的笔记(二)的相关文章

VC++杂七杂八的笔记(三)

UpdateWindow函数通过发送一个WM_PAINT消息来刷新窗口,UpdateWindow将WM_PAINT消息直接发送给了窗口过程函数进行处理,而没有放到消息队列里. MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表.在消息映射表中,消息与对应的消息处理函数指针是成对出现的.某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中.当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就

VC++杂七杂八的笔记(一)

Afx_msg并没有什么其他用途,它只是用来表明该原型说明是针对消息映射函数而言. 仅改变视窗成员变量OnDraw函数是不会被调用的(除非改变了视窗的大小).必须调用InvalidateRect函数,它能触发Windows的WM_PAINT消息,该消息又在CView类被映射,以引起对OnDraw的调用. OnDraw的参数名以注释的形式存在,所以在使用这个指针之前,必须解除这个名称的注释,或用自己的名称代替这个名称. 两种情况可优化Windows的绘制过程.第一,我们必须知道Windows只更新

老男孩培训视频听课笔记二(在51cto上听的)

centos 5.8 文本安装过程    引导采用默认,引导不用设置密码    网络配置,根据实际情况配置,网关是网络出口的地址,一般为wlan出口的路由器的地址或者是代理服务器的内网IP    DNS简单解说图:      主机名--时区--root密码    选择自定义系统安装包--最小化(安全方便工作,建议安装以下的组)      ·base-- 基础      ·editors-编辑器      ·development librarays--开发库      ·development

《卓有成效的程序员》----读书笔记二

六大方面对比Launchy和TypeAndRun(TAR) 对于快速启动工具,很多人都有自己的偏好,多次听到朋友介绍Launchy的好,虽然自己一直在使用着TAR,还是克制不住对于好软件的渴求,下载Launchy进行试用.很多软件都是有一个试用期的,也许新的软件确实不错,但是你习惯了以前使用的那个软件.今天就比较客观的将Launchy和TAR进行一下对比,从界面.上手速度到功能.自定义,以及软件的稳定性.占用资源进行详细的比较. [界面美观]Launchy:毫无疑问这是它的强项.1.0正式版自带

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

《逻辑思维简易入门》(第2版) 阅读笔记二

<逻辑思维简易入门>(第2版) 阅读笔记二 本周阅读的是<逻辑思维简易入门>的第三章,也就是说,本书的第一部分就已经读完了. 第三章.信念的优点 信念和负信念是人们在接受一个事物时一种心理态度,延伸来说也就是对事物的认知态度.因为我们在研究 逻辑思维的时候,都有一个前提:“以正常情况以及说话者真诚”,所以有人如果对于一件事物不做回应,我们可以认为这是一种既不相信,也不怀疑的的态度. 信念的优缺点有很多,在书中主要介绍了下面几种: 1.准确性 好的信念实在准确的表达事实,同样真的信念

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

Emacs 笔记二

Emacs 笔记二 Table of Contents 1. 前言 2. emacs基本操作(常用快捷键) 3. emacs模式讲解 4. emacs缓冲区 5. org mode 5.1. 列表 5.2. 快键键 5.3. 内嵌元素(插入代码什么的) 5.4. 表格 1 前言 最近在学着写博客,发现MarkDown真乃神器,于是去找了很多markdown的工具,发现作业部落 最好的那个,而无意间又发现了org-mode火爆到极致 非常被人推崇,其实作业部落 已经是能很完美的满足我的需求了,但是

《Programming in Lua 3》读书笔记(二十二)

日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言.配合主语言做一些功能的配置. 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析.如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv.txt文件等. 使用Lua进行配置的时候,就需要使用Lua API去控制