瀏覽代碼

Fix wrong size and position when windows is minimized on Windows

Marcelo Fernandez 6 年之前
父節點
當前提交
711bc1c07e
共有 2 個文件被更改,包括 31 次插入8 次删除
  1. 30 8
      platform/windows/os_windows.cpp
  2. 1 0
      platform/windows/os_windows.h

+ 30 - 8
platform/windows/os_windows.cpp

@@ -727,16 +727,28 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 			}
 			}
 		} break;
 		} break;
 
 
+		case WM_MOVE: {
+			if (!IsIconic(hWnd)) {
+				int x = LOWORD(lParam);
+				int y = HIWORD(lParam);
+				last_pos = Point2(x, y);
+			}
+		} break;
+
 		case WM_SIZE: {
 		case WM_SIZE: {
-			int window_w = LOWORD(lParam);
-			int window_h = HIWORD(lParam);
-			if (window_w > 0 && window_h > 0 && !preserve_window_size) {
-				video_mode.width = window_w;
-				video_mode.height = window_h;
-			} else {
-				preserve_window_size = false;
-				set_window_size(Size2(video_mode.width, video_mode.height));
+			// Ignore size when a SIZE_MINIMIZED event is triggered
+			if (wParam != SIZE_MINIMIZED) {
+				int window_w = LOWORD(lParam);
+				int window_h = HIWORD(lParam);
+				if (window_w > 0 && window_h > 0 && !preserve_window_size) {
+					video_mode.width = window_w;
+					video_mode.height = window_h;
+				} else {
+					preserve_window_size = false;
+					set_window_size(Size2(video_mode.width, video_mode.height));
+				}
 			}
 			}
+
 			if (wParam == SIZE_MAXIMIZED) {
 			if (wParam == SIZE_MAXIMIZED) {
 				maximized = true;
 				maximized = true;
 				minimized = false;
 				minimized = false;
@@ -1685,6 +1697,10 @@ int OS_Windows::get_screen_dpi(int p_screen) const {
 
 
 Point2 OS_Windows::get_window_position() const {
 Point2 OS_Windows::get_window_position() const {
 
 
+	if (minimized) {
+		return last_pos;
+	}
+
 	RECT r;
 	RECT r;
 	GetWindowRect(hWnd, &r);
 	GetWindowRect(hWnd, &r);
 	return Point2(r.left, r.top);
 	return Point2(r.left, r.top);
@@ -1705,9 +1721,15 @@ void OS_Windows::set_window_position(const Point2 &p_position) {
 		ClientToScreen(hWnd, (POINT *)&rect.right);
 		ClientToScreen(hWnd, (POINT *)&rect.right);
 		ClipCursor(&rect);
 		ClipCursor(&rect);
 	}
 	}
+
+	last_pos = p_position;
 }
 }
 Size2 OS_Windows::get_window_size() const {
 Size2 OS_Windows::get_window_size() const {
 
 
+	if (minimized) {
+		return Size2(video_mode.width, video_mode.height);
+	}
+
 	RECT r;
 	RECT r;
 	if (GetClientRect(hWnd, &r)) { // Only area inside of window border
 	if (GetClientRect(hWnd, &r)) { // Only area inside of window border
 		return Size2(r.right - r.left, r.bottom - r.top);
 		return Size2(r.right - r.left, r.bottom - r.top);

+ 1 - 0
platform/windows/os_windows.h

@@ -93,6 +93,7 @@ class OS_Windows : public OS {
 	HDC hDC; // Private GDI Device Context
 	HDC hDC; // Private GDI Device Context
 	HINSTANCE hInstance; // Holds The Instance Of The Application
 	HINSTANCE hInstance; // Holds The Instance Of The Application
 	HWND hWnd;
 	HWND hWnd;
+	Point2 last_pos;
 
 
 	HBITMAP hBitmap; //DIB section for layered window
 	HBITMAP hBitmap; //DIB section for layered window
 	uint8_t *dib_data;
 	uint8_t *dib_data;