Added what should have been the flicker-free code to Windows containers; it doesn't actually work 100%, though (not flicker-free; window backgrounds are now black), so it's #ifdef'd out for now.
This commit is contained in:
parent
ddbb719918
commit
6707839e9b
|
@ -38,6 +38,7 @@ static LRESULT CALLBACK containerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LP
|
||||||
case WM_NOTIFY:
|
case WM_NOTIFY:
|
||||||
return forwardNotify(hwnd, uMsg, wParam, lParam);
|
return forwardNotify(hwnd, uMsg, wParam, lParam);
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
|
#ifndef BROKEN
|
||||||
/* paint the parent's background in a flicker-free way */
|
/* paint the parent's background in a flicker-free way */
|
||||||
dc = BeginPaint(hwnd, &ps);
|
dc = BeginPaint(hwnd, &ps);
|
||||||
if (dc == NULL)
|
if (dc == NULL)
|
||||||
|
@ -57,6 +58,45 @@ static LRESULT CALLBACK containerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LP
|
||||||
SendMessageW(parent, WM_PRINTCLIENT, (WPARAM) dc, PRF_CLIENT);
|
SendMessageW(parent, WM_PRINTCLIENT, (WPARAM) dc, PRF_CLIENT);
|
||||||
EndPaint(hwnd, &ps);
|
EndPaint(hwnd, &ps);
|
||||||
return 0;
|
return 0;
|
||||||
|
#else
|
||||||
|
/* paint the parent's background in a flicker-free way */
|
||||||
|
dc = BeginPaint(hwnd, &ps);
|
||||||
|
if (dc == NULL)
|
||||||
|
abort();//TODO
|
||||||
|
parent = GetParent(hwnd);
|
||||||
|
if (parent == NULL)
|
||||||
|
abort();//TODO
|
||||||
|
if (GetWindowRect(hwnd, &r) == 0)
|
||||||
|
abort();//TODO
|
||||||
|
/* GetWindowRect() returns in screen coordinates; we want parent client */
|
||||||
|
client.x = r.left;
|
||||||
|
client.y = r.top;
|
||||||
|
if (ScreenToClient(parent, &client) == 0)
|
||||||
|
abort();//TODO
|
||||||
|
rdc = CreateCompatibleDC(dc);
|
||||||
|
if (rdc == NULL)
|
||||||
|
abort();//TODO
|
||||||
|
rbitmap = CreateCompatibleBitmap(dc, r.right - r.left, r.bottom - r.top);
|
||||||
|
if (rbitmap == NULL)
|
||||||
|
abort();//TODO
|
||||||
|
prevrbitmap = SelectObject(rdc, rbitmap);
|
||||||
|
if (prevrbitmap == NULL)
|
||||||
|
abort();//TODO
|
||||||
|
if (SetWindowOrgEx(rdc, client.x, client.y, NULL) == 0)
|
||||||
|
abort();//TODO
|
||||||
|
SendMessageW(parent, WM_PRINTCLIENT, (WPARAM) rdc, PRF_CLIENT);
|
||||||
|
if (BitBlt(dc, 0, 0, (int) (r.right - r.left), (int) (r.bottom - r.top),
|
||||||
|
rdc, 0, 0, SRCCOPY) == 0)
|
||||||
|
abort();//TODO
|
||||||
|
if (SelectObject(rdc, prevrbitmap) != rbitmap)
|
||||||
|
abort();//TODO
|
||||||
|
if (DeleteObject(rbitmap) == 0)
|
||||||
|
abort();//TODO
|
||||||
|
if (DeleteDC(rdc) == 0)
|
||||||
|
abort();//TODO
|
||||||
|
EndPaint(hwnd, &ps);
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
case WM_ERASEBKGND:
|
case WM_ERASEBKGND:
|
||||||
/* we paint our own background above */
|
/* we paint our own background above */
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue