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