LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; static HANDLE hDrawThread = NULL; static HANDLE hAppThread = NULL; switch (message) { case WM_CHAR: if (wParam == VK_ESCAPE) PostQuitMessage(0); break; case WM_KEYDOWN: g_dev.OnKeyDown( (int)wParam ); break; case WM_KEYUP: g_dev.OnKeyUp( (int)wParam ); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); g_dev.Blit( hdc ); EndPaint(hWnd, &ps); break; case WM_CREATE: { g_running = TRUE; hDrawThread = CreateThread( NULL, NULL, &ThreadProcDraw, NULL, NULL, NULL ); hAppThread = CreateThread( NULL, NULL, &ThreadProcApp, NULL, NULL, NULL ); break; } case WM_CLOSE: g_running = FALSE; Sleep(10); DestroyWindow(hWnd); break; case WM_DESTROY: TerminateThread( hDrawThread, 1 ); TerminateThread( hAppThread, 1 ); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }