消息和消息队列

在传统的C程序当中,我们调用fopen函数打开文件,这个库函数最终调用操作系统(提供的函数)来打开文件。而在Windows中,不仅用户程序可以调用系统的API函数,反回来,系统也会调用用户程序,这个调用是通过消息来进行的。

Windows程序设计是一种完全不同于传统的DOS方式的程序设计方法。他是一种事件驱动方式的程序设计模式,主要是基于消息的。例如,当用户在窗口画图的时候,按下鼠标左键,此时操作系统就会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息并进行响应。在这个处理过程中,操作系统也会给应用程序“发送消息”。所谓发送消息,实际上是操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口函数。

1.消息

Windows程序中,消息是由MSG结构体表示的。MSG结构体定义如下:

typedef struct tagMSG{

   HWND  hwnd;

   UINT    message;  

   WPARAM wparam;

   LPARAM lparam; 

   DWORD time;

   POINT  pt;

   }MSG;


 

   该结构体中个成员变量的含义如下:

   第一个成员变量hwnd表示消息所属的窗口。我们开发的应用程序一般都是窗口应用程序,一个消息一般都是与一个窗口相关联的。例如某个活动窗口中按下鼠标左键,产生的按键消息就是发给该窗口的。在Windows应用程序中,用HWND的变量来标识窗口。

   第二个成员变量message 指定了消息的标识符。在Windows中,消息是由一个数值来表示的,不同的消息对应于不同的数值。但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM WIndow Message的缩写)的形式,XXX对应某种消息的英文拼写的大写形式。例如,鼠标左键暗笑的消息是WM_LBUTTONDOWN,键盘按下的消息是WM_KEYDOWN,字符消息是WM_CHAR ,等等。在程序中我们通常都是以WM_XXX宏的形式来使用消息的。如果想知道WM_XXX消息对应的具体数值,可以在Visual C++ 开发环境中选中 WM_XXX. 然后单击鼠标右键,在弹出菜单中选择goto definition ,即可看到该宏的具体定义。跟踪或查看某个变量的定义,都可以使用这个方法。

   第三、第四个成员变量wparamiparam,用于指定消息的附加消息。例如,当我们收到一个字符消息的时候,message成员变量的值就是WM_CHAR,但用户到底输入的是什么字符,那么就由wparamiparam来说明了,wparamiparam表示的信息随消息的不同而不同。如果想知道这两个成员变量具体表示什么意思,可以在MSDN中关于某个具体消息的说明文档查看到。通过VC++开发环境中的goto definition 查看一下WPARAM和 LPARAM这两种类型的定义,可以发现这两种类型实际就是unsigned int long 

  最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置。

  2.消息队列

  每一个Windows应用程序开始执行之后,系统都会为该应用程序创建一个消息队列,这个消息队列用来存放该应用程序创建的窗口的消息。例如,当我按下鼠标左键的时候,就会产生WM_LBUTTONDOWN消息,系统就会将这个消息放到窗口所属的应用程序的消息队列中,,等待应用程序的处理。Windows将产生的消息依次放到消息队列中,而应用程序则通过一个消息循环不断的从消息队列中取出消息,并进行效应。这种消息机制,就是Windows程序的运行机制。

 3 进队消息和不进队消息

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值