Fix PowerRename UI doesn't handling DPI changes (#1424)

* Fix PowerRename UI doesn't handling DPI changes

* Address PR comments

* Address PR comments
This commit is contained in:
stefansjfw
2020-03-05 10:21:25 +01:00
committed by GitHub
parent 84fbdba9f5
commit 6a0061dde3
7 changed files with 128 additions and 47 deletions

View File

@@ -69,7 +69,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<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;%(AdditionalDependencies)</AdditionalDependencies> <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)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -86,7 +86,7 @@
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<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;%(AdditionalDependencies)</AdditionalDependencies> <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)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>

View File

@@ -120,7 +120,7 @@
<AdditionalIncludeDirectories>..\;..\..\..\common;..\..\..\common\telemetry;..\..\;..\..\..\;..\..\..\..\deps\cpprestsdk\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..\;..\..\..\common;..\..\..\common\telemetry;..\..\;..\..\..\;..\..\..\..\deps\cpprestsdk\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<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;%(AdditionalDependencies)</AdditionalDependencies> <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)</AdditionalDependencies>
<ModuleDefinitionFile>PowerRenameExt.def</ModuleDefinitionFile> <ModuleDefinitionFile>PowerRenameExt.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@@ -158,7 +158,7 @@
<Link> <Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<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;%(AdditionalDependencies)</AdditionalDependencies> <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)</AdditionalDependencies>
<ModuleDefinitionFile>PowerRenameExt.def</ModuleDefinitionFile> <ModuleDefinitionFile>PowerRenameExt.def</ModuleDefinitionFile>
<DelayLoadDLLs>gdi32.dll;advapi32.dll;shell32.dll;ole32.dll;shlwapi.dll;oleaut32.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <DelayLoadDLLs>gdi32.dll;advapi32.dll;shell32.dll;ole32.dll;shlwapi.dll;oleaut32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link> </Link>

View File

@@ -103,6 +103,7 @@
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
</Link> </Link>
<Lib />
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
@@ -140,6 +141,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
</Link> </Link>
<Lib />
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Helpers.h" /> <ClInclude Include="Helpers.h" />

View File

@@ -120,7 +120,7 @@
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;%(AdditionalDependencies)</AdditionalDependencies> <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)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -163,7 +163,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(OutDir)PowerRenameLib.lib;$(OutDir)PowerRenameUI.lib;Pathcch.lib;comctl32.lib;$(OutDir)..\..\src\modules\powerrename\UI\$(Platform)\$(Configuration)\PowerRenameUI.res;%(AdditionalDependencies)</AdditionalDependencies> <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)</AdditionalDependencies>
<DelayLoadDLLs>gdi32.dll;advapi32.dll;shell32.dll;ole32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs> <DelayLoadDLLs>gdi32.dll;advapi32.dll;shell32.dll;ole32.dll;shlwapi.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>

View File

@@ -1,6 +1,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "resource.h" #include "resource.h"
#include "PowerRenameUI.h" #include "PowerRenameUI.h"
#include "dpi_aware.h"
#include <commctrl.h> #include <commctrl.h>
#include <Shlobj.h> #include <Shlobj.h>
#include <helpers.h> #include <helpers.h>
@@ -515,7 +516,7 @@ HRESULT CPowerRenameUI::_DoModal(__in_opt HWND hwnd)
} }
void CPowerRenameUI::BecomeForegroundWindow() void CPowerRenameUI::BecomeForegroundWindow()
{ {
static INPUT i = {INPUT_MOUSE, {}}; static INPUT i = { INPUT_MOUSE, {} };
SendInput(1, &i, sizeof(i)); SendInput(1, &i, sizeof(i));
SetForegroundWindow(m_hwnd); SetForegroundWindow(m_hwnd);
} }
@@ -626,8 +627,14 @@ void CPowerRenameUI::_OnInitDlg()
GetWindowRect(m_hwnd, &rc); GetWindowRect(m_hwnd, &rc);
m_initialWidth = RECT_WIDTH(rc); m_initialWidth = RECT_WIDTH(rc);
m_initialHeight = RECT_HEIGHT(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(); _InitAutoComplete();
@@ -759,25 +766,16 @@ void CPowerRenameUI::_OnSize(_In_ WPARAM wParam)
{ {
if ((wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED) && m_initialWidth) 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++) 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(); 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); HWND hwnd = GetDlgItem(m_hwnd, id);
@@ -791,40 +789,57 @@ void CPowerRenameUI::_MoveControl(_In_ DWORD id, _In_ DWORD repositionFlags, _In
{ {
flags |= SWP_NOSIZE; 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 }; RECT rcWindow = { 0 };
GetWindowRect(hwnd, &rcWindow); GetWindowRect(hwnd, &rcWindow);
int cx = RECT_WIDTH(rcWindow);
int cy = RECT_HEIGHT(rcWindow);
MapWindowPoints(HWND_DESKTOP, GetParent(hwnd), (LPPOINT)&rcWindow, 2); MapWindowPoints(HWND_DESKTOP, GetParent(hwnd), (LPPOINT)&rcWindow, 2);
int x = rcWindow.left; int x = rcWindow.left;
int y = rcWindow.top; 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<int>(m_itemsPositioning.searchReplaceWidthDiff * scale);
break;
case IDC_PREVIEWGROUP:
height = mainWindowHeight - static_cast<int>(m_itemsPositioning.previewGroupHeightDiff * scale);
case IDC_SEARCHREPLACEGROUP:
case IDC_OPTIONSGROUP:
width = mainWindowWidth - static_cast<int>(m_itemsPositioning.groupsWidthDiff * scale);
break;
case IDC_LIST_PREVIEW:
width = mainWindowWidth - static_cast<int>(m_itemsPositioning.listPreviewWidthDiff * scale);
height = mainWindowHeight - static_cast<int>(m_itemsPositioning.listPreviewHeightDiff * scale);
break;
case IDC_STATUS_MESSAGE:
y = mainWindowHeight - static_cast<int>(m_itemsPositioning.statusMessageYDiff * scale);
break;
case ID_RENAME:
x = mainWindowWidth - static_cast<int>(m_itemsPositioning.renameButtonXDiff * scale);
y = mainWindowHeight - static_cast<int>(m_itemsPositioning.renameButtonYDiff * scale);
break;
case ID_ABOUT:
x = mainWindowWidth - static_cast<int>(m_itemsPositioning.helpButtonXDiff * scale);
y = mainWindowHeight - static_cast<int>(m_itemsPositioning.helpButtonYDiff * scale);
break;
case IDCANCEL:
x = mainWindowWidth - static_cast<int>(m_itemsPositioning.cancelButtonXDiff * scale);
y = mainWindowHeight - static_cast<int>(m_itemsPositioning.cancelButtonYDiff * scale);
break;
} }
if (repositionFlags & Reposition_Y) SetWindowPos(hwnd, NULL, x, y, width, height, flags);
{
y += yDelta;
}
if (repositionFlags & Reposition_Width)
{
cx += xDelta;
}
if (repositionFlags & Reposition_Height)
{
cy += yDelta;
}
SetWindowPos(hwnd, NULL, x, y, cx, cy, flags);
RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); 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) void CPowerRenameListView::Init(_In_ HWND hwndLV)
{ {
if (hwndLV) if (hwndLV)

View File

@@ -77,6 +77,22 @@ public:
static HRESULT s_CreateInstance(_In_ IPowerRenameManager* psrm, _In_opt_ IUnknown* dataSource, _In_ bool enableDragDrop, _Outptr_ IPowerRenameUI** ppsrui); static HRESULT s_CreateInstance(_In_ IPowerRenameManager* psrm, _In_opt_ IUnknown* dataSource, _In_ bool enableDragDrop, _Outptr_ IPowerRenameUI** ppsrui);
private: 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() ~CPowerRenameUI()
{ {
DeleteObject(m_iconMain); DeleteObject(m_iconMain);
@@ -115,7 +131,7 @@ private:
void _OnCloseDlg(); void _OnCloseDlg();
void _OnDestroyDlg(); void _OnDestroyDlg();
void _OnSearchReplaceChanged(); 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 _ReadSettings();
HRESULT _WriteSettings(); HRESULT _WriteSettings();
@@ -127,6 +143,8 @@ private:
void _EnumerateItems(_In_ IUnknown* pdtobj); void _EnumerateItems(_In_ IUnknown* pdtobj);
void _UpdateCounts(); void _UpdateCounts();
void _CollectItemPosition(_In_ DWORD id);
long m_refCount = 0; long m_refCount = 0;
bool m_initialized = false; bool m_initialized = false;
bool m_enableDragDrop = false; bool m_enableDragDrop = false;
@@ -139,6 +157,8 @@ private:
DWORD m_currentRegExId = 0; DWORD m_currentRegExId = 0;
UINT m_selectedCount = 0; UINT m_selectedCount = 0;
UINT m_renamingCount = 0; UINT m_renamingCount = 0;
UINT m_initialDPI = 0;
DialogItemsPositioning m_itemsPositioning {};
int m_initialWidth = 0; int m_initialWidth = 0;
int m_initialHeight = 0; int m_initialHeight = 0;
int m_lastWidth = 0; int m_lastWidth = 0;

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64"> <ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>