本文主要介紹了Win32 API主消息循環(huán)的兩種處理方法:使用GetMessage方法構(gòu)造主消息循環(huán)、使用PeekMessage方法構(gòu)造主消息循環(huán)。
(1)使用GetMessage方法構(gòu)造主消息循環(huán)
一般應(yīng)用程序都使用用GetMessage方法構(gòu)造主消息循環(huán),該方法是獲得一條線程 的消息。對(duì)于VS2005自動(dòng)生成的Win32 Windows程序上面有些不足。
因?yàn)閂S2005生成的主消息循環(huán)如下;
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
簡(jiǎn)單看看的確沒(méi)有問(wèn)題,但是當(dāng)我們?nèi)ゲ殚哅SDN文檔看到GetMessage消息時(shí)候可以看到這樣一段
If there is an error, the return value is -1.
所以我們應(yīng)該把上面這個(gè)主循環(huán)修改為下面這樣的形式,增加一個(gè)臨死變量。
// Main message loop:
BOOL bRet;//臨時(shí)變量,存儲(chǔ)GetMessage方法返回值
// Main message loop:
while ((bRet = GetMessage(&msg, NULL, 0, 0))!=0)
{
if(bRet==-1){
//表示GetMessage獲得的信息有錯(cuò)誤
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
(2)使用PeekMessage方法構(gòu)造主消息循環(huán)
PeekMessage常常用于Windows開(kāi)發(fā)游戲中,PeekMessage在處理獲得消息時(shí)候和GetMessage一樣,關(guān)鍵不同的是PeekMessage在沒(méi)有消息處理的時(shí)候還會(huì)繼續(xù)保持循環(huán)激活狀態(tài),并且繼續(xù)占用資源。
// 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獲得的信息有錯(cuò)誤
}
else{
//循環(huán)處理的函數(shù)
}
}: