diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2020-07-06 16:03:23 +1000 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2020-07-06 21:30:49 +1000 |
commit | a44cba1e241d0aa7d5c64595e9e7c95d0f06cced (patch) | |
tree | a72d182b4d65e7ebd623e04b18ab6db950721cd4 /src/dutil/thmutil.cpp | |
parent | e586152b76d62dbf38cd2882819e23eee2e0af7f (diff) | |
download | wix-a44cba1e241d0aa7d5c64595e9e7c95d0f06cced.tar.gz wix-a44cba1e241d0aa7d5c64595e9e7c95d0f06cced.tar.bz2 wix-a44cba1e241d0aa7d5c64595e9e7c95d0f06cced.zip |
Start High-DPI support by scaling the parent window according to the DPI.
Diffstat (limited to 'src/dutil/thmutil.cpp')
-rw-r--r-- | src/dutil/thmutil.cpp | 90 |
1 files changed, 82 insertions, 8 deletions
diff --git a/src/dutil/thmutil.cpp b/src/dutil/thmutil.cpp index 2050b420..4cc149c9 100644 --- a/src/dutil/thmutil.cpp +++ b/src/dutil/thmutil.cpp | |||
@@ -287,6 +287,11 @@ static BOOL OnButtonClicked( | |||
287 | __in HWND hWnd, | 287 | __in HWND hWnd, |
288 | __in const THEME_CONTROL* pControl | 288 | __in const THEME_CONTROL* pControl |
289 | ); | 289 | ); |
290 | static BOOL OnDpiChanged( | ||
291 | __in THEME* pTheme, | ||
292 | __in WPARAM wParam, | ||
293 | __in LPARAM lParam | ||
294 | ); | ||
290 | static void OnNcCreate( | 295 | static void OnNcCreate( |
291 | __in THEME* pTheme, | 296 | __in THEME* pTheme, |
292 | __in HWND hWnd, | 297 | __in HWND hWnd, |
@@ -353,6 +358,12 @@ static void ResizeControl( | |||
353 | __in THEME_CONTROL* pControl, | 358 | __in THEME_CONTROL* pControl, |
354 | __in const RECT* prcParent | 359 | __in const RECT* prcParent |
355 | ); | 360 | ); |
361 | static void ScaleTheme( | ||
362 | __in THEME* pTheme, | ||
363 | __in UINT nDpi, | ||
364 | __in int x, | ||
365 | __in int y | ||
366 | ); | ||
356 | static void GetControls( | 367 | static void GetControls( |
357 | __in THEME* pTheme, | 368 | __in THEME* pTheme, |
358 | __in_opt THEME_CONTROL* pParentControl, | 369 | __in_opt THEME_CONTROL* pParentControl, |
@@ -380,6 +391,8 @@ DAPI_(HRESULT) ThemeInitialize( | |||
380 | HRESULT hr = S_OK; | 391 | HRESULT hr = S_OK; |
381 | INITCOMMONCONTROLSEX icex = { }; | 392 | INITCOMMONCONTROLSEX icex = { }; |
382 | 393 | ||
394 | DpiuInitialize(); | ||
395 | |||
383 | hr = XmlInitialize(); | 396 | hr = XmlInitialize(); |
384 | ThmExitOnFailure(hr, "Failed to initialize XML."); | 397 | ThmExitOnFailure(hr, "Failed to initialize XML."); |
385 | 398 | ||
@@ -430,6 +443,7 @@ DAPI_(void) ThemeUninitialize() | |||
430 | } | 443 | } |
431 | 444 | ||
432 | XmlUninitialize(); | 445 | XmlUninitialize(); |
446 | DpiuUninitialize(); | ||
433 | } | 447 | } |
434 | 448 | ||
435 | 449 | ||
@@ -797,10 +811,10 @@ extern "C" LRESULT CALLBACK ThemeDefWindowProc( | |||
797 | } | 811 | } |
798 | break; | 812 | break; |
799 | 813 | ||
800 | case WM_WINDOWPOSCHANGED: | 814 | case WM_DPICHANGED: |
815 | if (OnDpiChanged(pTheme, wParam, lParam)) | ||
801 | { | 816 | { |
802 | //WINDOWPOS* pos = reinterpret_cast<LPWINDOWPOS>(lParam); | 817 | return 0; |
803 | //ThemeWindowPositionChanged(pTheme, pos); | ||
804 | } | 818 | } |
805 | break; | 819 | break; |
806 | 820 | ||
@@ -1652,6 +1666,7 @@ static HRESULT ParseTheme( | |||
1652 | ThmExitOnNull(pTheme, hr, E_OUTOFMEMORY, "Failed to allocate memory for theme."); | 1666 | ThmExitOnNull(pTheme, hr, E_OUTOFMEMORY, "Failed to allocate memory for theme."); |
1653 | 1667 | ||
1654 | pTheme->wId = ++wThemeId; | 1668 | pTheme->wId = ++wThemeId; |
1669 | pTheme->nDpi = USER_DEFAULT_SCREEN_DPI; | ||
1655 | 1670 | ||
1656 | // Parse the optional background resource image. | 1671 | // Parse the optional background resource image. |
1657 | hr = ParseImage(hModule, wzRelativePath, pThemeElement, &pTheme->hImage); | 1672 | hr = ParseImage(hModule, wzRelativePath, pThemeElement, &pTheme->hImage); |
@@ -1816,6 +1831,7 @@ static HRESULT ParseWindow( | |||
1816 | { | 1831 | { |
1817 | HRESULT hr = S_OK; | 1832 | HRESULT hr = S_OK; |
1818 | IXMLDOMNode* pixn = NULL; | 1833 | IXMLDOMNode* pixn = NULL; |
1834 | DWORD dwValue = 0; | ||
1819 | BSTR bstr = NULL; | 1835 | BSTR bstr = NULL; |
1820 | LPWSTR sczIconFile = NULL; | 1836 | LPWSTR sczIconFile = NULL; |
1821 | 1837 | ||
@@ -1833,7 +1849,7 @@ static HRESULT ParseWindow( | |||
1833 | } | 1849 | } |
1834 | ThmExitOnFailure(hr, "Failed to get window AutoResize attribute."); | 1850 | ThmExitOnFailure(hr, "Failed to get window AutoResize attribute."); |
1835 | 1851 | ||
1836 | hr = XmlGetAttributeNumber(pixn, L"Width", reinterpret_cast<DWORD*>(&pTheme->nWidth)); | 1852 | hr = XmlGetAttributeNumber(pixn, L"Width", &dwValue); |
1837 | if (S_FALSE == hr) | 1853 | if (S_FALSE == hr) |
1838 | { | 1854 | { |
1839 | hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); | 1855 | hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); |
@@ -1841,7 +1857,9 @@ static HRESULT ParseWindow( | |||
1841 | } | 1857 | } |
1842 | ThmExitOnFailure(hr, "Failed to get window Width attribute."); | 1858 | ThmExitOnFailure(hr, "Failed to get window Width attribute."); |
1843 | 1859 | ||
1844 | hr = XmlGetAttributeNumber(pixn, L"Height", reinterpret_cast<DWORD*>(&pTheme->nHeight)); | 1860 | pTheme->nWidth = pTheme->nDefaultDpiWidth = dwValue; |
1861 | |||
1862 | hr = XmlGetAttributeNumber(pixn, L"Height", &dwValue); | ||
1845 | if (S_FALSE == hr) | 1863 | if (S_FALSE == hr) |
1846 | { | 1864 | { |
1847 | hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); | 1865 | hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); |
@@ -1849,20 +1867,28 @@ static HRESULT ParseWindow( | |||
1849 | } | 1867 | } |
1850 | ThmExitOnFailure(hr, "Failed to get window Height attribute."); | 1868 | ThmExitOnFailure(hr, "Failed to get window Height attribute."); |
1851 | 1869 | ||
1852 | hr = XmlGetAttributeNumber(pixn, L"MinimumWidth", reinterpret_cast<DWORD*>(&pTheme->nMinimumWidth)); | 1870 | pTheme->nHeight = pTheme->nDefaultDpiHeight = dwValue; |
1871 | |||
1872 | hr = XmlGetAttributeNumber(pixn, L"MinimumWidth", &dwValue); | ||
1853 | if (S_FALSE == hr) | 1873 | if (S_FALSE == hr) |
1854 | { | 1874 | { |
1875 | dwValue = 0; | ||
1855 | hr = S_OK; | 1876 | hr = S_OK; |
1856 | } | 1877 | } |
1857 | ThmExitOnFailure(hr, "Failed to get window MinimumWidth attribute."); | 1878 | ThmExitOnFailure(hr, "Failed to get window MinimumWidth attribute."); |
1858 | 1879 | ||
1859 | hr = XmlGetAttributeNumber(pixn, L"MinimumHeight", reinterpret_cast<DWORD*>(&pTheme->nMinimumHeight)); | 1880 | pTheme->nMinimumWidth = pTheme->nDefaultDpiMinimumWidth = dwValue; |
1881 | |||
1882 | hr = XmlGetAttributeNumber(pixn, L"MinimumHeight", &dwValue); | ||
1860 | if (S_FALSE == hr) | 1883 | if (S_FALSE == hr) |
1861 | { | 1884 | { |
1885 | dwValue = 0; | ||
1862 | hr = S_OK; | 1886 | hr = S_OK; |
1863 | } | 1887 | } |
1864 | ThmExitOnFailure(hr, "Failed to get window MinimumHeight attribute."); | 1888 | ThmExitOnFailure(hr, "Failed to get window MinimumHeight attribute."); |
1865 | 1889 | ||
1890 | pTheme->nMinimumHeight = pTheme->nDefaultDpiMinimumHeight = dwValue; | ||
1891 | |||
1866 | hr = XmlGetAttributeNumber(pixn, L"FontId", &pTheme->dwFontId); | 1892 | hr = XmlGetAttributeNumber(pixn, L"FontId", &pTheme->dwFontId); |
1867 | if (S_FALSE == hr) | 1893 | if (S_FALSE == hr) |
1868 | { | 1894 | { |
@@ -4161,14 +4187,45 @@ static BOOL OnButtonClicked( | |||
4161 | LExit: | 4187 | LExit: |
4162 | return fHandled; | 4188 | return fHandled; |
4163 | } | 4189 | } |
4190 | |||
4191 | static BOOL OnDpiChanged( | ||
4192 | __in THEME* pTheme, | ||
4193 | __in WPARAM wParam, | ||
4194 | __in LPARAM lParam | ||
4195 | ) | ||
4196 | { | ||
4197 | UINT nDpi = HIWORD(wParam); | ||
4198 | RECT* pRect = reinterpret_cast<RECT*>(lParam); | ||
4199 | BOOL fIgnored = pTheme->nDpi == nDpi; | ||
4200 | |||
4201 | if (fIgnored) | ||
4202 | { | ||
4203 | ExitFunction(); | ||
4204 | } | ||
4205 | |||
4206 | ScaleTheme(pTheme, nDpi, pRect->left, pRect->top); | ||
4207 | |||
4208 | LExit: | ||
4209 | return !fIgnored; | ||
4210 | } | ||
4164 | 4211 | ||
4165 | static void OnNcCreate( | 4212 | static void OnNcCreate( |
4166 | __in THEME* pTheme, | 4213 | __in THEME* pTheme, |
4167 | __in HWND hWnd, | 4214 | __in HWND hWnd, |
4168 | __in LPARAM /*lParam*/ | 4215 | __in LPARAM lParam |
4169 | ) | 4216 | ) |
4170 | { | 4217 | { |
4218 | DPIU_WINDOW_CONTEXT windowContext = { }; | ||
4219 | CREATESTRUCTW* pCreateStruct = reinterpret_cast<CREATESTRUCTW*>(lParam); | ||
4220 | |||
4171 | pTheme->hwndParent = hWnd; | 4221 | pTheme->hwndParent = hWnd; |
4222 | |||
4223 | DpiuGetWindowContext(pTheme->hwndParent, &windowContext); | ||
4224 | |||
4225 | if (windowContext.nDpi != pTheme->nDpi) | ||
4226 | { | ||
4227 | ScaleTheme(pTheme, windowContext.nDpi, pCreateStruct->x, pCreateStruct->y); | ||
4228 | } | ||
4172 | } | 4229 | } |
4173 | 4230 | ||
4174 | static HRESULT OnRichEditEnLink( | 4231 | static HRESULT OnRichEditEnLink( |
@@ -5282,6 +5339,23 @@ static void ResizeControl( | |||
5282 | } | 5339 | } |
5283 | } | 5340 | } |
5284 | 5341 | ||
5342 | static void ScaleTheme( | ||
5343 | __in THEME* pTheme, | ||
5344 | __in UINT nDpi, | ||
5345 | __in int x, | ||
5346 | __in int y | ||
5347 | ) | ||
5348 | { | ||
5349 | pTheme->nDpi = nDpi; | ||
5350 | |||
5351 | pTheme->nHeight = DpiuScaleValue(pTheme->nDefaultDpiHeight, pTheme->nDpi); | ||
5352 | pTheme->nWidth = DpiuScaleValue(pTheme->nDefaultDpiWidth, pTheme->nDpi); | ||
5353 | pTheme->nMinimumHeight = DpiuScaleValue(pTheme->nDefaultDpiMinimumHeight, pTheme->nDpi); | ||
5354 | pTheme->nMinimumWidth = DpiuScaleValue(pTheme->nDefaultDpiMinimumWidth, pTheme->nDpi); | ||
5355 | |||
5356 | ::SetWindowPos(pTheme->hwndParent, NULL, x, y, pTheme->nWidth, pTheme->nHeight, SWP_NOACTIVATE | SWP_NOZORDER); | ||
5357 | } | ||
5358 | |||
5285 | static void UnloadControls( | 5359 | static void UnloadControls( |
5286 | __in DWORD cControls, | 5360 | __in DWORD cControls, |
5287 | __in THEME_CONTROL* rgControls | 5361 | __in THEME_CONTROL* rgControls |