From 911e63e10351b81f4f7092e77c030b7bc1a54b7a Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 4 Aug 2012 02:05:01 +0000 Subject: [PATCH] [User32] - Combo port sync wine 1.5.10. svn path=/trunk/; revision=57039 --- reactos/media/doc/README.WINE | 2 +- reactos/win32ss/user/user32/controls/combo.c | 95 ++++++++------------ 2 files changed, 37 insertions(+), 60 deletions(-) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index d0cb0b7f839..6cbd7e9dbaa 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -258,7 +258,7 @@ msvcrt - User32 - reactos/dll/win32/user32/controls/button.c # Synced to Wine-1_1_39 - reactos/dll/win32/user32/controls/combo.c # Synced to Wine-1_1_39 + reactos/dll/win32/user32/controls/combo.c # Synced to Wine-1.5.10 reactos/dll/win32/user32/controls/edit.c # Synced to Wine-1_1_40 reactos/dll/win32/user32/controls/icontitle.c # Synced to Wine-1_1_39 reactos/dll/win32/user32/controls/listbox.c # Synced to Wine-1_1_39 diff --git a/reactos/win32ss/user/user32/controls/combo.c b/reactos/win32ss/user/user32/controls/combo.c index 0edcbf73945..f8fd7f51b10 100644 --- a/reactos/win32ss/user/user32/controls/combo.c +++ b/reactos/win32ss/user/user32/controls/combo.c @@ -450,50 +450,6 @@ static void CBGetDroppedControlRect( LPHEADCOMBO lphc, LPRECT lpRect) } -/*********************************************************************** - * COMBO_WindowPosChanging - */ -static LRESULT COMBO_WindowPosChanging( - HWND hwnd, - LPHEADCOMBO lphc, - WINDOWPOS* posChanging) -{ - /* - * We need to override the WM_WINDOWPOSCHANGING method to handle all - * the non-simple comboboxes. The problem is that those controls are - * always the same height. We have to make sure they are not resized - * to another value. - */ - if ( ( CB_GETTYPE(lphc) != CBS_SIMPLE ) && - ((posChanging->flags & SWP_NOSIZE) == 0) ) - { - int newComboHeight; - - newComboHeight = CBGetTextAreaHeight(hwnd,lphc) + - 2*COMBO_YBORDERSIZE(); - - /* - * Resizing a combobox has another side effect, it resizes the dropped - * rectangle as well. However, it does it only if the new height for the - * combobox is more than the height it should have. In other words, - * if the application resizing the combobox only had the intention to resize - * the actual control, for example, to do the layout of a dialog that is - * resized, the height of the dropdown is not changed. - */ - if (posChanging->cy > newComboHeight) - { - TRACE("posChanging->cy=%d, newComboHeight=%d, oldbot=%d, oldtop=%d\n", - posChanging->cy, newComboHeight, lphc->droppedRect.bottom, - lphc->droppedRect.top); - lphc->droppedRect.bottom = lphc->droppedRect.top + posChanging->cy - newComboHeight; - - } - posChanging->cy = newComboHeight; - } - - return 0; -} - /*********************************************************************** * COMBO_Create */ @@ -1550,15 +1506,48 @@ static void CBResetPos( /*********************************************************************** * COMBO_Size */ -static void COMBO_Size( LPHEADCOMBO lphc, BOOL bRedraw ) +static void COMBO_Size( LPHEADCOMBO lphc, LPARAM lParam ) +{ + /* + * Those controls are always the same height. So we have to make sure + * they are not resized to another value. + */ + if( CB_GETTYPE(lphc) != CBS_SIMPLE ) { + int newComboHeight; + + newComboHeight = CBGetTextAreaHeight(lphc->self, lphc) + 2*COMBO_YBORDERSIZE(); + + /* + * Resizing a combobox has another side effect, it resizes the dropped + * rectangle as well. However, it does it only if the new height for the + * combobox is more than the height it should have. In other words, + * if the application resizing the combobox only had the intention to resize + * the actual control, for example, to do the layout of a dialog that is + * resized, the height of the dropdown is not changed. + */ + if( HIWORD(lParam) > newComboHeight ) + { + TRACE("oldComboHeight=%d, newComboHeight=%d, oldDropBottom=%d, oldDropTop=%d\n", + HIWORD(lParam), newComboHeight, lphc->droppedRect.bottom, + lphc->droppedRect.top); + lphc->droppedRect.bottom = lphc->droppedRect.top + HIWORD(lParam) - newComboHeight; + } + /* + * Restore original height + */ + if( HIWORD(lParam) != newComboHeight ) + SetWindowPos(lphc->self, 0, 0, 0, LOWORD(lParam), newComboHeight, + SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOREDRAW); + } + CBCalcPlacement(lphc->self, lphc, &lphc->textRect, &lphc->buttonRect, &lphc->droppedRect); - CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, bRedraw ); + CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE ); } @@ -1894,21 +1883,9 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message, } return result; } - case WM_WINDOWPOSCHANGING: - return COMBO_WindowPosChanging(hwnd, lphc, (LPWINDOWPOS)lParam); - case WM_WINDOWPOSCHANGED: - /* SetWindowPos can be called on a Combobox to resize its Listbox. - * In that case, the Combobox itself will not be resized, so we won't - * get a WM_SIZE. Since we still want to update the Listbox, we have to - * do it here. - */ - /* we should not force repainting on WM_WINDOWPOSCHANGED, it breaks - * Z-order based painting. - */ - /* fall through */ case WM_SIZE: if( lphc->hWndLBox && - !(lphc->wState & CBF_NORESIZE) ) COMBO_Size( lphc, message == WM_SIZE ); + !(lphc->wState & CBF_NORESIZE) ) COMBO_Size( lphc, lParam ); return TRUE; case WM_SETFONT: COMBO_Font( lphc, (HFONT)wParam, (BOOL)lParam );