mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-08 20:27:36 +02:00
[PreviewPane]Fix location and scaling issues with different DPI (#31802)
* [PreviewPane] Monaco Previewer: await initial position, size update + use recieved coordinates * Fixing size and position issue for all file explorer previewers
This commit is contained in:
@@ -29,11 +29,11 @@ namespace Microsoft.PowerToys.PreviewHandler.Gcode
|
|||||||
string filePath = args[0];
|
string filePath = args[0];
|
||||||
int hwnd = Convert.ToInt32(args[1], 16);
|
int hwnd = Convert.ToInt32(args[1], 16);
|
||||||
|
|
||||||
Rectangle s = default(Rectangle);
|
|
||||||
int left = Convert.ToInt32(args[2], 10);
|
int left = Convert.ToInt32(args[2], 10);
|
||||||
int right = Convert.ToInt32(args[3], 10);
|
int right = Convert.ToInt32(args[3], 10);
|
||||||
int top = Convert.ToInt32(args[4], 10);
|
int top = Convert.ToInt32(args[4], 10);
|
||||||
int bottom = Convert.ToInt32(args[5], 10);
|
int bottom = Convert.ToInt32(args[5], 10);
|
||||||
|
Rectangle s = new Rectangle(left, top, right - left, bottom - top);
|
||||||
|
|
||||||
_previewHandlerControl = new GcodePreviewHandlerControl();
|
_previewHandlerControl = new GcodePreviewHandlerControl();
|
||||||
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
||||||
|
|||||||
@@ -129,6 +129,12 @@ IFACEMETHODIMP GcodePreviewHandler::SetRect(const RECT* prc)
|
|||||||
HRESULT hr = E_INVALIDARG;
|
HRESULT hr = E_INVALIDARG;
|
||||||
if (prc != NULL)
|
if (prc != NULL)
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0 && (prc->left != 0 || prc->top != 0 || prc->right != 0 || prc->bottom != 0))
|
||||||
|
{
|
||||||
|
// GcodePreviewHandler position first initialisation, do the first preview
|
||||||
|
m_rcParent = *prc;
|
||||||
|
DoPreview();
|
||||||
|
}
|
||||||
if (!m_resizeEvent)
|
if (!m_resizeEvent)
|
||||||
{
|
{
|
||||||
Logger::error(L"Failed to create resize event for GcodePreviewHandler");
|
Logger::error(L"Failed to create resize event for GcodePreviewHandler");
|
||||||
@@ -153,6 +159,11 @@ IFACEMETHODIMP GcodePreviewHandler::DoPreview()
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0)
|
||||||
|
{
|
||||||
|
// Postponing Start GcodePreviewHandler.exe, position not yet initialized. preview will be done after initialisation
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
Logger::info(L"Starting GcodePreviewHandler.exe");
|
Logger::info(L"Starting GcodePreviewHandler.exe");
|
||||||
|
|
||||||
STARTUPINFO info = { sizeof(info) };
|
STARTUPINFO info = { sizeof(info) };
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ namespace Microsoft.PowerToys.PreviewHandler.Markdown
|
|||||||
string filePath = args[0];
|
string filePath = args[0];
|
||||||
int hwnd = Convert.ToInt32(args[1], 16);
|
int hwnd = Convert.ToInt32(args[1], 16);
|
||||||
|
|
||||||
Rectangle s = default(Rectangle);
|
|
||||||
int left = Convert.ToInt32(args[2], 10);
|
int left = Convert.ToInt32(args[2], 10);
|
||||||
int right = Convert.ToInt32(args[3], 10);
|
int right = Convert.ToInt32(args[3], 10);
|
||||||
int top = Convert.ToInt32(args[4], 10);
|
int top = Convert.ToInt32(args[4], 10);
|
||||||
int bottom = Convert.ToInt32(args[5], 10);
|
int bottom = Convert.ToInt32(args[5], 10);
|
||||||
|
Rectangle s = new Rectangle(left, top, right - left, bottom - top);
|
||||||
|
|
||||||
_previewHandlerControl = new MarkdownPreviewHandlerControl();
|
_previewHandlerControl = new MarkdownPreviewHandlerControl();
|
||||||
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
||||||
|
|||||||
@@ -130,6 +130,12 @@ IFACEMETHODIMP MarkdownPreviewHandler::SetRect(const RECT* prc)
|
|||||||
HRESULT hr = E_INVALIDARG;
|
HRESULT hr = E_INVALIDARG;
|
||||||
if (prc != NULL)
|
if (prc != NULL)
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0 && (prc->left != 0 || prc->top != 0 || prc->right != 0 || prc->bottom != 0))
|
||||||
|
{
|
||||||
|
// MDPreviewHandler position first initialisation, do the first preview
|
||||||
|
m_rcParent = *prc;
|
||||||
|
DoPreview();
|
||||||
|
}
|
||||||
if (!m_resizeEvent)
|
if (!m_resizeEvent)
|
||||||
{
|
{
|
||||||
Logger::error(L"Failed to create resize event for MDPreviewHandler");
|
Logger::error(L"Failed to create resize event for MDPreviewHandler");
|
||||||
@@ -154,6 +160,11 @@ IFACEMETHODIMP MarkdownPreviewHandler::DoPreview()
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0)
|
||||||
|
{
|
||||||
|
// Postponing Start MarkdownPreviewHandler.exe, position not yet initialized. preview will be done after initialisation
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
Logger::info(L"Starting MarkdownPreviewHandler.exe");
|
Logger::info(L"Starting MarkdownPreviewHandler.exe");
|
||||||
|
|
||||||
STARTUPINFO info = { sizeof(info) };
|
STARTUPINFO info = { sizeof(info) };
|
||||||
|
|||||||
@@ -32,11 +32,11 @@ namespace Microsoft.PowerToys.PreviewHandler.Monaco
|
|||||||
string filePath = args[0];
|
string filePath = args[0];
|
||||||
int hwnd = Convert.ToInt32(args[1], 16);
|
int hwnd = Convert.ToInt32(args[1], 16);
|
||||||
|
|
||||||
Rectangle s = default(Rectangle);
|
|
||||||
int left = Convert.ToInt32(args[2], 10);
|
int left = Convert.ToInt32(args[2], 10);
|
||||||
int right = Convert.ToInt32(args[3], 10);
|
int right = Convert.ToInt32(args[3], 10);
|
||||||
int top = Convert.ToInt32(args[4], 10);
|
int top = Convert.ToInt32(args[4], 10);
|
||||||
int bottom = Convert.ToInt32(args[5], 10);
|
int bottom = Convert.ToInt32(args[5], 10);
|
||||||
|
Rectangle s = new Rectangle(left, top, right - left, bottom - top);
|
||||||
|
|
||||||
_previewHandlerControl = new MonacoPreviewHandlerControl();
|
_previewHandlerControl = new MonacoPreviewHandlerControl();
|
||||||
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
||||||
|
|||||||
@@ -129,6 +129,12 @@ IFACEMETHODIMP MonacoPreviewHandler::SetRect(const RECT* prc)
|
|||||||
HRESULT hr = E_INVALIDARG;
|
HRESULT hr = E_INVALIDARG;
|
||||||
if (prc != NULL)
|
if (prc != NULL)
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0 && (prc->left != 0 || prc->top != 0 || prc->right != 0 || prc->bottom != 0))
|
||||||
|
{
|
||||||
|
// MonacoPreviewHandler position first initialisation, do the first preview
|
||||||
|
m_rcParent = *prc;
|
||||||
|
DoPreview();
|
||||||
|
}
|
||||||
if (!m_resizeEvent)
|
if (!m_resizeEvent)
|
||||||
{
|
{
|
||||||
Logger::error(L"Failed to create resize event for MonacoPreviewHandler");
|
Logger::error(L"Failed to create resize event for MonacoPreviewHandler");
|
||||||
@@ -153,8 +159,13 @@ IFACEMETHODIMP MonacoPreviewHandler::DoPreview()
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Logger::info(L"Starting MonacoPreviewHandler.exe");
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0)
|
||||||
|
{
|
||||||
|
// Postponing Start MonacoPreviewHandler.exe, position not yet initialized. preview will be done after initialisation
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger::info(L"Starting MonacoPreviewHandler.exe");
|
||||||
STARTUPINFO info = { sizeof(info) };
|
STARTUPINFO info = { sizeof(info) };
|
||||||
std::wstring cmdLine{ L"\"" + m_filePath + L"\"" };
|
std::wstring cmdLine{ L"\"" + m_filePath + L"\"" };
|
||||||
cmdLine += L" ";
|
cmdLine += L" ";
|
||||||
|
|||||||
@@ -28,11 +28,11 @@ namespace Microsoft.PowerToys.PreviewHandler.Pdf
|
|||||||
string filePath = args[0];
|
string filePath = args[0];
|
||||||
int hwnd = Convert.ToInt32(args[1], 16);
|
int hwnd = Convert.ToInt32(args[1], 16);
|
||||||
|
|
||||||
Rectangle s = default(Rectangle);
|
|
||||||
int left = Convert.ToInt32(args[2], 10);
|
int left = Convert.ToInt32(args[2], 10);
|
||||||
int right = Convert.ToInt32(args[3], 10);
|
int right = Convert.ToInt32(args[3], 10);
|
||||||
int top = Convert.ToInt32(args[4], 10);
|
int top = Convert.ToInt32(args[4], 10);
|
||||||
int bottom = Convert.ToInt32(args[5], 10);
|
int bottom = Convert.ToInt32(args[5], 10);
|
||||||
|
Rectangle s = new Rectangle(left, top, right - left, bottom - top);
|
||||||
|
|
||||||
_previewHandlerControl = new PdfPreviewHandlerControl();
|
_previewHandlerControl = new PdfPreviewHandlerControl();
|
||||||
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
||||||
|
|||||||
@@ -127,6 +127,12 @@ IFACEMETHODIMP PdfPreviewHandler::SetRect(const RECT* prc)
|
|||||||
HRESULT hr = E_INVALIDARG;
|
HRESULT hr = E_INVALIDARG;
|
||||||
if (prc != NULL)
|
if (prc != NULL)
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0 && (prc->left != 0 || prc->top != 0 || prc->right != 0 || prc->bottom != 0))
|
||||||
|
{
|
||||||
|
// PdfPreviewHandler position first initialisation, do the first preview
|
||||||
|
m_rcParent = *prc;
|
||||||
|
DoPreview();
|
||||||
|
}
|
||||||
if (!m_resizeEvent)
|
if (!m_resizeEvent)
|
||||||
{
|
{
|
||||||
Logger::error(L"Failed to create resize event for PdfPreviewHandler");
|
Logger::error(L"Failed to create resize event for PdfPreviewHandler");
|
||||||
@@ -150,6 +156,11 @@ IFACEMETHODIMP PdfPreviewHandler::DoPreview()
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0)
|
||||||
|
{
|
||||||
|
// Postponing Start PdfPreviewHandler.exe, position not yet initialized. preview will be done after initialisation
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
Logger::info(L"Starting PdfPreviewHandler.exe");
|
Logger::info(L"Starting PdfPreviewHandler.exe");
|
||||||
|
|
||||||
STARTUPINFO info = { sizeof(info) };
|
STARTUPINFO info = { sizeof(info) };
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ namespace Microsoft.PowerToys.PreviewHandler.Qoi
|
|||||||
string filePath = args[0];
|
string filePath = args[0];
|
||||||
int hwnd = Convert.ToInt32(args[1], 16);
|
int hwnd = Convert.ToInt32(args[1], 16);
|
||||||
|
|
||||||
Rectangle s = default(Rectangle);
|
|
||||||
int left = Convert.ToInt32(args[2], 10);
|
int left = Convert.ToInt32(args[2], 10);
|
||||||
int right = Convert.ToInt32(args[3], 10);
|
int right = Convert.ToInt32(args[3], 10);
|
||||||
int top = Convert.ToInt32(args[4], 10);
|
int top = Convert.ToInt32(args[4], 10);
|
||||||
int bottom = Convert.ToInt32(args[5], 10);
|
int bottom = Convert.ToInt32(args[5], 10);
|
||||||
|
Rectangle s = new Rectangle(left, top, right - left, bottom - top);
|
||||||
|
|
||||||
_previewHandlerControl = new QoiPreviewHandlerControl();
|
_previewHandlerControl = new QoiPreviewHandlerControl();
|
||||||
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
||||||
|
|||||||
@@ -129,6 +129,12 @@ IFACEMETHODIMP QoiPreviewHandler::SetRect(const RECT* prc)
|
|||||||
HRESULT hr = E_INVALIDARG;
|
HRESULT hr = E_INVALIDARG;
|
||||||
if (prc != NULL)
|
if (prc != NULL)
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0 && (prc->left != 0 || prc->top != 0 || prc->right != 0 || prc->bottom != 0))
|
||||||
|
{
|
||||||
|
// QoiPreviewHandler position first initialisation, do the first preview
|
||||||
|
m_rcParent = *prc;
|
||||||
|
DoPreview();
|
||||||
|
}
|
||||||
if (!m_resizeEvent)
|
if (!m_resizeEvent)
|
||||||
{
|
{
|
||||||
Logger::error(L"Failed to create resize event for QoiPreviewHandler");
|
Logger::error(L"Failed to create resize event for QoiPreviewHandler");
|
||||||
@@ -153,6 +159,11 @@ IFACEMETHODIMP QoiPreviewHandler::DoPreview()
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0)
|
||||||
|
{
|
||||||
|
// Postponing Start QoiPreviewHandler.exe, position not yet initialized. preview will be done after initialisation
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
Logger::info(L"Starting QoiPreviewHandler.exe");
|
Logger::info(L"Starting QoiPreviewHandler.exe");
|
||||||
|
|
||||||
STARTUPINFO info = { sizeof(info) };
|
STARTUPINFO info = { sizeof(info) };
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ namespace Microsoft.PowerToys.PreviewHandler.Svg
|
|||||||
string filePath = args[0];
|
string filePath = args[0];
|
||||||
int hwnd = Convert.ToInt32(args[1], 16);
|
int hwnd = Convert.ToInt32(args[1], 16);
|
||||||
|
|
||||||
Rectangle s = default(Rectangle);
|
|
||||||
int left = Convert.ToInt32(args[2], 10);
|
int left = Convert.ToInt32(args[2], 10);
|
||||||
int right = Convert.ToInt32(args[3], 10);
|
int right = Convert.ToInt32(args[3], 10);
|
||||||
int top = Convert.ToInt32(args[4], 10);
|
int top = Convert.ToInt32(args[4], 10);
|
||||||
int bottom = Convert.ToInt32(args[5], 10);
|
int bottom = Convert.ToInt32(args[5], 10);
|
||||||
|
Rectangle s = new Rectangle(left, top, right - left, bottom - top);
|
||||||
|
|
||||||
_previewHandlerControl = new SvgPreviewControl();
|
_previewHandlerControl = new SvgPreviewControl();
|
||||||
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
_previewHandlerControl.SetWindow((IntPtr)hwnd, s);
|
||||||
|
|||||||
@@ -129,6 +129,12 @@ IFACEMETHODIMP SvgPreviewHandler::SetRect(const RECT* prc)
|
|||||||
HRESULT hr = E_INVALIDARG;
|
HRESULT hr = E_INVALIDARG;
|
||||||
if (prc != NULL)
|
if (prc != NULL)
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0 && (prc->left != 0 || prc->top != 0 || prc->right != 0 || prc->bottom != 0))
|
||||||
|
{
|
||||||
|
// SvgPreviewHandler position first initialisation, do the first preview
|
||||||
|
m_rcParent = *prc;
|
||||||
|
DoPreview();
|
||||||
|
}
|
||||||
if (!m_resizeEvent)
|
if (!m_resizeEvent)
|
||||||
{
|
{
|
||||||
Logger::error(L"Failed to create resize event for SvgPreviewHandler");
|
Logger::error(L"Failed to create resize event for SvgPreviewHandler");
|
||||||
@@ -152,6 +158,11 @@ IFACEMETHODIMP SvgPreviewHandler::DoPreview()
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (m_rcParent.left == 0 && m_rcParent.top == 0 && m_rcParent.right == 0 && m_rcParent.bottom == 0)
|
||||||
|
{
|
||||||
|
// Postponing Start SvgPreviewHandler.exe, position not yet initialized. preview will be done after initialisation
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
Logger::info(L"Starting SvgPreviewHandler.exe");
|
Logger::info(L"Starting SvgPreviewHandler.exe");
|
||||||
|
|
||||||
STARTUPINFO info = { sizeof(info) };
|
STARTUPINFO info = { sizeof(info) };
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ namespace Common
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void SetRect(Rectangle windowBounds)
|
public void SetRect(Rectangle windowBounds)
|
||||||
{
|
{
|
||||||
this.UpdateWindowBounds(parentHwnd);
|
this.UpdateWindowBounds(parentHwnd, windowBounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -88,7 +88,7 @@ namespace Common
|
|||||||
public void SetWindow(IntPtr hwnd, Rectangle rect)
|
public void SetWindow(IntPtr hwnd, Rectangle rect)
|
||||||
{
|
{
|
||||||
this.parentHwnd = hwnd;
|
this.parentHwnd = hwnd;
|
||||||
this.UpdateWindowBounds(hwnd);
|
this.UpdateWindowBounds(hwnd, rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -118,7 +118,7 @@ namespace Common
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the Form Control window with the passed rectangle.
|
/// Update the Form Control window with the passed rectangle.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void UpdateWindowBounds(IntPtr hwnd)
|
public void UpdateWindowBounds(IntPtr hwnd, Rectangle newBounds)
|
||||||
{
|
{
|
||||||
// We must set the WS_CHILD style to change the form to a control within the Explorer preview pane
|
// We must set the WS_CHILD style to change the form to a control within the Explorer preview pane
|
||||||
int windowStyle = NativeMethods.GetWindowLong(Handle, gwlStyle);
|
int windowStyle = NativeMethods.GetWindowLong(Handle, gwlStyle);
|
||||||
@@ -129,12 +129,16 @@ namespace Common
|
|||||||
|
|
||||||
NativeMethods.SetParent(Handle, hwnd);
|
NativeMethods.SetParent(Handle, hwnd);
|
||||||
|
|
||||||
RECT s = default(RECT);
|
if (newBounds.IsEmpty)
|
||||||
NativeMethods.GetClientRect(hwnd, ref s);
|
|
||||||
|
|
||||||
if (Bounds.Right != s.Right || Bounds.Bottom != s.Bottom || Bounds.Left != s.Left || Bounds.Top != s.Top)
|
|
||||||
{
|
{
|
||||||
Bounds = s.ToRectangle();
|
RECT s = default(RECT);
|
||||||
|
NativeMethods.GetClientRect(hwnd, ref s);
|
||||||
|
newBounds = new Rectangle(s.Left, s.Top, s.Right - s.Left, s.Bottom - s.Top);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Bounds.Right != newBounds.Right || Bounds.Bottom != newBounds.Bottom || Bounds.Left != newBounds.Left || Bounds.Top != newBounds.Top)
|
||||||
|
{
|
||||||
|
Bounds = newBounds;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user