Dmitry Timoshkov : user32: Always clip the button painting to the client rectangle.
Alexandre Julliard
julliard at winehq.org
Mon Dec 17 06:42:23 CST 2007
Module: wine
Branch: master
Commit: aec7e91d53f8ab60ba8e810a5cf72afdc1213bf0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=aec7e91d53f8ab60ba8e810a5cf72afdc1213bf0
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Thu Dec 13 23:58:45 2007 +0800
user32: Always clip the button painting to the client rectangle.
---
dlls/user32/button.c | 32 ++++++++++++++++++--------------
1 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/button.c b/dlls/user32/button.c
index 6e21bbc..d6ee30c 100644
--- a/dlls/user32/button.c
+++ b/dlls/user32/button.c
@@ -217,6 +217,15 @@ static inline WCHAR *get_button_text( HWND hwnd )
return buffer;
}
+static void setup_clipping( HWND hwnd, HDC hdc )
+{
+ RECT rc;
+
+ GetClientRect( hwnd, &rc );
+ DPtoLP( hdc, (POINT *)&rc, 2 );
+ IntersectClipRect( hdc, rc.left, rc.top, rc.right, rc.bottom );
+}
+
/***********************************************************************
* ButtonWndProc_common
*/
@@ -798,6 +807,9 @@ static void PB_Paint( HWND hwnd, HDC hDC, UINT action )
parent = GetParent(hwnd);
if (!parent) parent = hwnd;
SendMessageW( parent, WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hwnd );
+
+ setup_clipping( hwnd, hDC );
+
hOldPen = (HPEN)SelectObject(hDC, SYSCOLOR_GetPen(COLOR_WINDOWFRAME));
hOldBrush =(HBRUSH)SelectObject(hDC,GetSysColorBrush(COLOR_BTNFACE));
oldBkMode = SetBkMode(hDC, TRANSPARENT);
@@ -970,7 +982,7 @@ static void CB_Paint( HWND hwnd, HDC hDC, UINT action )
if (dtFlags == (UINT)-1L) /* Noting to draw */
return;
- IntersectClipRect(hDC, client.left, client.top, client.right, client.bottom);
+ setup_clipping( hwnd, hDC );
if (action == ODA_DRAWENTIRE)
BUTTON_DrawLabel(hwnd, hDC, dtFlags, &rtext);
@@ -1046,6 +1058,8 @@ static void GB_Paint( HWND hwnd, HDC hDC, UINT action )
if (dtFlags == (UINT)-1L)
return;
+ setup_clipping( hwnd, hDC );
+
/* Because buttons have CS_PARENTDC class style, there is a chance
* that label will be drawn out of client rect.
* But Windows doesn't clip label's rect, so do I.
@@ -1100,8 +1114,6 @@ static void OB_Paint( HWND hwnd, HDC hDC, UINT action )
{
LONG state = get_button_state( hwnd );
DRAWITEMSTRUCT dis;
- HRGN clipRegion;
- RECT clipRect;
LONG_PTR id = GetWindowLongPtrW( hwnd, GWLP_ID );
HWND parent;
HFONT hFont, hPrevFont = 0;
@@ -1118,21 +1130,13 @@ static void OB_Paint( HWND hwnd, HDC hDC, UINT action )
dis.itemData = 0;
GetClientRect( hwnd, &dis.rcItem );
- clipRegion = CreateRectRgnIndirect(&dis.rcItem);
- if (GetClipRgn(hDC, clipRegion) != 1)
- {
- DeleteObject(clipRegion);
- clipRegion=NULL;
- }
- clipRect = dis.rcItem;
- DPtoLP(hDC, (LPPOINT) &clipRect, 2);
- IntersectClipRect(hDC, clipRect.left, clipRect.top, clipRect.right, clipRect.bottom);
-
if ((hFont = get_button_font( hwnd ))) hPrevFont = SelectObject( hDC, hFont );
parent = GetParent(hwnd);
if (!parent) parent = hwnd;
SendMessageW( parent, WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hwnd );
+
+ setup_clipping( hwnd, hDC );
+
SendMessageW( GetParent(hwnd), WM_DRAWITEM, id, (LPARAM)&dis );
if (hPrevFont) SelectObject(hDC, hPrevFont);
- SelectClipRgn(hDC, clipRegion);
}
More information about the wine-cvs
mailing list