Win32的Gameloop的滑順問題(2)
前言
還記得前一篇裡Win32的Gameloop的滑順問題(1)有個沒解決的問題嗎?就是會有一個20mSecs的MSG的問題,這裡找到答案了,在此做個紀錄。內容
在Win32的Gameloop裡的接收視窗訊息的程式碼如下while( true ) { if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { if ( WM_QUIT == msg.message ) { break; } else { TranslateMessage( &msg); DispatchMessage( &msg); } } else { gameloop(); } }
裡面的PeekMessage()的第二個參數是NULL,接著看PeekMessage的說明,會發現當第二個參數是NULL時,會接收所有的訊息,所以將第二個參數改成主要的視窗後,發現那一個20mSecs的MSG遽然不見了!本以為事情這樣就解決了,但當按下視窗右上角的叉叉後,程式會變得無法關閉,原因是WM_QUIT這個MSG再也收不到了,所以當按下叉叉後,迴圈並能正常跳出,解決的程式碼如下
bool isAppRun=true;//global var... LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT ps; HDC hdc; switch( message ) { case WM_PAINT: hdc = BeginPaint( hWnd, &ps ); EndPaint( hWnd, &ps ); break; case WM_DESTROY: PostQuitMessage( 0 ); isAppRun= false; break; default: return DefWindowProc( hWnd, message, wParam, lParam ); } return 0; } //... int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow ) { //... // while( WM_QUIT != msg.message && isAppRun) { if( PeekMessage( &msg, hWnd, 0, 0, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { gameloop(); } } }
新增一個isAppRun,在WndProc裡處理WM_DESTROY裡設為false,接著按下叉叉後就可以順利跳出迴圈了。
沒有留言:
張貼留言