diff options
author | John Ankarström <john@ankarstrom.se> | 2022-09-02 20:16:04 +0200 |
---|---|---|
committer | John Ankarström <john@ankarstrom.se> | 2022-09-02 20:16:18 +0200 |
commit | bc4cef92d8efbf97a9215122abc2d7247c287f12 (patch) | |
tree | a5ca307281c4f143b5f172428c9fd2b629d6b426 /c/win.h | |
parent | 5c1c2ce2bdbf9735ad8a4d162609a8c22a4f0954 (diff) | |
download | EpisodeBrowser-bc4cef92d8efbf97a9215122abc2d7247c287f12.tar.gz |
Improve Window object.
Diffstat (limited to 'c/win.h')
-rw-r--r-- | c/win.h | 153 |
1 files changed, 0 insertions, 153 deletions
diff --git a/c/win.h b/c/win.h deleted file mode 100644 index 1e09c1f..0000000 --- a/c/win.h +++ /dev/null @@ -1,153 +0,0 @@ -#ifndef WIN_H -#define WIN_H - -#include <optional> -#include <string_view> -#include <windows.h> -#include <commctrl.h> - -/* 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); - -/* Show message box for current exception. */ -void ShowException( - const wchar_t* fmt = L"An error occurred: %s", - const wchar_t* title = L"Error", - UINT uType = MB_ICONWARNING) noexcept; - -/* Retrieve mouse position relative to given window's client area. */ -int GetRelativeCursorPos(HWND hWnd, POINT* pt) noexcept; - -/* Cached values from GetSystemMetrics. */ -template <int I> auto Metric = GetSystemMetrics(I); - -struct WideException : public std::exception -{ - virtual const char* what() const noexcept = 0; - virtual const wchar_t* What() const noexcept = 0; -}; - -/* Exception for Windows API errors. */ -struct Win32Error : public WideException -{ - Win32Error(DWORD code = GetLastError(), HMODULE hModule = nullptr) noexcept; - ~Win32Error() noexcept; - const char* what() const noexcept override; - const wchar_t* What() const noexcept override; - DWORD code; -private: - HMODULE hModule; - char* m_szMsg = nullptr; - wchar_t* m_wszMsg = nullptr; -}; - -/* Exception for extended Wininet errors. */ -struct InternetError : public WideException -{ - InternetError(DWORD codeSystem = GetLastError()); - ~InternetError() noexcept; - const char* what() const noexcept override; - const wchar_t* What() const noexcept override; - DWORD code; -private: - char* m_szMsg = nullptr; - wchar_t* m_wszMsg = nullptr; -}; - -/* Wrapper for loading and freeing dynamically linked libraries. */ -struct Library -{ - /* Non-throwing named constructor. */ - static std::optional<Library> Maybe(const wchar_t* lib) noexcept; - - Library(const wchar_t* lib); - ~Library() noexcept; - - template <class T> T* GetProcAddress(const char* szProc) noexcept; -private: - /* Non-throwing constructor used by Maybe. */ - Library(HMODULE hModule) noexcept; - HMODULE m_hModule; -}; - -template <typename T> -T* Library::GetProcAddress(const char* const szProc) noexcept -{ - return (T*)(void*)::GetProcAddress(m_hModule, szProc); -} - -/* Check result of Windows API call, throwing error on null. */ -template <typename T> -inline T Require(const T x) -{ - if (!x) throw Win32Error(); - return x; -} - -/* Check result of Windows API call, showing a warning on null. */ -template <typename T> -inline T Prefer(const T x) -{ - if (!x) { - EBMessageBox(Win32Error().What(), L"System Error", MB_ICONWARNING); - return (T)0; - } - return x; -} - -/* 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<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); -} - -/* 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; -} - -inline void Status(const wchar_t* msg, unsigned short i = 0) -{ - extern HWND g_hWndStatus; - SendMessage(g_hWndStatus, SB_SETTEXT, MAKEWPARAM(i,0), reinterpret_cast<LPARAM>(msg)); -} - -#endif |