Author: jimtabor Date: Sun Sep 11 00:57:38 2016 New Revision: 72650
URL: http://svn.reactos.org/svn/reactos?rev=72650&view=rev Log: [USER32] - Sync with Wine Staging 1.9.18.
Modified: trunk/reactos/win32ss/user/user32/controls/button.c
Modified: trunk/reactos/win32ss/user/user32/controls/button.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/control... ============================================================================== --- trunk/reactos/win32ss/user/user32/controls/button.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/user32/controls/button.c [iso-8859-1] Sun Sep 11 00:57:38 2016 @@ -135,10 +135,6 @@ OB_Paint /* BS_OWNERDRAW */ };
-static HBITMAP hbitmapCheckBoxes = 0; -static WORD checkBoxWidth = 0, checkBoxHeight = 0; - - /********************************************************************* * button class descriptor */ @@ -272,7 +268,8 @@ } } } - + else + return 0; #else if (!IsWindow( hWnd )) return 0; #endif @@ -299,14 +296,6 @@ break;
case WM_CREATE: - if (!hbitmapCheckBoxes) - { - BITMAP bmp; - hbitmapCheckBoxes = LoadBitmapW(0, MAKEINTRESOURCEW(OBM_CHECKBOXES)); - GetObjectW( hbitmapCheckBoxes, sizeof(bmp), &bmp ); - checkBoxWidth = bmp.bmWidth / 4; - checkBoxHeight = bmp.bmHeight / 3; - } if (btn_type >= MAX_BTN_TYPE) return -1; /* abort */
@@ -400,8 +389,9 @@ break; /* fall through */ case WM_LBUTTONUP: - { +#ifdef _REACTOS_ BOOL TellParent = FALSE; //// ReactOS see note below. +#endif state = get_button_state( hWnd ); if (!(state & BUTTON_BTNPRESSED)) break; state &= BUTTON_NSTATES; @@ -429,15 +419,27 @@ (state & BST_INDETERMINATE) ? 0 : ((state & 3) + 1), 0 ); break; } +#ifdef _REACTOS_ TellParent = TRUE; // <---- Fix CORE-10194, Notify parent after capture is released. - } +#else + ReleaseCapture(); + BUTTON_NOTIFY_PARENT(hWnd, BN_CLICKED); +#endif + } +#ifdef _REACTOS_ ReleaseCapture(); if (TellParent) BUTTON_NOTIFY_PARENT(hWnd, BN_CLICKED); - } +#else + else + { + ReleaseCapture(); + } +#endif break;
case WM_CAPTURECHANGED: TRACE("WM_CAPTURECHANGED %p\n", hWnd); + if (hWnd == (HWND)lParam) break; state = get_button_state( hWnd ); if (state & BUTTON_BTNPRESSED) { @@ -459,36 +461,37 @@ { /* Clear an old text here as Windows does */ // +// ReactOS Note : // wine Bug: http://bugs.winehq.org/show_bug.cgi?id=25790 // Patch: http://source.winehq.org/patches/data/70889 // By: Alexander LAW, Replicate Windows behavior of WM_SETTEXT handler regarding WM_CTLCOLOR* // #ifdef __REACTOS__ if (style & WS_VISIBLE) - { -#endif +#else + if (IsWindowVisible(hWnd)) +#endif + { HDC hdc = GetDC(hWnd); HBRUSH hbrush; RECT client, rc; HWND parent = GetParent(hWnd); -#ifdef __REACTOS__ - UINT ctlMessage = (btn_type == BS_PUSHBUTTON || - btn_type == BS_DEFPUSHBUTTON || - btn_type == BS_PUSHLIKE || - btn_type == BS_USERBUTTON || - btn_type == BS_OWNERDRAW) ? - WM_CTLCOLORBTN : WM_CTLCOLORSTATIC; -#endif + UINT message = (btn_type == BS_PUSHBUTTON || + btn_type == BS_DEFPUSHBUTTON || + btn_type == BS_PUSHLIKE || + btn_type == BS_USERBUTTON || + btn_type == BS_OWNERDRAW) ? + WM_CTLCOLORBTN : WM_CTLCOLORSTATIC;
if (!parent) parent = hWnd; #ifdef __REACTOS__ - hbrush = GetControlColor(parent, hWnd, hdc, ctlMessage); -#else - hbrush = (HBRUSH)SendMessageW(parent, WM_CTLCOLORSTATIC, - (WPARAM)hdc, (LPARAM)hWnd); - if (!hbrush) /* did the app forget to call DefWindowProc ? */ - hbrush = (HBRUSH)DefWindowProcW(parent, WM_CTLCOLORSTATIC, - (WPARAM)hdc, (LPARAM)hWnd); + hbrush = GetControlColor(parent, hWnd, hdc, message); +#else + 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); #endif
GetClientRect(hWnd, &client); @@ -499,9 +502,7 @@ if (rc.bottom > client.bottom) rc.bottom = client.bottom; FillRect(hdc, &rc, hbrush); ReleaseDC(hWnd, hdc); -#ifdef __REACTOS__ - } -#endif + }
if (unicode) DefWindowProcW( hWnd, WM_SETTEXT, wParam, lParam ); else DefWindowProcA( hWnd, WM_SETTEXT, wParam, lParam ); @@ -842,11 +843,8 @@ static BOOL CALLBACK BUTTON_DrawTextCallback(HDC hdc, LPARAM lp, WPARAM wp, int cx, int cy) { RECT rc; - rc.left = 0; - rc.top = 0; - rc.right = cx; - rc.bottom = cy; - + + SetRect(&rc, 0, 0, cx, cy); DrawTextW(hdc, (LPCWSTR)lp, -1, &rc, (UINT)wp); return TRUE; } @@ -1026,7 +1024,7 @@ { RECT rbox, rtext, client; HBRUSH hBrush; - int delta; + int delta, text_offset, checkBoxWidth, checkBoxHeight; UINT dtFlags; HFONT hFont; LONG state = get_button_state( hwnd ); @@ -1043,7 +1041,12 @@ GetClientRect(hwnd, &client); rbox = rtext = client;
+ checkBoxWidth = 12 * GetDeviceCaps( hDC, LOGPIXELSX ) / 96 + 1; + checkBoxHeight = 12 * GetDeviceCaps( hDC, LOGPIXELSY ) / 96 + 1; + if ((hFont = get_button_font( hwnd ))) SelectObject( hDC, hFont ); + GetCharWidthW( hDC, '0', '0', &text_offset ); + text_offset /= 2;
parent = GetParent(hwnd); if (!parent) parent = hwnd; @@ -1062,12 +1065,12 @@ { /* magic +4 is what CTL3D expects */
- rtext.right -= checkBoxWidth + 4; + rtext.right -= checkBoxWidth + text_offset;; rbox.left = rbox.right - checkBoxWidth; } else { - rtext.left += checkBoxWidth + 4; + rtext.left += checkBoxWidth + text_offset;; rbox.right = checkBoxWidth; }