Module: wine Branch: master Commit: 9cb29e5182622f7db8316f62fe82e114df73d570 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9cb29e5182622f7db8316f62fe...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Oct 4 12:38:36 2017 +0200
user32: Don't invalidate ComboBox on LBN_SELCHANGE and LBN_SELCANCEL.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/combo.c | 121 ++++++++++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 60 deletions(-)
diff --git a/dlls/user32/combo.c b/dlls/user32/combo.c index 4b6bc4f..ee9ce0a 100644 --- a/dlls/user32/combo.c +++ b/dlls/user32/combo.c @@ -646,13 +646,58 @@ static void CBPaintButton( LPHEADCOMBO lphc, HDC hdc, RECT rectButton) }
/*********************************************************************** + * COMBO_PrepareColors + * + * This method will sent the appropriate WM_CTLCOLOR message to + * prepare and setup the colors for the combo's DC. + * + * It also returns the brush to use for the background. + */ +static HBRUSH COMBO_PrepareColors( + LPHEADCOMBO lphc, + HDC hDC) +{ + HBRUSH hBkgBrush; + + /* + * Get the background brush for this control. + */ + if (CB_DISABLED(lphc)) + { + hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLORSTATIC, + (WPARAM)hDC, (LPARAM)lphc->self ); + + /* + * We have to change the text color since WM_CTLCOLORSTATIC will + * set it to the "enabled" color. This is the same behavior as the + * edit control + */ + SetTextColor(hDC, GetSysColor(COLOR_GRAYTEXT)); + } + else + { + /* FIXME: In which cases WM_CTLCOLORLISTBOX should be sent? */ + hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLOREDIT, + (WPARAM)hDC, (LPARAM)lphc->self ); + } + + /* + * Catch errors. + */ + if( !hBkgBrush ) + hBkgBrush = GetSysColorBrush(COLOR_WINDOW); + + return hBkgBrush; +} + +/*********************************************************************** * CBPaintText * * Paint CBS_DROPDOWNLIST text field / update edit control contents. */ static void CBPaintText( LPHEADCOMBO lphc, - HDC hdc) + HDC hdc_paint) { RECT rectEdit = lphc->textRect; INT id, size = 0; @@ -690,14 +735,20 @@ static void CBPaintText( } else /* paint text field ourselves */ { - UINT itemState = ODS_COMBOBOXEDIT; - HFONT hPrevFont = (lphc->hFont) ? SelectObject(hdc, lphc->hFont) : 0; + HDC hdc = hdc_paint ? hdc_paint : GetDC(lphc->self); + UINT itemState = ODS_COMBOBOXEDIT; + HFONT hPrevFont = (lphc->hFont) ? SelectObject(hdc, lphc->hFont) : 0; + HBRUSH hPrevBrush, hBkgBrush;
/* * Give ourselves some space. */ InflateRect( &rectEdit, -1, -1 );
+ hBkgBrush = COMBO_PrepareColors( lphc, hdc ); + hPrevBrush = SelectObject( hdc, hBkgBrush ); + FillRect( hdc, &rectEdit, hBkgBrush ); + if( CB_OWNERDRAWN(lphc) ) { DRAWITEMSTRUCT dis; @@ -757,6 +808,12 @@ static void CBPaintText(
if( hPrevFont ) SelectObject(hdc, hPrevFont ); + + if( hPrevBrush ) + SelectObject( hdc, hPrevBrush ); + + if( !hdc_paint ) + ReleaseDC( lphc->self, hdc ); } HeapFree( GetProcessHeap(), 0, pText ); } @@ -787,52 +844,6 @@ static void CBPaintBorder( }
/*********************************************************************** - * COMBO_PrepareColors - * - * This method will sent the appropriate WM_CTLCOLOR message to - * prepare and setup the colors for the combo's DC. - * - * It also returns the brush to use for the background. - */ -static HBRUSH COMBO_PrepareColors( - LPHEADCOMBO lphc, - HDC hDC) -{ - HBRUSH hBkgBrush; - - /* - * Get the background brush for this control. - */ - if (CB_DISABLED(lphc)) - { - hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLORSTATIC, - (WPARAM)hDC, (LPARAM)lphc->self ); - - /* - * We have to change the text color since WM_CTLCOLORSTATIC will - * set it to the "enabled" color. This is the same behavior as the - * edit control - */ - SetTextColor(hDC, GetSysColor(COLOR_GRAYTEXT)); - } - else - { - /* FIXME: In which cases WM_CTLCOLORLISTBOX should be sent? */ - hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLOREDIT, - (WPARAM)hDC, (LPARAM)lphc->self ); - } - - /* - * Catch errors. - */ - if( !hBkgBrush ) - hBkgBrush = GetSysColorBrush(COLOR_WINDOW); - - return hBkgBrush; -} - - -/*********************************************************************** * COMBO_Paint */ static LRESULT COMBO_Paint(LPHEADCOMBO lphc, HDC hParamDC) @@ -1285,18 +1296,8 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd ) if( HIWORD(wParam) == LBN_SELCHANGE) { if( lphc->wState & CBF_EDIT ) - { - INT index = SendMessageW(lphc->hWndLBox, LB_GETCURSEL, 0, 0); lphc->wState |= CBF_NOLBSELECT; - CBUpdateEdit( lphc, index ); - /* select text in edit, as Windows does */ - SendMessageW(lphc->hWndEdit, EM_SETSEL, 0, -1); - } - else - { - InvalidateRect(lphc->self, &lphc->textRect, TRUE); - UpdateWindow(lphc->self); - } + CBPaintText( lphc, NULL ); } break;