// Main message handler for the sample. LRESULT CALLBACK DXSample::WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { DXSample* pSample = reinterpret_cast<DXSample*>(GetWindowLongPtr(hWnd, GWLP_USERDATA)); switch (message) { case WM_CREATE: { // Save a pointer to the DXSample passed in to CreateWindow. LPCREATESTRUCT pCreateStruct = reinterpret_cast<LPCREATESTRUCT>(lParam); SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pCreateStruct->lpCreateParams)); } return 0; case WM_PAINT: if (pSample) { pSample->OnUpdate(); pSample->OnRender(); } return 0; case WM_SIZE: if (pSample) { RECT clientRect = {}; GetClientRect(hWnd, &clientRect); pSample->OnSizeChanged(clientRect.right - clientRect.left, clientRect.bottom - clientRect.top, wParam == SIZE_MINIMIZED); } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } // Handle any messages the switch statement didn't. return DefWindowProc(hWnd, message, wParam, lParam); }
// Main message handler for the sample. LRESULT CALLBACK Win32Application::WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { DXSample* pSample = reinterpret_cast<DXSample*>(GetWindowLongPtr(hWnd, GWLP_USERDATA)); switch (message) { case WM_CREATE: { // Save the DXSample* passed in to CreateWindow. LPCREATESTRUCT pCreateStruct = reinterpret_cast<LPCREATESTRUCT>(lParam); SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pCreateStruct->lpCreateParams)); } return 0; case WM_KEYDOWN: if (pSample) { pSample->OnKeyDown(static_cast<UINT8>(wParam)); } return 0; case WM_KEYUP: if (pSample) { pSample->OnKeyUp(static_cast<UINT8>(wParam)); } return 0; case WM_SYSKEYDOWN: // Handle ALT+ENTER: if ((wParam == VK_RETURN) && (lParam & (1 << 29))) { if (pSample && pSample->GetDeviceResources()->IsTearingSupported()) { ToggleFullscreenWindow(pSample->GetSwapchain()); return 0; } } // Send all other WM_SYSKEYDOWN messages to the default WndProc. break; case WM_PAINT: if (pSample) { pSample->OnUpdate(); pSample->OnRender(); } return 0; case WM_SIZE: if (pSample) { RECT windowRect = {}; GetWindowRect(hWnd, &windowRect); pSample->SetWindowBounds(windowRect.left, windowRect.top, windowRect.right, windowRect.bottom); RECT clientRect = {}; GetClientRect(hWnd, &clientRect); pSample->OnSizeChanged(clientRect.right - clientRect.left, clientRect.bottom - clientRect.top, wParam == SIZE_MINIMIZED); } return 0; case WM_MOVE: if (pSample) { RECT windowRect = {}; GetWindowRect(hWnd, &windowRect); pSample->SetWindowBounds(windowRect.left, windowRect.top, windowRect.right, windowRect.bottom); int xPos = (int)(short)LOWORD(lParam); int yPos = (int)(short)HIWORD(lParam); pSample->OnWindowMoved(xPos, yPos); } return 0; case WM_DISPLAYCHANGE: if (pSample) { pSample->OnDisplayChanged(); } return 0; case WM_MOUSEMOVE: if (pSample && static_cast<UINT8>(wParam) == MK_LBUTTON) { UINT x = LOWORD(lParam); UINT y = HIWORD(lParam); pSample->OnMouseMove(x, y); } return 0; case WM_LBUTTONDOWN: { UINT x = LOWORD(lParam); UINT y = HIWORD(lParam); pSample->OnLeftButtonDown(x, y); } return 0; case WM_LBUTTONUP: { UINT x = LOWORD(lParam); UINT y = HIWORD(lParam); pSample->OnLeftButtonUp(x, y); } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } // Handle any messages the switch statement didn't. return DefWindowProc(hWnd, message, wParam, lParam); }