vc中DoEvent函數通常寫成:
git
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //非阻塞查看消息隊列是否有消息過來,有消息返回非零進入循環windows
//無消息返回0則跳出
{
TranslateMessage(&msg) ; //有消息時,虛擬鍵消息轉換爲字符消息
DispatchMessage(&msg);//發送消息給窗口程序
}ide
PeekMessage:函數
函數功能:該函數爲一個消息檢查線程消息隊列,並將該消息(若是存在)放於指定的結構。ui
函數原型:BOOL PeekMessage(LPMSG IpMsg,HWND hWnd,UINT wMSGfilterMin,UINT wMsgFilterMax,UINT wRemoveMsg);this
參數:編碼
lpMsg:接收消息信息的MSG結構指針。spa
hWnd:其消息被檢查的窗口的句柄。線程
wMsgFilterMin:指定被檢查的消息範圍裏的第一個消息。指針
wMsgFilterMax:指定被檢查的消息範圍裏的最後一個消息。
wRemoveMsg:肯定消息如何被處理。此參數可取下列值之一:
PM_NOREMOVE:PeekMessage處理後,消息不從隊列裏除掉
PM_REMOVE:PeekMessage處理後,消息從隊列裏除掉。
可將PM_NOYIELD隨意組合到PM_NOREMOVE或PM_REMOVE。此標誌使系統不釋放等待調用程序空閒的線程。
缺省地,處理全部類型的消息。若只處理某些消息,指定一個或多個下列值:
PM_QS_INPUT:Windows NT5.0和Windows 98:處理鼠標和鍵盤消息。
PM_QS_PAINT:Windows NT 5.0和Windows 98:處理畫圖消息。
PM_QS_POSTMESSAGE:Windows NT 5.0和Windows 98:處理全部被寄送的消息,包括計時器和熱鍵。
PM_QS_SENDMESSAGE:Windows NT 5.0和Windows 98:處理全部發送消息。
返回值:若是消息可獲得,返回非零值;若是沒有消息可獲得,返回值是零。
備註:和函數GetMessage不同的是,函數PeekMesssge在返回前不等待消息被放到隊列裏。
PeekMesssge只獲得那些與參數hWnd標識的窗口相聯繫的消息或被lsChild肯定爲其子窗口相聯繫的消息,而且該消息要在由參數 wMsgFiterMin和wMsgFiherMax肯定的範圍內。若是hWnd爲NULL,則PeekMessage接收屬於當前調用線程的窗口的消息 (PeekMessage不接收屬於其餘線程的窗口的消息)。若是hWnd爲-1,PeekMessage只返回hWnd值爲NULL的消息,該消息由函 數PostThreadMessage寄送。若是wMsgFilterMin和wMsgFilterMax都爲零,GetMessage返回全部可得的消 息(即,無範圍過濾)。
常數WM_KEYFIRST和WMKEYLAST可做爲過濾值取得全部鍵盤消息;常數WM_MOUSEFIRST和WM_MOUSELAST可用來接收全部的鼠標消息。
PeekMessage一般不從隊列裏清除WM_PANT消息。該消息將保留在隊列裏直處處理完畢。但若是WM_PAINT消息有一個空更新區,PeekMessage將從隊列裏清除WM_PAINT消息。
函數功能: 該函數將虛擬鍵消息轉換爲字符消息,(Windows 對全部鍵盤編碼都是採用虛擬鍵的定義,這樣當按鍵按下時,並不獲得字符消息,須要鍵盤映射轉換爲字符的消息),字符消息被函數DispatchMessage() 函數寄送到調用線程的消息隊列裏, 當下一次線程調用函數GetMessage() 或 PeekMessage() 時被讀出。
函數原型: BOOL TranslateMessage( CONST MSG* lpMsg );
參數: lpMsg: 指向含有消息的MSG結構的指針,該結構含有用函數GetMessage()或PeekMessage()從調用線程的消息隊列裏取得的消息信息。
擊鍵時: 當咱們敲擊鍵盤上某個字符鍵時,系統將產生WM_KEYDOWN 和 WM_KEYUP 消息,這兩個消息的附加參數(wParam和lParam)包含的是虛擬鍵代碼和掃描碼等信息,而咱們在程序中每每須要獲得的是某個字符的ASCII碼(也就是直觀上,能表明咱們點擊的是某個字符鍵)。 TranslateMessage函數就能夠將WM_KEYDOWN 和 WM_KEYUP 消息的組合轉化爲一條WM_CHAR消息(該消息的wParam附加參數包含了字符的ASCII碼), 並將轉換後的新消息投放到調用線程的消息隊列中。
返回值: 若是消息被轉化(即,字符消息被寄送到調用線程的消息隊列裏),返回非零值, 若是消息是WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP, 返回非零值,不考慮轉換。 若是消息沒被轉換,即字符消息沒有被寄送到調用線程的消息隊列裏,返回值是零。
備註: TranslateMessage函數不修改由參數lpMsg指向的消息。
消息WM_KEYDOWN和WM_KEYUP 組合產生一個WM_CHAR 或WM_DEADCHAR消息。
消息WM_SYSKEYDOWN和WM_SYSKEYUP組合產生一個WM_SYSCHAR或WM_SYSDEADCHAR消息。
TranslateMessage僅爲那些由鍵盤驅動器映射爲ASCII字符的鍵產生WM_CHAR消息。 若是應用程序爲其它用途而處理虛擬鍵消息,不該該調用TranslateMessage函數。 例如,若是TranslateAcceletator函數返回一個非零值,則應用程序將不調用TranslateMessage函數哦。
windows CE: Windows CE 不支持掃描碼或擴展鍵標誌,所以,它不支持由TranslateMessage函數產生的WM_CHAR 消息中的lKeyData 參數(lParam)的取值。
TranslateMessage函數只能用於轉換由GetMessage或PeekMessage、函數接受收到的消息。
DispatchMessage:
函數功能:該函數調度一個消息給窗口程序。一般調度從GetMessage取得的消息。消息被調度到的窗口程序便是MainProc()函數。
函數原型:LONG DispatchMessage(CONST MSG*lpmsg);
參數:
lpmsg:指向含有消息的MSG結構的指針。
返回值:返回值是窗口程序返回的值。儘管返回值的含義依賴於被調度的消息,但返回值一般被忽略。
備註:MSG結構必須包含有效的消息值。若是參數lpmsg指向一個WM_TIMER消息,而且WM_TIMER消息的參數IParam不爲NULL,則調用IPa1ram指向的函數,而不是調用窗口程序。
You can simulate the VB DoEvents() function using this:
bool DoEvents() { MSG msg; while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { returnfalse; } if (!AfxGetApp()->PreTranslateMessage(&msg)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } returntrue; }