diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2020-07-06 19:22:37 +1000 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2020-07-06 21:30:49 +1000 |
| commit | 219964095a1f4678d8c8e7ae2685c52392161ca2 (patch) | |
| tree | 2eff04c6a6bfebbc05b667a3bd1fa5ebf04edf6d /src/dutil/thmutil.cpp | |
| parent | abeba64d77336b3fbf9aafe9ecc66b779c1e5d02 (diff) | |
| download | wix-219964095a1f4678d8c8e7ae2685c52392161ca2.tar.gz wix-219964095a1f4678d8c8e7ae2685c52392161ca2.tar.bz2 wix-219964095a1f4678d8c8e7ae2685c52392161ca2.zip | |
WIXFEAT:4906 Make Window's Height and Width refer to its client area.
Diffstat (limited to 'src/dutil/thmutil.cpp')
| -rw-r--r-- | src/dutil/thmutil.cpp | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/src/dutil/thmutil.cpp b/src/dutil/thmutil.cpp index a1b101e8..75b0e4a0 100644 --- a/src/dutil/thmutil.cpp +++ b/src/dutil/thmutil.cpp | |||
| @@ -367,12 +367,21 @@ static void ResizeControl( | |||
| 367 | __in THEME_CONTROL* pControl, | 367 | __in THEME_CONTROL* pControl, |
| 368 | __in const RECT* prcParent | 368 | __in const RECT* prcParent |
| 369 | ); | 369 | ); |
| 370 | static void ScaleTheme( | 370 | static void ScaleThemeFromWindow( |
| 371 | __in THEME* pTheme, | 371 | __in THEME* pTheme, |
| 372 | __in UINT nDpi, | 372 | __in UINT nDpi, |
| 373 | __in int x, | 373 | __in int x, |
| 374 | __in int y | 374 | __in int y |
| 375 | ); | 375 | ); |
| 376 | static void ScaleTheme( | ||
| 377 | __in THEME* pTheme, | ||
| 378 | __in UINT nDpi, | ||
| 379 | __in int x, | ||
| 380 | __in int y, | ||
| 381 | __in DWORD dwStyle, | ||
| 382 | __in BOOL fMenu, | ||
| 383 | __in DWORD dwExStyle | ||
| 384 | ); | ||
| 376 | static void ScaleControls( | 385 | static void ScaleControls( |
| 377 | __in THEME* pTheme, | 386 | __in THEME* pTheme, |
| 378 | __in DWORD cControls, | 387 | __in DWORD cControls, |
| @@ -611,6 +620,7 @@ DAPI_(HRESULT) ThemeCreateParentWindow( | |||
| 611 | DPIU_MONITOR_CONTEXT* pMonitorContext = NULL; | 620 | DPIU_MONITOR_CONTEXT* pMonitorContext = NULL; |
| 612 | POINT pt = { }; | 621 | POINT pt = { }; |
| 613 | RECT* pMonitorRect = NULL; | 622 | RECT* pMonitorRect = NULL; |
| 623 | HMENU hMenu = NULL; | ||
| 614 | HWND hWnd = NULL; | 624 | HWND hWnd = NULL; |
| 615 | 625 | ||
| 616 | if (pTheme->hwndParent) | 626 | if (pTheme->hwndParent) |
| @@ -628,11 +638,11 @@ DAPI_(HRESULT) ThemeCreateParentWindow( | |||
| 628 | pMonitorRect = &pMonitorContext->mi.rcWork; | 638 | pMonitorRect = &pMonitorContext->mi.rcWork; |
| 629 | if (pMonitorContext->nDpi != pTheme->nDpi) | 639 | if (pMonitorContext->nDpi != pTheme->nDpi) |
| 630 | { | 640 | { |
| 631 | ScaleTheme(pTheme, pMonitorContext->nDpi, pMonitorRect->left, pMonitorRect->top); | 641 | ScaleTheme(pTheme, pMonitorContext->nDpi, pMonitorRect->left, pMonitorRect->top, dwStyle, NULL != hMenu, dwExStyle); |
| 632 | } | 642 | } |
| 633 | 643 | ||
| 634 | x = pMonitorRect->left + (pMonitorRect->right - pMonitorRect->left - pTheme->nWidth) / 2; | 644 | x = pMonitorRect->left + (pMonitorRect->right - pMonitorRect->left - pTheme->nWindowWidth) / 2; |
| 635 | y = pMonitorRect->top + (pMonitorRect->bottom - pMonitorRect->top - pTheme->nHeight) / 2; | 645 | y = pMonitorRect->top + (pMonitorRect->bottom - pMonitorRect->top - pTheme->nWindowHeight) / 2; |
| 636 | } | 646 | } |
| 637 | else | 647 | else |
| 638 | { | 648 | { |
| @@ -641,7 +651,7 @@ DAPI_(HRESULT) ThemeCreateParentWindow( | |||
| 641 | } | 651 | } |
| 642 | } | 652 | } |
| 643 | 653 | ||
| 644 | hWnd = ::CreateWindowExW(dwExStyle, szClassName, szWindowName, dwStyle, x, y, pTheme->nWidth, pTheme->nHeight, hwndParent, NULL, hInstance, lpParam); | 654 | hWnd = ::CreateWindowExW(dwExStyle, szClassName, szWindowName, dwStyle, x, y, pTheme->nWindowWidth, pTheme->nWindowHeight, hwndParent, hMenu, hInstance, lpParam); |
| 645 | ThmExitOnNullWithLastError(hWnd, hr, "Failed to create theme parent window."); | 655 | ThmExitOnNullWithLastError(hWnd, hr, "Failed to create theme parent window."); |
| 646 | ThmExitOnNull(pTheme->hwndParent, hr, E_INVALIDSTATE, "Theme parent window is not set, make sure ThemeDefWindowProc is called for WM_NCCREATE."); | 656 | ThmExitOnNull(pTheme->hwndParent, hr, E_INVALIDSTATE, "Theme parent window is not set, make sure ThemeDefWindowProc is called for WM_NCCREATE."); |
| 647 | AssertSz(hWnd == pTheme->hwndParent, "Theme parent window does not equal newly created window."); | 657 | AssertSz(hWnd == pTheme->hwndParent, "Theme parent window does not equal newly created window."); |
| @@ -1909,7 +1919,7 @@ static HRESULT ParseWindow( | |||
| 1909 | } | 1919 | } |
| 1910 | ThmExitOnFailure(hr, "Failed to get window Width attribute."); | 1920 | ThmExitOnFailure(hr, "Failed to get window Width attribute."); |
| 1911 | 1921 | ||
| 1912 | pTheme->nWidth = pTheme->nDefaultDpiWidth = dwValue; | 1922 | pTheme->nWidth = pTheme->nDefaultDpiWidth = pTheme->nWindowWidth = dwValue; |
| 1913 | 1923 | ||
| 1914 | hr = XmlGetAttributeNumber(pixn, L"Height", &dwValue); | 1924 | hr = XmlGetAttributeNumber(pixn, L"Height", &dwValue); |
| 1915 | if (S_FALSE == hr) | 1925 | if (S_FALSE == hr) |
| @@ -1919,7 +1929,7 @@ static HRESULT ParseWindow( | |||
| 1919 | } | 1929 | } |
| 1920 | ThmExitOnFailure(hr, "Failed to get window Height attribute."); | 1930 | ThmExitOnFailure(hr, "Failed to get window Height attribute."); |
| 1921 | 1931 | ||
| 1922 | pTheme->nHeight = pTheme->nDefaultDpiHeight = dwValue; | 1932 | pTheme->nHeight = pTheme->nDefaultDpiHeight = pTheme->nWindowHeight = dwValue; |
| 1923 | 1933 | ||
| 1924 | hr = XmlGetAttributeNumber(pixn, L"MinimumWidth", &dwValue); | 1934 | hr = XmlGetAttributeNumber(pixn, L"MinimumWidth", &dwValue); |
| 1925 | if (S_FALSE == hr) | 1935 | if (S_FALSE == hr) |
| @@ -4338,7 +4348,7 @@ static BOOL OnDpiChanged( | |||
| 4338 | 4348 | ||
| 4339 | 4349 | ||
| 4340 | pTheme->fForceResize = !pTheme->fAutoResize; | 4350 | pTheme->fForceResize = !pTheme->fAutoResize; |
| 4341 | ScaleTheme(pTheme, nDpi, pRect->left, pRect->top); | 4351 | ScaleThemeFromWindow(pTheme, nDpi, pRect->left, pRect->top); |
| 4342 | 4352 | ||
| 4343 | LExit: | 4353 | LExit: |
| 4344 | return !fIgnored; | 4354 | return !fIgnored; |
| @@ -4359,7 +4369,7 @@ static void OnNcCreate( | |||
| 4359 | 4369 | ||
| 4360 | if (windowContext.nDpi != pTheme->nDpi) | 4370 | if (windowContext.nDpi != pTheme->nDpi) |
| 4361 | { | 4371 | { |
| 4362 | ScaleTheme(pTheme, windowContext.nDpi, pCreateStruct->x, pCreateStruct->y); | 4372 | ScaleTheme(pTheme, windowContext.nDpi, pCreateStruct->x, pCreateStruct->y, pCreateStruct->style, NULL != pCreateStruct->hMenu, pCreateStruct->dwExStyle); |
| 4363 | } | 4373 | } |
| 4364 | } | 4374 | } |
| 4365 | 4375 | ||
| @@ -5484,13 +5494,32 @@ static void ResizeControl( | |||
| 5484 | } | 5494 | } |
| 5485 | } | 5495 | } |
| 5486 | 5496 | ||
| 5487 | static void ScaleTheme( | 5497 | static void ScaleThemeFromWindow( |
| 5488 | __in THEME* pTheme, | 5498 | __in THEME* pTheme, |
| 5489 | __in UINT nDpi, | 5499 | __in UINT nDpi, |
| 5490 | __in int x, | 5500 | __in int x, |
| 5491 | __in int y | 5501 | __in int y |
| 5492 | ) | 5502 | ) |
| 5493 | { | 5503 | { |
| 5504 | DWORD dwStyle = GetWindowStyle(pTheme->hwndParent); | ||
| 5505 | BOOL fMenu = NULL != ::GetMenu(pTheme->hwndParent); | ||
| 5506 | DWORD dwExStyle = GetWindowExStyle(pTheme->hwndParent); | ||
| 5507 | |||
| 5508 | ScaleTheme(pTheme, nDpi, x, y, dwStyle, fMenu, dwExStyle); | ||
| 5509 | } | ||
| 5510 | |||
| 5511 | static void ScaleTheme( | ||
| 5512 | __in THEME* pTheme, | ||
| 5513 | __in UINT nDpi, | ||
| 5514 | __in int x, | ||
| 5515 | __in int y, | ||
| 5516 | __in DWORD dwStyle, | ||
| 5517 | __in BOOL fMenu, | ||
| 5518 | __in DWORD dwExStyle | ||
| 5519 | ) | ||
| 5520 | { | ||
| 5521 | RECT rect = { }; | ||
| 5522 | |||
| 5494 | pTheme->nDpi = nDpi; | 5523 | pTheme->nDpi = nDpi; |
| 5495 | 5524 | ||
| 5496 | pTheme->nHeight = DpiuScaleValue(pTheme->nDefaultDpiHeight, pTheme->nDpi); | 5525 | pTheme->nHeight = DpiuScaleValue(pTheme->nDefaultDpiHeight, pTheme->nDpi); |
| @@ -5498,11 +5527,19 @@ static void ScaleTheme( | |||
| 5498 | pTheme->nMinimumHeight = DpiuScaleValue(pTheme->nDefaultDpiMinimumHeight, pTheme->nDpi); | 5527 | pTheme->nMinimumHeight = DpiuScaleValue(pTheme->nDefaultDpiMinimumHeight, pTheme->nDpi); |
| 5499 | pTheme->nMinimumWidth = DpiuScaleValue(pTheme->nDefaultDpiMinimumWidth, pTheme->nDpi); | 5528 | pTheme->nMinimumWidth = DpiuScaleValue(pTheme->nDefaultDpiMinimumWidth, pTheme->nDpi); |
| 5500 | 5529 | ||
| 5530 | rect.left = x; | ||
| 5531 | rect.top = y; | ||
| 5532 | rect.right = x + pTheme->nWidth; | ||
| 5533 | rect.bottom = y + pTheme->nHeight; | ||
| 5534 | DpiuAdjustWindowRect(&rect, dwStyle, fMenu, dwExStyle, pTheme->nDpi); | ||
| 5535 | pTheme->nWindowWidth = rect.right - rect.left; | ||
| 5536 | pTheme->nWindowHeight = rect.bottom - rect.top; | ||
| 5537 | |||
| 5501 | ScaleControls(pTheme, pTheme->cControls, pTheme->rgControls, pTheme->nDpi); | 5538 | ScaleControls(pTheme, pTheme->cControls, pTheme->rgControls, pTheme->nDpi); |
| 5502 | 5539 | ||
| 5503 | if (pTheme->hwndParent) | 5540 | if (pTheme->hwndParent) |
| 5504 | { | 5541 | { |
| 5505 | ::SetWindowPos(pTheme->hwndParent, NULL, x, y, pTheme->nWidth, pTheme->nHeight, SWP_NOACTIVATE | SWP_NOZORDER); | 5542 | ::SetWindowPos(pTheme->hwndParent, NULL, x, y, pTheme->nWindowWidth, pTheme->nWindowHeight, SWP_NOACTIVATE | SWP_NOZORDER); |
| 5506 | } | 5543 | } |
| 5507 | } | 5544 | } |
| 5508 | 5545 | ||
