Clear an old button text in WM_SETTEXT as Windows does
Dmitry Timoshkov
dmitry at baikal.ru
Mon May 20 08:19:33 CDT 2002
Hello.
This is a fix for WineHQ bug #437.
P.S.
Could somebody with slightly more free time fix DrawText(DT_CALCRECT),
since it returns width much larger than an expected value?
To test just replace
hbrush = SendMessageW(GetParent(hWnd), WM_CTLCOLORSTATIC, hdc, (LPARAM)hWnd);
by
hbrush = GetStockObject(WHITE_BRUSH);
below.
Thanks in advance.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Clear an old button text in WM_SETTEXT as Windows does.
--- cvs/hq/wine/controls/button.c Tue Mar 12 13:38:27 2002
+++ wine/controls/button.c Mon May 20 22:03:06 2002
@@ -47,6 +47,7 @@
#define BUTTON_UNKNOWN2 0x20
#define BUTTON_UNKNOWN3 0x10
+static UINT BUTTON_CalcLabelRect( HWND hwnd, HDC hdc, RECT *rc );
static void PB_Paint( HWND hwnd, HDC hDC, UINT action );
static void CB_Paint( HWND hwnd, HDC hDC, UINT action );
static void GB_Paint( HWND hwnd, HDC hDC, UINT action );
@@ -301,10 +302,33 @@
break;
case WM_SETTEXT:
+ {
+ /* Clear an old text here as Windows does */
+ HDC hdc = GetDC(hWnd);
+ HBRUSH hbrush;
+ RECT client, rc;
+
+ hbrush = SendMessageW(GetParent(hWnd), WM_CTLCOLORSTATIC, hdc, (LPARAM)hWnd);
+ if (!hbrush) /* did the app forget to call DefWindowProc ? */
+ hbrush = DefWindowProcW(GetParent(hWnd), WM_CTLCOLORSTATIC, hdc, (LPARAM)hWnd);
+
+ GetClientRect(hWnd, &client);
+ rc = client;
+ BUTTON_CalcLabelRect(hWnd, hdc, &rc);
+ /* Clip by client rect bounds */
+ if (rc.right > client.right) rc.right = client.right;
+ if (rc.bottom > client.bottom) rc.bottom = client.bottom;
+ FillRect(hdc, &rc, hbrush);
+ ReleaseDC(hWnd, hdc);
+
if (unicode) DefWindowProcW( hWnd, WM_SETTEXT, wParam, lParam );
else DefWindowProcA( hWnd, WM_SETTEXT, wParam, lParam );
- paint_button( hWnd, btn_type, ODA_DRAWENTIRE );
+ if (btn_type == BS_GROUPBOX) /* Yes, only for BS_GROUPBOX */
+ InvalidateRect( hWnd, NULL, TRUE );
+ else
+ paint_button( hWnd, btn_type, ODA_DRAWENTIRE );
return 1; /* success. FIXME: check text length */
+ }
case WM_SETFONT:
set_button_font( hWnd, wParam );
More information about the wine-patches
mailing list