We do not always find visible happiness in proportion to visible virtue

梦幻白桦林

SHARE

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  14 Posts :: 58 Stories :: 62 Comments :: 0 Trackbacks

公告

常用链接

留言簿(5)

搜索

  •  

最新随笔

最新评论

阅读排行榜

本文主要介绍了Win32 API主消息循环的两种处理方法:使用GetMessage方法构造主消息循环、使用PeekMessage方法构造主消息循环。

(1)使用GetMessage方法构造主消息循环
一般应用程序都使用用GetMessage方法构造主消息循环,该方法是获得一条线程 的消息。对于VS2005自动生成的Win32 Windows程序上面有些不足。
因为VS2005生成的主消息循环如下;
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
简单看看的确没有问题,但是当我们去查阅MSDN文档看到GetMessage消息时候可以看到这样一段
If there is an error, the return value is -1.
所以我们应该把上面这个主循环修改为下面这样的形式,增加一个临死变量。
// Main message loop:
BOOL bRet;//临时变量,存储GetMessage方法返回值
// Main message loop:
while ((bRet = GetMessage(&msg, NULL, 0, 0))!=0)
{
if(bRet==-1){
//表示GetMessage获得的信息有错误
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

(2)使用PeekMessage方法构造主消息循环
PeekMessage常常用于Windows开发游戏中,PeekMessage在处理获得消息时候和GetMessage一样,关键不同的是PeekMessage在没有消息处理的时候还会继续保持循环激活状态,并且继续占用资源。
// Main message loop:
while (true)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message == WM_QUIT){
break;
}
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//表示GetMessage获得的信息有错误
}
else{
//循环处理的函数

}
}:

posted on 2007-02-08 20:51 colys 阅读(1032) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理