windows 消息机制2

 理解Windows消息机制2008-08-02 16:19Windows系统是一个消息驱动的OS,

消息的组成:一个消息是由一个消息名称,和两个参数,当用户进行了解输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口,例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中是命令的ID号,对菜单来讲就是菜单ID,当然用户也可以定义自已的消息名称,也可以利用自定义消息来发送通知和传送数据。

谁将收到消息:一个消息必须由一个窗口接收,在窗口的过程中可以对消息进行分析,对自已感兴趣的消息进行处理

未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理的消息。正因为有了这个默认窗口过程我们才可以利用windows的窗口进行开发而不必过多关注窗口各种消息的处理。

窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收,而每个窗口嗜附有自已的窗口过程,所以用户的输入就会被正确的处理,

示例:下面有一段伪代码演示如何在窗口过程中处理消息

LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)
{
 switch(uMessageType)
 {//使用SWITCH语句将各种消息分开
  case(WM_PAINT):
   doYourWindow(...);//在窗口需要重新绘制时进行输出
  break;
  case(WM_LBUTTONDOWN):
   doYourWork(...);//在鼠标左键被按下时进行处理
  break;
  default:
   callDefaultWndProc(...);//对于其它情况就让系统自己处理
  break;
 }
}
系统将会维护一个或多个消息队列,所有产生的消息都回被放放入或是插入队列中,系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的水人种的循环,每一个运行的程序都自已的消息循环,在徨中得到属于自已的消息并根据接收窗口的句柄调用相应的窗口过程,而在没有消息时消息徨就将控制权交给系统所以Windows可以同时进行多个任务。
while(1)
{
 id=getMessage(...);
 if(id == quit)
  break;
 translateMessage(...);
}
当该程序没有消息通知时getMessage就不会返回,也就不会占用系统的CPU时间。 下图为消息投递模式
在16位的系统中系统中只有一个消息队列,所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序,如果一个程序陷入死循环或是耗时操作时系统就会得不到控制权,
32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权,这种多任系统就称为抢式的多任务系统。
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值