// Enables mouse pointer device for hit-testing HRESULT Application::EnableMouseAsPointerDevice() { HRESULT hr = S_OK; if (!IsMouseInPointerEnabled()) { hr = (EnableMouseInPointer(TRUE) == FALSE) ? E_FAIL : S_OK; } return hr; }
int main() { UINT dpi = SetupDPI(); gRenderScale = 96.0 / double(dpi); // Scale default window size based on dpi gWindowWidth *= dpi / 96; gWindowHeight *= dpi / 96; // Create window { WNDCLASSEX wc; ZeroMemory(&wc, sizeof(wc)); wc.cbSize = sizeof(wc); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = MyWndProc; wc.hInstance = GetModuleHandle(NULL); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND; wc.lpszClassName = TEXT("WindowClass"); CHECK_WIN32(RegisterClassEx(&wc)); RECT wr = { 0, 0, gWindowWidth, gWindowHeight }; CHECK_WIN32(AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE)); ghWnd = CHECK_WIN32(CreateWindowEx( 0, TEXT("WindowClass"), TEXT("Spooky"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, wr.right - wr.left, wr.bottom - wr.top, 0, 0, GetModuleHandle(NULL), 0)); } // Create D3D11 device and swap chain { ComPtr<IDXGIFactory> pFactory; CHECK_HR(CreateDXGIFactory(IID_PPV_ARGS(&pFactory))); UINT deviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; #ifdef _DEBUG deviceFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif RECT clientRect; GetClientRect(ghWnd, &clientRect); DXGI_SWAP_CHAIN_DESC scd{}; scd.BufferCount = kSwapChainBufferCount; scd.BufferDesc.Format = kSwapChainFormat; scd.BufferDesc.Width = clientRect.right - clientRect.left; scd.BufferDesc.Height = clientRect.bottom - clientRect.top; scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; scd.OutputWindow = ghWnd; scd.Windowed = TRUE; scd.SampleDesc.Count = 1; scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; CHECK_HR(D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, deviceFlags, NULL, 0, D3D11_SDK_VERSION, &scd, &gpSwapChain, &gpDevice, NULL, &gpDeviceContext)); CHECK_HR(gpDevice.As(&gpDxgiDevice)); } InitApp(dpi); ShowWindow(ghWnd, SW_SHOWNORMAL); EnableMouseInPointer(TRUE); while (!gShouldClose) { // Handle all events MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } UpdateApp(); RenderApp(); // Swap buffers CHECK_HR(gpSwapChain->Present(0, 0)); } CoUninitialize(); // <- this currently creates problems with the WIC Factory. CHECK_HR(gpSwapChain->SetFullscreenState(FALSE, NULL)); }