Module: wine Branch: master Commit: bc3f40e21a4beaaabd2d865838bef99a3d12f908 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bc3f40e21a4beaaabd2d865838...
Author: Alexander Lakhin exclusion@gmail.com Date: Tue Apr 19 22:15:24 2016 +0200
user32: Send WM_CTLCOLOR* message only for visible buttons.
Signed-off-by: Sebastian Lackner sebastian@fds-team.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/button.c | 53 ++++++++++++++++++++++++++----------------------- dlls/user32/tests/msg.c | 4 ++-- 2 files changed, 30 insertions(+), 27 deletions(-)
diff --git a/dlls/user32/button.c b/dlls/user32/button.c index efd74f9..13fc746 100644 --- a/dlls/user32/button.c +++ b/dlls/user32/button.c @@ -385,31 +385,34 @@ LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, case WM_SETTEXT: { /* Clear an old text here as Windows does */ - HDC hdc = GetDC(hWnd); - HBRUSH hbrush; - RECT client, rc; - HWND parent = GetParent(hWnd); - UINT message = (btn_type == BS_PUSHBUTTON || - btn_type == BS_DEFPUSHBUTTON || - btn_type == BS_USERBUTTON || - btn_type == BS_OWNERDRAW) ? - WM_CTLCOLORBTN : WM_CTLCOLORSTATIC; - - if (!parent) parent = hWnd; - hbrush = (HBRUSH)SendMessageW(parent, message, - (WPARAM)hdc, (LPARAM)hWnd); - if (!hbrush) /* did the app forget to call DefWindowProc ? */ - hbrush = (HBRUSH)DefWindowProcW(parent, message, - (WPARAM)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 (IsWindowVisible(hWnd)) + { + HDC hdc = GetDC(hWnd); + HBRUSH hbrush; + RECT client, rc; + HWND parent = GetParent(hWnd); + UINT message = (btn_type == BS_PUSHBUTTON || + btn_type == BS_DEFPUSHBUTTON || + btn_type == BS_USERBUTTON || + btn_type == BS_OWNERDRAW) ? + WM_CTLCOLORBTN : WM_CTLCOLORSTATIC; + + if (!parent) parent = hWnd; + hbrush = (HBRUSH)SendMessageW(parent, message, + (WPARAM)hdc, (LPARAM)hWnd); + if (!hbrush) /* did the app forget to call DefWindowProc ? */ + hbrush = (HBRUSH)DefWindowProcW(parent, message, + (WPARAM)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 ); diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 046cfae..8ab6e15 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -5938,7 +5938,7 @@ static void test_button_messages(void)
SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)"Text 2"); sprintf(desc, "button[%i]: WM_SETTEXT on an invisible button", i); - ok_sequence(WmSetTextInvisibleSeq, desc, TRUE); + ok_sequence(WmSetTextInvisibleSeq, desc, FALSE);
ShowWindow(hwnd, SW_SHOW); ShowWindow(parent, SW_HIDE); @@ -5947,7 +5947,7 @@ static void test_button_messages(void)
SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)"Text 3"); sprintf(desc, "button[%i]: WM_SETTEXT on an invisible button", i); - ok_sequence(WmSetTextInvisibleSeq, desc, TRUE); + ok_sequence(WmSetTextInvisibleSeq, desc, FALSE);
ShowWindow(parent, SW_SHOW); flush_events();