From 04daecdd21e86e7556a9462380096530228cd6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Wed, 3 Aug 2022 21:57:27 +0200 Subject: Split common.h to util.h, wcharptr.h and win.h. --- c/win.h | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 c/win.h (limited to 'c/win.h') diff --git a/c/win.h b/c/win.h new file mode 100644 index 0000000..038f8ea --- /dev/null +++ b/c/win.h @@ -0,0 +1,105 @@ +#ifndef WIN_H +#define WIN_H + +#include +#include + +int EBMessageBox(const wchar_t* wszText, const wchar_t* wszCaption, unsigned uType); +int GetRelativeCursorPos(HWND hWnd, POINT* pt); + +/* Win32Error: Exception for Windows API errors. */ +struct Win32Error : public std::exception +{ + Win32Error(); + Win32Error(DWORD code); + ~Win32Error(); + const char* what() const noexcept override; + const wchar_t* What() const noexcept; + DWORD code; +private: + char* m_szMsg = NULL; + wchar_t* m_wszMsg = NULL; +}; + +/* Library: Wrapper for loading and freeing dynamically linked libraries. */ +struct Library +{ + static std::optional Maybe(const wchar_t* lib); + Library(const wchar_t* lib); + ~Library(); + template T* GetProcAddress(const char* szProc); +private: + Library(HMODULE hModule); + HMODULE m_hModule; +}; + +template +T* Library::GetProcAddress(const char* const szProc) +{ + return (T*)(void*)::GetProcAddress(m_hModule, szProc); +} + +/* Variable template for caching values from GetSystemMetrics. */ +template +auto Metric = GetSystemMetrics(I); + +/* Check result of Windows API call, throwing error on NULL. */ +template +inline T require(const T x) +{ + if (!x) throw Win32Error(); + return x; +} + +/* Check result of Windows API call, showing a warning on NULL. */ +template +inline T prefer(const T x) +{ + if (!x) { + EBMessageBox(Win32Error().What(), L"System Error", MB_ICONWARNING); + return (T)NULL; + } + return x; +} + +/* Return integer scaled for current DPI. */ +inline int Dpi(const int i) +{ + extern int g_dpi; + return MulDiv(i, g_dpi, 96); +} + +/* Get window rectangle relative to parent. */ +inline BOOL GetRelativeRect(const HWND hWnd, RECT* const rr) +{ + if (!GetClientRect(hWnd, rr)) return 0; + return MapWindowPoints(hWnd, GetParent(hWnd), (POINT*)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); +} + +inline BOOL EBIsThemeActive() +{ + extern BOOL (*IsThemeActive)(); + return IsThemeActive? IsThemeActive(): 0; +} + +inline BOOL EBSetWindowTheme(HWND hWnd, LPCWSTR pszSubAppName, LPCWSTR pszSubIdList) +{ + extern BOOL (*SetWindowTheme)(HWND, LPCWSTR, LPCWSTR); + return SetWindowTheme? SetWindowTheme(hWnd, pszSubAppName, pszSubIdList): 0; +} + +#endif -- cgit v1.2.3