Browse Source

Merge pull request #82031 from bruvzg/borderless_fs

[Windows] Use clear color for non exclusive fullscreen border, fix maximize for borderless window switching to exclusive fs.
Rémi Verschelde 1 year ago
parent
commit
cc0a02c75c
1 changed files with 25 additions and 1 deletions
  1. 25 1
      platform/windows/display_server_windows.cpp

+ 25 - 1
platform/windows/display_server_windows.cpp

@@ -1525,7 +1525,7 @@ void DisplayServerWindows::_get_window_style(bool p_main_window, bool p_fullscre
 
 
 	if (p_fullscreen || p_borderless) {
 	if (p_fullscreen || p_borderless) {
 		r_style |= WS_POPUP; // p_borderless was WS_EX_TOOLWINDOW in the past.
 		r_style |= WS_POPUP; // p_borderless was WS_EX_TOOLWINDOW in the past.
-		if (p_fullscreen && p_multiwindow_fs) {
+		if ((p_fullscreen && p_multiwindow_fs) || p_maximized) {
 			r_style |= WS_BORDER; // Allows child windows to be displayed on top of full screen.
 			r_style |= WS_BORDER; // Allows child windows to be displayed on top of full screen.
 		}
 		}
 	} else {
 	} else {
@@ -2852,6 +2852,30 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
 
 
 	// Process window messages.
 	// Process window messages.
 	switch (uMsg) {
 	switch (uMsg) {
+		case WM_NCPAINT: {
+			if (RenderingServer::get_singleton() && (windows[window_id].borderless || (windows[window_id].fullscreen && windows[window_id].multiwindow_fs))) {
+				Color color = RenderingServer::get_singleton()->get_default_clear_color();
+				HDC hdc = GetWindowDC(hWnd);
+				if (hdc) {
+					HPEN pen = CreatePen(PS_SOLID, 1, RGB(color.r * 255.f, color.g * 255.f, color.b * 255.f));
+					if (pen) {
+						HGDIOBJ prev_pen = SelectObject(hdc, pen);
+						HGDIOBJ prev_brush = SelectObject(hdc, GetStockObject(NULL_BRUSH));
+
+						RECT rc;
+						GetWindowRect(hWnd, &rc);
+						OffsetRect(&rc, -rc.left, -rc.top);
+						Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
+
+						SelectObject(hdc, prev_pen);
+						SelectObject(hdc, prev_brush);
+						DeleteObject(pen);
+					}
+					ReleaseDC(hWnd, hdc);
+				}
+				return 0;
+			}
+		} break;
 		case WM_NCHITTEST: {
 		case WM_NCHITTEST: {
 			if (windows[window_id].mpass) {
 			if (windows[window_id].mpass) {
 				return HTTRANSPARENT;
 				return HTTRANSPARENT;