LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: SetWindowLong(hWnd, GWL_USERDATA, LONG(LPCREATESTRUCT(lParam)->lpCreateParams)); break; case WM_DESTROY: PostQuitMessage(0); printf("Destroy\n"); return 0; break; default: DisplayWindow* displayWindow = (DisplayWindow*)GetWindowLong(hWnd, GWL_USERDATA); if (displayWindow != NULL) { return displayWindow->handleMessage(hWnd, msg, wParam, lParam); } else { return DefWindowProc(hWnd, msg, wParam, lParam); } break; } return 0; }