From 9b3e900faf25852b5545d86eca695301238bea4e Mon Sep 17 00:00:00 2001 From: narzoul Date: Sat, 19 Dec 2020 13:20:16 +0100 Subject: [PATCH] Fixed errors in copying valid bits of moved child windows Fixes glitches in Mig Alley's main menu after exiting campaign (issue #12). --- DDrawCompat/Gdi/WinProc.cpp | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/DDrawCompat/Gdi/WinProc.cpp b/DDrawCompat/Gdi/WinProc.cpp index d6aef58..6fc943a 100644 --- a/DDrawCompat/Gdi/WinProc.cpp +++ b/DDrawCompat/Gdi/WinProc.cpp @@ -53,6 +53,14 @@ namespace decltype(&CallWindowProcA) callWindowProc, WNDPROC wndProc) { LOG_FUNC("ddcWindowProc", Compat::WindowMessageStruct(hwnd, uMsg, wParam, lParam)); + + switch (uMsg) + { + case WM_WINDOWPOSCHANGED: + onWindowPosChanged(hwnd); + break; + } + LRESULT result = callWindowProc(wndProc, hwnd, uMsg, wParam, lParam); switch (uMsg) @@ -82,10 +90,6 @@ namespace } break; - case WM_WINDOWPOSCHANGED: - onWindowPosChanged(hwnd); - break; - case WM_WINDOWPOSCHANGING: onWindowPosChanging(hwnd, *reinterpret_cast(lParam)); break; @@ -306,12 +310,22 @@ namespace cwi->visibleRegion.offset(rect.left - cwi->rect.left, rect.top - cwi->rect.top); clipRegion &= cwi->visibleRegion; - HDC screenDc = GetDC(nullptr); - SelectClipRgn(screenDc, clipRegion); - BitBlt(screenDc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, - screenDc, cwi->rect.left, cwi->rect.top, SRCCOPY); - SelectClipRgn(screenDc, nullptr); - CALL_ORIG_FUNC(ReleaseDC)(nullptr, screenDc); + Gdi::Region updateRegion; + GetUpdateRgn(hwnd, updateRegion, FALSE); + POINT clientPos = {}; + ClientToScreen(hwnd, &clientPos); + OffsetRgn(updateRegion, clientPos.x, clientPos.y); + clipRegion -= updateRegion; + + if (!clipRegion.isEmpty()) + { + HDC screenDc = GetDC(nullptr); + SelectClipRgn(screenDc, clipRegion); + BitBlt(screenDc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, + screenDc, cwi->rect.left, cwi->rect.top, SRCCOPY); + SelectClipRgn(screenDc, nullptr); + CALL_ORIG_FUNC(ReleaseDC)(nullptr, screenDc); + } } } }