diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 345f820..d0b3323 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -52,7 +52,16 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_APP_ICON ICON "resources\\app_icon.ico" +IDI_APP_ICON_LG ICON "resources\\knot_256.ico" +IDI_APP_ICON_SM ICON "resources\\knot_64.ico" + +IDI_APP_ICON_256 ICON "resources\\knot_256.ico" +IDI_APP_ICON_128 ICON "resources\\knot_128.ico" +IDI_APP_ICON_64 ICON "resources\\knot_64.ico" +IDI_APP_ICON_48 ICON "resources\\knot_48.ico" +IDI_APP_ICON_32 ICON "resources\\knot_32.ico" +IDI_APP_ICON_16 ICON "resources\\knot_16.ico" + ///////////////////////////////////////////////////////////////////////////// diff --git a/windows/runner/resource.h b/windows/runner/resource.h index 66a65d1..48e5f82 100644 --- a/windows/runner/resource.h +++ b/windows/runner/resource.h @@ -2,7 +2,16 @@ // Microsoft Visual C++ generated include file. // Used by Runner.rc // -#define IDI_APP_ICON 101 +#define IDI_APP_ICON_LG 101 +#define IDI_APP_ICON_SM 102 + +#define IDI_APP_ICON_256 103 +#define IDI_APP_ICON_128 104 +#define IDI_APP_ICON_64 105 +#define IDI_APP_ICON_48 106 +#define IDI_APP_ICON_32 107 +#define IDI_APP_ICON_16 108 + // Next default values for new objects // diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico deleted file mode 100644 index 7e2acda..0000000 Binary files a/windows/runner/resources/app_icon.ico and /dev/null differ diff --git a/windows/runner/resources/knot_128.ico b/windows/runner/resources/knot_128.ico new file mode 100644 index 0000000..d35e28f Binary files /dev/null and b/windows/runner/resources/knot_128.ico differ diff --git a/windows/runner/resources/knot_16.ico b/windows/runner/resources/knot_16.ico new file mode 100644 index 0000000..42fa6e9 Binary files /dev/null and b/windows/runner/resources/knot_16.ico differ diff --git a/windows/runner/resources/knot_256.ico b/windows/runner/resources/knot_256.ico new file mode 100644 index 0000000..2e0f50a Binary files /dev/null and b/windows/runner/resources/knot_256.ico differ diff --git a/windows/runner/resources/knot_32.ico b/windows/runner/resources/knot_32.ico new file mode 100644 index 0000000..da12547 Binary files /dev/null and b/windows/runner/resources/knot_32.ico differ diff --git a/windows/runner/resources/knot_48.ico b/windows/runner/resources/knot_48.ico new file mode 100644 index 0000000..169ba2c Binary files /dev/null and b/windows/runner/resources/knot_48.ico differ diff --git a/windows/runner/resources/knot_64.ico b/windows/runner/resources/knot_64.ico new file mode 100644 index 0000000..74a28e0 Binary files /dev/null and b/windows/runner/resources/knot_64.ico differ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp index c10f08d..ad68d53 100644 --- a/windows/runner/win32_window.cpp +++ b/windows/runner/win32_window.cpp @@ -1,4 +1,5 @@ #include "win32_window.h" +#include "winuser.h" #include @@ -70,19 +71,49 @@ WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; const wchar_t* WindowClassRegistrar::GetWindowClass() { if (!class_registered_) { - WNDCLASS window_class{}; + WNDCLASSEX window_class{}; + window_class.cbSize = sizeof(WNDCLASSEX); window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); window_class.lpszClassName = kWindowClassName; window_class.style = CS_HREDRAW | CS_VREDRAW; window_class.cbClsExtra = 0; window_class.cbWndExtra = 0; window_class.hInstance = GetModuleHandle(nullptr); + int icon_sz = GetSystemMetrics(SM_CXICON); + int iconh_id = IDI_APP_ICON_32; + if (icon_sz > 128) { + iconh_id = IDI_APP_ICON_256; + } else if (icon_sz > 64) { + iconh_id = IDI_APP_ICON_128; + } else if (icon_sz > 48) { + iconh_id = IDI_APP_ICON_64; + } else if (icon_sz > 32) { + iconh_id = IDI_APP_ICON_48; + } window_class.hIcon = - LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(iconh_id)); + + + int icon_sm_sz = GetSystemMetrics(SM_CXSMICON); + int iconsmh_id = IDI_APP_ICON_16; + if (icon_sm_sz > 128) { + iconsmh_id = IDI_APP_ICON_256; + } else if (icon_sm_sz > 64) { + iconsmh_id = IDI_APP_ICON_128; + } else if (icon_sm_sz > 48) { + iconsmh_id = IDI_APP_ICON_64; + } else if (icon_sm_sz > 32) { + iconsmh_id = IDI_APP_ICON_48; + } else if (icon_sm_sz > 16) { + iconsmh_id = IDI_APP_ICON_32; + } + window_class.hIconSm = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(iconsmh_id)); + window_class.hbrBackground = 0; window_class.lpszMenuName = nullptr; window_class.lpfnWndProc = Win32Window::WndProc; - RegisterClass(&window_class); + RegisterClassEx(&window_class); class_registered_ = true; } return kWindowClassName;