Use and store restored window position after minimizing the window
This commit is contained in:
@@ -472,19 +472,13 @@ namespace FlaxEditor.Modules
|
|||||||
{
|
{
|
||||||
writer.WriteStartElement("Bounds");
|
writer.WriteStartElement("Bounds");
|
||||||
{
|
{
|
||||||
var isMaximized = win.IsMaximized;
|
|
||||||
var isMinimized = win.IsMinimized;
|
|
||||||
if (isMinimized)
|
|
||||||
win.Restore(); // Restore window back to desktop to get proper client bounds
|
|
||||||
var bounds = win.ClientBounds;
|
var bounds = win.ClientBounds;
|
||||||
if (isMinimized)
|
|
||||||
win.Minimize();
|
|
||||||
writer.WriteAttributeString("X", bounds.X.ToString(CultureInfo.InvariantCulture));
|
writer.WriteAttributeString("X", bounds.X.ToString(CultureInfo.InvariantCulture));
|
||||||
writer.WriteAttributeString("Y", bounds.Y.ToString(CultureInfo.InvariantCulture));
|
writer.WriteAttributeString("Y", bounds.Y.ToString(CultureInfo.InvariantCulture));
|
||||||
writer.WriteAttributeString("Width", bounds.Width.ToString(CultureInfo.InvariantCulture));
|
writer.WriteAttributeString("Width", bounds.Width.ToString(CultureInfo.InvariantCulture));
|
||||||
writer.WriteAttributeString("Height", bounds.Height.ToString(CultureInfo.InvariantCulture));
|
writer.WriteAttributeString("Height", bounds.Height.ToString(CultureInfo.InvariantCulture));
|
||||||
writer.WriteAttributeString("IsMaximized", isMaximized.ToString());
|
writer.WriteAttributeString("IsMaximized", win.IsMaximized.ToString());
|
||||||
writer.WriteAttributeString("IsMinimized", isMinimized.ToString());
|
writer.WriteAttributeString("IsMinimized", win.IsMinimized.ToString());
|
||||||
}
|
}
|
||||||
writer.WriteEndElement();
|
writer.WriteEndElement();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -532,6 +532,12 @@ Float2 WindowsWindow::ClientToScreen(const Float2& clientPos) const
|
|||||||
{
|
{
|
||||||
ASSERT(HasHWND());
|
ASSERT(HasHWND());
|
||||||
|
|
||||||
|
if (_minimized)
|
||||||
|
{
|
||||||
|
// Return cached position when window is not on screen
|
||||||
|
return _minimizedScreenPosition + clientPos;
|
||||||
|
}
|
||||||
|
|
||||||
POINT p;
|
POINT p;
|
||||||
p.x = static_cast<LONG>(clientPos.X);
|
p.x = static_cast<LONG>(clientPos.X);
|
||||||
p.y = static_cast<LONG>(clientPos.Y);
|
p.y = static_cast<LONG>(clientPos.Y);
|
||||||
@@ -1109,6 +1115,28 @@ LRESULT WindowsWindow::WndProc(UINT msg, WPARAM wParam, LPARAM lParam)
|
|||||||
{
|
{
|
||||||
if (SIZE_MINIMIZED == wParam)
|
if (SIZE_MINIMIZED == wParam)
|
||||||
{
|
{
|
||||||
|
// Get the minimized window position in workspace coordinates
|
||||||
|
WINDOWPLACEMENT placement;
|
||||||
|
placement.length = sizeof(WINDOWPLACEMENT);
|
||||||
|
GetWindowPlacement(_handle, &placement);
|
||||||
|
|
||||||
|
// Calculate client offsets from window borders and title bar
|
||||||
|
RECT winRect = { 0, 0, static_cast<LONG>(_clientSize.X), static_cast<LONG>(_clientSize.Y) };
|
||||||
|
LONG style = GetWindowLong(_handle, GWL_STYLE);
|
||||||
|
LONG exStyle = GetWindowLong(_handle, GWL_EXSTYLE);
|
||||||
|
AdjustWindowRectEx(&winRect, style, FALSE, exStyle);
|
||||||
|
|
||||||
|
// Calculate monitor offsets from taskbar position
|
||||||
|
const HMONITOR monitor = MonitorFromWindow(_handle, MONITOR_DEFAULTTONEAREST);
|
||||||
|
MONITORINFO monitorInfo;
|
||||||
|
monitorInfo.cbSize = sizeof(MONITORINFO);
|
||||||
|
GetMonitorInfoW(monitor, &monitorInfo);
|
||||||
|
|
||||||
|
// Convert the workspace coordinates to screen space and store it
|
||||||
|
_minimizedScreenPosition = Float2(
|
||||||
|
static_cast<float>(placement.rcNormalPosition.left + monitorInfo.rcWork.left - monitorInfo.rcMonitor.left - winRect.left),
|
||||||
|
static_cast<float>(placement.rcNormalPosition.top + monitorInfo.rcWork.top - monitorInfo.rcMonitor.top - winRect.top));
|
||||||
|
|
||||||
_minimized = true;
|
_minimized = true;
|
||||||
_maximized = false;
|
_maximized = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ private:
|
|||||||
Windows::HANDLE _monitor = nullptr;
|
Windows::HANDLE _monitor = nullptr;
|
||||||
Windows::LONG _clipCursorRect[4];
|
Windows::LONG _clipCursorRect[4];
|
||||||
int32 _regionWidth = 0, _regionHeight = 0;
|
int32 _regionWidth = 0, _regionHeight = 0;
|
||||||
|
Float2 _minimizedScreenPosition = Float2::Zero;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user