MSDN中关于消息和消息队列部分(二)

消息处理

应用程序可以在每个创建有窗口的线程函数中建立一个消息循环,消息循环从消息队列中移除消息,并将该消息发送给窗口过程处理。

消息循环

消息循环由三个函数构成:GetMessageTranslateMessageDispatchMessageGetMessage从消息队列中获取消息,TranslateMessage将键盘消息转换成一个WM_CHAR消息,DispatchMesage将消息分发给对应的窗口过程处理。GetMessage可以通过指定窗口的句柄接收特定窗口的消息,也可以通过指定消息范围接收特定范围的消息。GetMessage直到接收到一个WM_QUIT消息才返回FALSE

应用程序的主线程在初始化应用程序并且创建了至少一个窗口后开始消息循环。一旦开始,消息循环持续从线程消息队列中获取消息并分发到合适的窗口。消息循环在GetMessage函数从消息队列中移除WM_QUIT消息后结束。

每个消息队列仅需要一个消息循环,即使一个应用程序包含多个窗口。DispatchMessage总是将消息分发到合适的窗口;因为MSG结构体中包含一个指向它属于的窗口的句柄。

我们可以修改一个消息循环。例如,我们可以从队列中获取消息,但并不将该消息分发给一个窗口。当应用程序放置一个没有指定特定窗口的消息时会非常有用。我们也可以通过GetMessage来寻找特定的消息,将其它消息留在队列中。如果你必须临时避开消息队列通常的先进先出顺序时这将非常有用。

如果一个应用程序用了加速键,它必须可以将键盘消息转换成命令消息。为了达到这个目的,应用程序的消息循环必须调用TranslateAccelerator函数。

如果一个线程用了非模态对话框,消息循环必须调用IsDialogMessage,这样对话框才可以接收键盘输入。

窗口过程

一个窗口过程是一个函数,该函数接收并处理发送到该窗口的所有消息。每个窗口类都有一个窗口过程,一个窗口类创建的所有窗口都用相同的窗口过程来响应消息。

系统通过将消息数据以参数的形式传递给一个窗口过程来发送一个消息。窗口过程针对该消息执行一个合适的动作;它检查消息标识符,并且在处理消息的时候使用消息参数中附带的信息。

一个窗口过程通过不会忽略一个消息。如果它不处理一个消息,它必须通过调用DefWindowProc函数将该消息送还给系统来作默认处理。DefWindowProc函数执行一个默认的动作并返回一个消息处理结果。窗口过程必须将该结果作为自己的处理结果返回。大多数窗口过程仅仅处理一小部分消息,而将其它消息都交还给系统作默认处理。

一个窗口过程会被同一个窗口类的所有窗口共享,因此它可以处理几个不同窗口的消息。窗口过程可以通过检查窗口句柄来区分该消息影响的窗口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值