lsla@post.cz writes:
Where the Wine's GetClipRect returns the area of the parent, the Windows version returns only the area of the child. Therefore in Wine the WM_ERASEBKGND message erases the whole parent including the other radio buttons.
I think GetClipBox is correct, the problem is that the WM_ERASEBKGND handler should not be using it, but GetClientRect. You can try this:
Index: windows/defwnd.c =================================================================== RCS file: /opt/cvs-commit/wine/windows/defwnd.c,v retrieving revision 1.57 diff -u -r1.57 defwnd.c --- windows/defwnd.c 2001/06/20 23:16:34 1.57 +++ windows/defwnd.c 2001/07/27 23:47:26 @@ -457,20 +457,15 @@ case WM_ICONERASEBKGND: { RECT rect; + HDC hdc = (HDC)wParam; HBRUSH hbr = GetClassLongW( wndPtr->hwndSelf, GCL_HBRBACKGROUND ); if (!hbr) return 0;
- /* Since WM_ERASEBKGND may receive either a window dc or a */ - /* client dc, the area to be erased has to be retrieved from */ - /* the device context. */ - GetClipBox( (HDC)wParam, &rect ); - - /* Always call the Win32 variant of FillRect even on Win16, - * since despite the fact that Win16, as well as Win32, - * supports special background brushes for a window class, - * the Win16 variant of FillRect does not. - */ - FillRect( (HDC) wParam, &rect, hbr ); + /* GetClientRect used to be GetClipBox, but it is not what + * Windows does, and it breaks badly with CS_PARENTDC */ + GetClientRect( wndPtr->hwndSelf, &rect ); + DPtoLP( hdc, (LPPOINT)&rect, 2 ); + FillRect( hdc, &rect, hbr ); return 1; }