From 6a0061dde3e6083f493cec33c23123357c51099b Mon Sep 17 00:00:00 2001 From: stefansjfw <57057282+stefansjfw@users.noreply.github.com> Date: Thu, 5 Mar 2020 10:21:25 +0100 Subject: [PATCH] Fix PowerRename UI doesn't handling DPI changes (#1424) * Fix PowerRename UI doesn't handling DPI changes * Address PR comments * Address PR comments --- .../UWPui/PowerRenameUWPUI.vcxproj | 4 +- .../powerrename/dll/PowerRenameExt.vcxproj | 4 +- .../powerrename/lib/PowerRenameLib.vcxproj | 2 + .../testapp/PowerRenameTest.vcxproj | 4 +- src/modules/powerrename/ui/PowerRenameUI.cpp | 136 +++++++++++++----- src/modules/powerrename/ui/PowerRenameUI.h | 22 ++- .../powerrename/ui/PowerRenameUI.vcxproj | 3 +- 7 files changed, 128 insertions(+), 47 deletions(-) diff --git a/src/modules/powerrename/UWPui/PowerRenameUWPUI.vcxproj b/src/modules/powerrename/UWPui/PowerRenameUWPUI.vcxproj index b880c02f4..6e90326d1 100644 --- a/src/modules/powerrename/UWPui/PowerRenameUWPUI.vcxproj +++ b/src/modules/powerrename/UWPui/PowerRenameUWPUI.vcxproj @@ -69,7 +69,7 @@ true true true - WindowsApp.lib;Comctl32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + WindowsApp.lib;Comctl32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shcore.lib;%(AdditionalDependencies) @@ -86,7 +86,7 @@ Windows true - WindowsApp.lib;Comctl32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + WindowsApp.lib;Comctl32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shcore.lib;%(AdditionalDependencies) diff --git a/src/modules/powerrename/dll/PowerRenameExt.vcxproj b/src/modules/powerrename/dll/PowerRenameExt.vcxproj index 7a51b40ee..2e8b00449 100644 --- a/src/modules/powerrename/dll/PowerRenameExt.vcxproj +++ b/src/modules/powerrename/dll/PowerRenameExt.vcxproj @@ -120,7 +120,7 @@ ..\;..\..\..\common;..\..\..\common\telemetry;..\..\;..\..\..\;..\..\..\..\deps\cpprestsdk\include;%(AdditionalIncludeDirectories) - $(SolutionDir)$(Platform)\$(Configuration)\PowerRenameLib.lib;$(SolutionDir)$(Platform)\$(Configuration)\PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(SolutionDir)$(Platform)\$(Configuration)\..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;%(AdditionalDependencies) + $(SolutionDir)$(Platform)\$(Configuration)\PowerRenameLib.lib;$(SolutionDir)$(Platform)\$(Configuration)\PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(SolutionDir)$(Platform)\$(Configuration)\..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;shcore.lib;%(AdditionalDependencies) PowerRenameExt.def @@ -158,7 +158,7 @@ true true - $(SolutionDir)$(Platform)\$(Configuration)\PowerRenameLib.lib;$(SolutionDir)$(Platform)\$(Configuration)\PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(SolutionDir)$(Platform)\$(Configuration)\..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;%(AdditionalDependencies) + $(SolutionDir)$(Platform)\$(Configuration)\PowerRenameLib.lib;$(SolutionDir)$(Platform)\$(Configuration)\PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(SolutionDir)$(Platform)\$(Configuration)\..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;shcore.lib;%(AdditionalDependencies) PowerRenameExt.def gdi32.dll;advapi32.dll;shell32.dll;ole32.dll;shlwapi.dll;oleaut32.dll;%(DelayLoadDLLs) diff --git a/src/modules/powerrename/lib/PowerRenameLib.vcxproj b/src/modules/powerrename/lib/PowerRenameLib.vcxproj index 52d9243d6..05d899e30 100644 --- a/src/modules/powerrename/lib/PowerRenameLib.vcxproj +++ b/src/modules/powerrename/lib/PowerRenameLib.vcxproj @@ -103,6 +103,7 @@ Windows + @@ -140,6 +141,7 @@ true true + diff --git a/src/modules/powerrename/testapp/PowerRenameTest.vcxproj b/src/modules/powerrename/testapp/PowerRenameTest.vcxproj index 1e06bf571..fa75995cb 100644 --- a/src/modules/powerrename/testapp/PowerRenameTest.vcxproj +++ b/src/modules/powerrename/testapp/PowerRenameTest.vcxproj @@ -120,7 +120,7 @@ Windows true - $(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;%(AdditionalDependencies) + $(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;shlwapi.lib;shcore.lib;%(AdditionalDependencies) @@ -163,7 +163,7 @@ true true true - $(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;%(AdditionalDependencies) + $(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;shlwapi.lib;shcore.lib;%(AdditionalDependencies) gdi32.dll;advapi32.dll;shell32.dll;ole32.dll;shlwapi.dll;%(DelayLoadDLLs) diff --git a/src/modules/powerrename/ui/PowerRenameUI.cpp b/src/modules/powerrename/ui/PowerRenameUI.cpp index 2bb2230ac..4c13a0fd3 100644 --- a/src/modules/powerrename/ui/PowerRenameUI.cpp +++ b/src/modules/powerrename/ui/PowerRenameUI.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "resource.h" #include "PowerRenameUI.h" +#include "dpi_aware.h" #include #include #include @@ -515,7 +516,7 @@ HRESULT CPowerRenameUI::_DoModal(__in_opt HWND hwnd) } void CPowerRenameUI::BecomeForegroundWindow() { - static INPUT i = {INPUT_MOUSE, {}}; + static INPUT i = { INPUT_MOUSE, {} }; SendInput(1, &i, sizeof(i)); SetForegroundWindow(m_hwnd); } @@ -626,8 +627,14 @@ void CPowerRenameUI::_OnInitDlg() GetWindowRect(m_hwnd, &rc); m_initialWidth = RECT_WIDTH(rc); m_initialHeight = RECT_HEIGHT(rc); - m_lastWidth = m_initialWidth; - m_lastHeight = m_initialHeight; + + UINT dummy = 0; + DPIAware::GetScreenDPIForWindow(m_hwnd, m_initialDPI, dummy); + + for (UINT u = 0; u < ARRAYSIZE(g_repositionMap); u++) + { + _CollectItemPosition(g_repositionMap[u].id); + } _InitAutoComplete(); @@ -759,25 +766,16 @@ void CPowerRenameUI::_OnSize(_In_ WPARAM wParam) { if ((wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED) && m_initialWidth) { - // Calculate window size change delta - RECT rc = { 0 }; - GetWindowRect(m_hwnd, &rc); - - const int xDelta = RECT_WIDTH(rc) - m_lastWidth; - m_lastWidth += xDelta; - const int yDelta = RECT_HEIGHT(rc) - m_lastHeight; - m_lastHeight += yDelta; - for (UINT u = 0; u < ARRAYSIZE(g_repositionMap); u++) { - _MoveControl(g_repositionMap[u].id, g_repositionMap[u].flags, xDelta, yDelta); + _MoveControl(g_repositionMap[u].id, g_repositionMap[u].flags); } m_listview.OnSize(); } } -void CPowerRenameUI::_MoveControl(_In_ DWORD id, _In_ DWORD repositionFlags, _In_ int xDelta, _In_ int yDelta) +void CPowerRenameUI::_MoveControl(_In_ DWORD id, _In_ DWORD repositionFlags) { HWND hwnd = GetDlgItem(m_hwnd, id); @@ -791,40 +789,57 @@ void CPowerRenameUI::_MoveControl(_In_ DWORD id, _In_ DWORD repositionFlags, _In { flags |= SWP_NOSIZE; } + RECT rc = { 0 }; + GetWindowRect(m_hwnd, &rc); + int mainWindowWidth = rc.right - rc.left; + int mainWindowHeight = rc.bottom - rc.top; RECT rcWindow = { 0 }; GetWindowRect(hwnd, &rcWindow); - - int cx = RECT_WIDTH(rcWindow); - int cy = RECT_HEIGHT(rcWindow); - MapWindowPoints(HWND_DESKTOP, GetParent(hwnd), (LPPOINT)&rcWindow, 2); - int x = rcWindow.left; int y = rcWindow.top; + int width = rcWindow.right - rcWindow.left; + int height = rcWindow.bottom - rcWindow.top; - if (repositionFlags & Reposition_X) + UINT currentDPI = 0, dummy; + DPIAware::GetScreenDPIForWindow(m_hwnd, currentDPI, dummy); + float scale = (float)currentDPI / m_initialDPI; + + switch (id) { - x += xDelta; + case IDC_EDIT_SEARCHFOR: + case IDC_EDIT_REPLACEWITH: + width = mainWindowWidth - static_cast(m_itemsPositioning.searchReplaceWidthDiff * scale); + break; + case IDC_PREVIEWGROUP: + height = mainWindowHeight - static_cast(m_itemsPositioning.previewGroupHeightDiff * scale); + case IDC_SEARCHREPLACEGROUP: + case IDC_OPTIONSGROUP: + width = mainWindowWidth - static_cast(m_itemsPositioning.groupsWidthDiff * scale); + break; + case IDC_LIST_PREVIEW: + width = mainWindowWidth - static_cast(m_itemsPositioning.listPreviewWidthDiff * scale); + height = mainWindowHeight - static_cast(m_itemsPositioning.listPreviewHeightDiff * scale); + break; + case IDC_STATUS_MESSAGE: + y = mainWindowHeight - static_cast(m_itemsPositioning.statusMessageYDiff * scale); + break; + case ID_RENAME: + x = mainWindowWidth - static_cast(m_itemsPositioning.renameButtonXDiff * scale); + y = mainWindowHeight - static_cast(m_itemsPositioning.renameButtonYDiff * scale); + break; + case ID_ABOUT: + x = mainWindowWidth - static_cast(m_itemsPositioning.helpButtonXDiff * scale); + y = mainWindowHeight - static_cast(m_itemsPositioning.helpButtonYDiff * scale); + break; + case IDCANCEL: + x = mainWindowWidth - static_cast(m_itemsPositioning.cancelButtonXDiff * scale); + y = mainWindowHeight - static_cast(m_itemsPositioning.cancelButtonYDiff * scale); + break; } - if (repositionFlags & Reposition_Y) - { - y += yDelta; - } - - if (repositionFlags & Reposition_Width) - { - cx += xDelta; - } - - if (repositionFlags & Reposition_Height) - { - cy += yDelta; - } - - SetWindowPos(hwnd, NULL, x, y, cx, cy, flags); - + SetWindowPos(hwnd, NULL, x, y, width, height, flags); RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); } @@ -927,6 +942,51 @@ void CPowerRenameUI::_UpdateCounts() } } +void CPowerRenameUI::_CollectItemPosition(_In_ DWORD id) +{ + HWND hwnd = GetDlgItem(m_hwnd, id); + RECT rcWindow = { 0 }; + GetWindowRect(hwnd, &rcWindow); + + MapWindowPoints(HWND_DESKTOP, GetParent(hwnd), (LPPOINT)&rcWindow, 2); + int itemWidth = rcWindow.right - rcWindow.left; + int itemHeight = rcWindow.bottom - rcWindow.top; + + switch (id) + { + case IDC_EDIT_SEARCHFOR: + /* IDC_EDIT_REPLACEWITH uses same value*/ + m_itemsPositioning.searchReplaceWidthDiff = m_initialWidth - itemWidth; + break; + case IDC_PREVIEWGROUP: + m_itemsPositioning.previewGroupHeightDiff = m_initialHeight - itemHeight; + break; + case IDC_SEARCHREPLACEGROUP: + /* IDC_OPTIONSGROUP uses same value */ + m_itemsPositioning.groupsWidthDiff = m_initialWidth - itemWidth; + break; + case IDC_LIST_PREVIEW: + m_itemsPositioning.listPreviewWidthDiff = m_initialWidth - itemWidth; + m_itemsPositioning.listPreviewHeightDiff = m_initialHeight - itemHeight; + break; + case IDC_STATUS_MESSAGE: + m_itemsPositioning.statusMessageYDiff = m_initialHeight - rcWindow.top; + break; + case ID_RENAME: + m_itemsPositioning.renameButtonXDiff = m_initialWidth - rcWindow.left; + m_itemsPositioning.renameButtonYDiff = m_initialHeight - rcWindow.top; + break; + case ID_ABOUT: + m_itemsPositioning.helpButtonXDiff = m_initialWidth - rcWindow.left; + m_itemsPositioning.helpButtonYDiff = m_initialHeight - rcWindow.top; + break; + case IDCANCEL: + m_itemsPositioning.cancelButtonXDiff = m_initialWidth - rcWindow.left; + m_itemsPositioning.cancelButtonYDiff = m_initialHeight - rcWindow.top; + break; + } +} + void CPowerRenameListView::Init(_In_ HWND hwndLV) { if (hwndLV) diff --git a/src/modules/powerrename/ui/PowerRenameUI.h b/src/modules/powerrename/ui/PowerRenameUI.h index 0dbbaa468..ec9ef7a09 100644 --- a/src/modules/powerrename/ui/PowerRenameUI.h +++ b/src/modules/powerrename/ui/PowerRenameUI.h @@ -77,6 +77,22 @@ public: static HRESULT s_CreateInstance(_In_ IPowerRenameManager* psrm, _In_opt_ IUnknown* dataSource, _In_ bool enableDragDrop, _Outptr_ IPowerRenameUI** ppsrui); private: + struct DialogItemsPositioning + { + int groupsWidthDiff; + int previewGroupHeightDiff; + int searchReplaceWidthDiff; + int listPreviewWidthDiff; + int listPreviewHeightDiff; + int statusMessageYDiff; + int renameButtonXDiff; + int renameButtonYDiff; + int helpButtonXDiff; + int helpButtonYDiff; + int cancelButtonXDiff; + int cancelButtonYDiff; + }; + ~CPowerRenameUI() { DeleteObject(m_iconMain); @@ -115,7 +131,7 @@ private: void _OnCloseDlg(); void _OnDestroyDlg(); void _OnSearchReplaceChanged(); - void _MoveControl(_In_ DWORD id, _In_ DWORD repositionFlags, _In_ int xDelta, _In_ int yDelta); + void _MoveControl(_In_ DWORD id, _In_ DWORD repositionFlags); HRESULT _ReadSettings(); HRESULT _WriteSettings(); @@ -127,6 +143,8 @@ private: void _EnumerateItems(_In_ IUnknown* pdtobj); void _UpdateCounts(); + void _CollectItemPosition(_In_ DWORD id); + long m_refCount = 0; bool m_initialized = false; bool m_enableDragDrop = false; @@ -139,6 +157,8 @@ private: DWORD m_currentRegExId = 0; UINT m_selectedCount = 0; UINT m_renamingCount = 0; + UINT m_initialDPI = 0; + DialogItemsPositioning m_itemsPositioning {}; int m_initialWidth = 0; int m_initialHeight = 0; int m_lastWidth = 0; diff --git a/src/modules/powerrename/ui/PowerRenameUI.vcxproj b/src/modules/powerrename/ui/PowerRenameUI.vcxproj index 6cbce3534..46471b68f 100644 --- a/src/modules/powerrename/ui/PowerRenameUI.vcxproj +++ b/src/modules/powerrename/ui/PowerRenameUI.vcxproj @@ -1,6 +1,5 @@  - + Debug