From 1f85dac530dee933457e99438fd1c82485a2a48e Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 4 Jun 2021 13:38:28 -0500 Subject: Fix bug where theme window didn't enlarge client area for default DPI. --- src/libs/dutil/WixToolset.DUtil/thmutil.cpp | 42 ++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp index a3dce4c2..53257d8e 100644 --- a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp @@ -526,6 +526,12 @@ static void ScaleTheme( __in BOOL fMenu, __in DWORD dwExStyle ); +static void AdjustThemeWindowRect( + __in THEME* pTheme, + __in DWORD dwStyle, + __in BOOL fMenu, + __in DWORD dwExStyle + ); static void ScaleControls( __in THEME* pTheme, __in DWORD cControls, @@ -809,6 +815,7 @@ DAPI_(HRESULT) ThemeCreateParentWindow( RECT* pMonitorRect = NULL; HMENU hMenu = NULL; HWND hWnd = NULL; + BOOL fScaledTheme = FALSE; if (pTheme->hwndParent) { @@ -826,6 +833,7 @@ DAPI_(HRESULT) ThemeCreateParentWindow( if (pMonitorContext->nDpi != pTheme->nDpi) { ScaleTheme(pTheme, pMonitorContext->nDpi, pMonitorRect->left, pMonitorRect->top, dwStyle, NULL != hMenu, dwExStyle); + fScaledTheme = TRUE; } x = pMonitorRect->left + (pMonitorRect->right - pMonitorRect->left - pTheme->nWindowWidth) / 2; @@ -839,6 +847,12 @@ DAPI_(HRESULT) ThemeCreateParentWindow( } } + // Make sure the client area matches the specified width and height. + if (!fScaledTheme) + { + AdjustThemeWindowRect(pTheme, dwStyle, NULL != hMenu, dwExStyle); + } + hWnd = ::CreateWindowExW(dwExStyle, szClassName, szWindowName, dwStyle, x, y, pTheme->nWindowWidth, pTheme->nWindowHeight, hwndParent, hMenu, hInstance, lpParam); ThmExitOnNullWithLastError(hWnd, hr, "Failed to create theme parent window."); ThmExitOnNull(pTheme->hwndParent, hr, E_INVALIDSTATE, "Theme parent window is not set, make sure ThemeDefWindowProc is called for WM_NCCREATE."); @@ -6597,8 +6611,6 @@ static void ScaleTheme( __in DWORD dwExStyle ) { - RECT rect = { }; - pTheme->nDpi = nDpi; pTheme->nHeight = DpiuScaleValue(pTheme->nDefaultDpiHeight, pTheme->nDpi); @@ -6606,13 +6618,7 @@ static void ScaleTheme( pTheme->nMinimumHeight = DpiuScaleValue(pTheme->nDefaultDpiMinimumHeight, pTheme->nDpi); pTheme->nMinimumWidth = DpiuScaleValue(pTheme->nDefaultDpiMinimumWidth, pTheme->nDpi); - rect.left = x; - rect.top = y; - rect.right = x + pTheme->nWidth; - rect.bottom = y + pTheme->nHeight; - DpiuAdjustWindowRect(&rect, dwStyle, fMenu, dwExStyle, pTheme->nDpi); - pTheme->nWindowWidth = rect.right - rect.left; - pTheme->nWindowHeight = rect.bottom - rect.top; + AdjustThemeWindowRect(pTheme, dwStyle, fMenu, dwExStyle); ScaleControls(pTheme, pTheme->cControls, pTheme->rgControls, pTheme->nDpi); @@ -6622,6 +6628,24 @@ static void ScaleTheme( } } +static void AdjustThemeWindowRect( + __in THEME* pTheme, + __in DWORD dwStyle, + __in BOOL fMenu, + __in DWORD dwExStyle + ) +{ + RECT rect = { }; + + rect.left = 0; + rect.top = 0; + rect.right = pTheme->nWidth; + rect.bottom = pTheme->nHeight; + DpiuAdjustWindowRect(&rect, dwStyle, fMenu, dwExStyle, pTheme->nDpi); + pTheme->nWindowWidth = rect.right - rect.left; + pTheme->nWindowHeight = rect.bottom - rect.top; +} + static void ScaleControls( __in THEME* pTheme, __in DWORD cControls, -- cgit v1.2.3-55-g6feb