#ifndef WIN32_H #define WIN32_H #include #include #include #include /* Convert narrow to wide string. */ std::wstring WideFromNarrow(const std::string_view src, const int cp = CP_UTF8); /* Run given procedure at creation of next window. */ void WithNextWindow(void (*proc)(HWND)); /* Display message box centered in main window. */ int EBMessageBox(std::wstring_view text, std::wstring_view data, UINT uType = MB_ICONWARNING); /* Retrieve mouse position relative to given window's client area. */ int GetRelativeCursorPos(HWND hWnd, POINT* pt) noexcept; /* Cached values from GetSystemMetrics. */ template auto Metric = GetSystemMetrics(I); /* Wrapper for loading and freeing dynamically linked libraries. */ struct Library { /* Non-throwing named constructor. */ static std::optional Maybe(const wchar_t* lib) noexcept; Library(const wchar_t* lib); ~Library() noexcept; template T* GetProcAddress(const char* szProc) noexcept; private: /* Non-throwing constructor used by Maybe. */ Library(HMODULE hModule) noexcept; HMODULE m_hModule; }; template T* Library::GetProcAddress(const char* const szProc) noexcept { return (T*)(void*)::GetProcAddress(m_hModule, szProc); } /* Return integer scaled for current DPI. */ inline int Dpi(const int i) { extern int g_dpi; return MulDiv(i, g_dpi, 96); } /* Retrieve given window's rectangle relative to parent's client area. */ inline BOOL GetRelativeRect(const HWND hWnd, RECT* const rr) { if (!GetClientRect(hWnd, rr)) return 0; return MapWindowPoints(hWnd, GetParent(hWnd), reinterpret_cast(rr), 2); } inline BOOL SetWindowRect(const HWND hWnd, const long left, const long top, const long right, const long bottom) { return MoveWindow(hWnd, left, top, right-left, bottom-top, TRUE); } inline BOOL SetWindowRect(const HWND hWnd, const RECT r) { return SetWindowRect(hWnd, r.left, r.top, r.right, r.bottom); } /* The following two functions call uxtheme.dll functions, if * uxtheme.dll exists, and otherwise do nothing. */ inline BOOL EBIsThemeActive() { extern BOOL (__stdcall *IsThemeActive)(); return IsThemeActive? IsThemeActive(): 0; } inline HRESULT EBSetWindowTheme(const HWND hWnd, const wchar_t* const pszSubAppName, const wchar_t* const pszSubIdList) { extern HRESULT (__stdcall *SetWindowTheme)(HWND, const wchar_t*, const wchar_t*); return SetWindowTheme? SetWindowTheme(hWnd, pszSubAppName, pszSubIdList): 0; } #endif