12 #ifndef WIN32_LEAN_AND_MEAN
13 #define WIN32_LEAN_AND_MEAN
19 #ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
22 #define IMGUI_IMPL_WIN32_DISABLE_LINKING_XINPUT
24 #if defined(_MSC_VER) && !defined(IMGUI_IMPL_WIN32_DISABLE_LINKING_XINPUT)
25 #pragma comment(lib, "xinput")
68 if (!::QueryPerformanceCounter((LARGE_INTEGER *)&
g_Time))
126 LPTSTR win32_cursor = IDC_ARROW;
127 switch (imgui_cursor)
139 ::SetCursor(::LoadCursor(
NULL, win32_cursor));
152 ::ClientToScreen(
g_hWnd, &pos);
159 if (HWND active_window = ::GetForegroundWindow())
160 if (active_window ==
g_hWnd || ::IsChild(active_window,
g_hWnd))
168 #ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
178 XINPUT_CAPABILITIES caps;
179 g_HasGamepad = (XInputGetCapabilities(0, XINPUT_FLAG_GAMEPAD, &caps) == ERROR_SUCCESS);
183 XINPUT_STATE xinput_state;
185 if (
g_HasGamepad && XInputGetState(0, &xinput_state) == ERROR_SUCCESS)
187 const XINPUT_GAMEPAD& gamepad = xinput_state.Gamepad;
190 #define MAP_BUTTON(NAV_NO, BUTTON_ENUM) { io.NavInputs[NAV_NO] = (gamepad.wButtons & BUTTON_ENUM) ? 1.0f : 0.0f; }
191 #define MAP_ANALOG(NAV_NO, VALUE, V0, V1) { float vn = (float)(VALUE - V0) / (float)(V1 - V0); if (vn > 1.0f) vn = 1.0f; if (vn > 0.0f && io.NavInputs[NAV_NO] < vn) io.NavInputs[NAV_NO] = vn; }
211 #endif // #ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
217 IM_ASSERT(io.
Fonts->
IsBuilt() &&
"Font atlas not built! It is generally built by the renderer back-end. Missing call to renderer _NewFrame() function? e.g. ImGui_ImplOpenGL3_NewFrame().");
221 ::GetClientRect(
g_hWnd, &rect);
222 io.
DisplaySize =
ImVec2((
float)(rect.right - rect.left), (
float)(rect.bottom - rect.top));
226 ::QueryPerformanceCounter((LARGE_INTEGER *)¤t_time);
231 io.
KeyCtrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0;
232 io.
KeyShift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;
233 io.
KeyAlt = (::GetKeyState(VK_MENU) & 0x8000) != 0;
253 #ifndef WM_MOUSEHWHEEL
254 #define WM_MOUSEHWHEEL 0x020E
256 #ifndef DBT_DEVNODES_CHANGED
257 #define DBT_DEVNODES_CHANGED 0x0007
280 case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
281 case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
282 case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
283 case WM_XBUTTONDOWN:
case WM_XBUTTONDBLCLK:
286 if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; }
287 if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; }
288 if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; }
289 if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
301 if (msg == WM_LBUTTONUP) { button = 0; }
302 if (msg == WM_RBUTTONUP) { button = 1; }
303 if (msg == WM_MBUTTONUP) { button = 2; }
304 if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
311 io.
MouseWheel += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA;
314 io.
MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA;
328 if (wParam > 0 && wParam < 0x10000)
335 case WM_DEVICECHANGE:
359 #if !defined(_versionhelpers_H_INCLUDED_) && !defined(_INC_VERSIONHELPERS)
362 OSVERSIONINFOEXW osvi = {
sizeof(osvi),
major,
minor, 0, 0, { 0 }, sp };
363 DWORD
mask = VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR;
364 ULONGLONG cond = ::VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL);
365 cond = ::VerSetConditionMask(cond, VER_MINORVERSION, VER_GREATER_EQUAL);
366 cond = ::VerSetConditionMask(cond, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
367 return ::VerifyVersionInfoW(&osvi,
mask, cond);
369 #define IsWindows8Point1OrGreater() IsWindowsVersionOrGreater(HIBYTE(0x0602), LOBYTE(0x0602), 0) // _WIN32_WINNT_WINBLUE
372 #ifndef DPI_ENUMS_DECLARED
376 #ifndef _DPI_AWARENESS_CONTEXTS_
378 #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE (DPI_AWARENESS_CONTEXT)-3
380 #ifndef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
381 #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 (DPI_AWARENESS_CONTEXT)-4
392 static HINSTANCE user32_dll = ::LoadLibraryA(
"user32.dll");
401 static HINSTANCE shcore_dll = ::LoadLibraryA(
"shcore.dll");
408 SetProcessDPIAware();
412 #pragma comment(lib, "gdi32") // Link with gdi32.lib for GetDeviceCaps()
417 UINT xdpi = 96, ydpi = 96;
420 static HINSTANCE shcore_dll = ::LoadLibraryA(
"shcore.dll");
426 const HDC dc = ::GetDC(
NULL);
427 xdpi = ::GetDeviceCaps(dc, LOGPIXELSX);
428 ydpi = ::GetDeviceCaps(dc, LOGPIXELSY);
429 ::ReleaseDC(
NULL, dc);
437 HMONITOR monitor = ::MonitorFromWindow((HWND)hwnd, MONITOR_DEFAULTTONEAREST);