https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e3e173ffaafbccb0e9b529...
commit e3e173ffaafbccb0e9b52926d41626d5a4dc38cd Author: Joachim Henze Joachim.Henze@reactos.org AuthorDate: Sat Mar 16 02:11:00 2019 +0100 Commit: Joachim Henze Joachim.Henze@reactos.org CommitDate: Sat Mar 16 02:11:00 2019 +0100
[COMCTL32] Combobox Implement logic for set and get dropdown height CORE-15833
by import of Wine commit https://source.winehq.org/git/wine.git/commit/313c63e194aebdd517b3a85f8fe4d8... merged from current Wine head.
Thanks to patches author Fabian Maurer and also Doug Lyons for tests and adding initial the merge-patch. --- dll/win32/comctl32/combo.c | 43 +++++++++++++++++++++++-------------------- dll/win32/comctl32/comctl32.h | 1 + 2 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/dll/win32/comctl32/combo.c b/dll/win32/comctl32/combo.c index ee374f4537..abbe395090 100644 --- a/dll/win32/comctl32/combo.c +++ b/dll/win32/comctl32/combo.c @@ -18,10 +18,6 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * - * TODO: - * - ComboBox_[GS]etMinVisible() - * - CB_GETMINVISIBLE, CB_SETMINVISIBLE - * - CB_SETTOPINDEX */
#include <stdarg.h> @@ -459,6 +455,11 @@ static LRESULT COMBO_Create( HWND hwnd, LPHEADCOMBO lphc, HWND hwndParent, LONG */ lphc->wState |= CBF_MEASUREITEM;
+ /* + * Per default the comctl32 version of combo shows up to 30 items + */ + lphc->visibleItems = 30; + /* M$ IE 3.01 actually creates (and rapidly destroys) an ownerless combobox */
if( lphc->owner || !(style & WS_VISIBLE) ) @@ -1010,23 +1011,18 @@ static void CBDropDown( LPHEADCOMBO lphc )
if (nItems > 0) { - int nHeight; - int nIHeight; - - nIHeight = (int)SendMessageW(lphc->hWndLBox, LB_GETITEMHEIGHT, 0, 0); + int nIHeight = (int)SendMessageW(lphc->hWndLBox, LB_GETITEMHEIGHT, 0, 0);
- nHeight = nIHeight*nItems; - - if (nHeight < nDroppedHeight - COMBO_YBORDERSIZE()) - nDroppedHeight = nHeight + COMBO_YBORDERSIZE(); - - if (nDroppedHeight < nHeight) - { - if (nItems < 5) - nDroppedHeight = (nItems+1)*nIHeight; - else if (nDroppedHeight < 6*nIHeight) - nDroppedHeight = 6*nIHeight; - } + if (lphc->dwStyle & CBS_NOINTEGRALHEIGHT) + { + nDroppedHeight -= 1; + } + else + { + if (nItems > lphc->visibleItems) + nItems = lphc->visibleItems; + nDroppedHeight = nItems * nIHeight + COMBO_YBORDERSIZE(); + } }
r.left = rect.left; @@ -2135,6 +2131,13 @@ static LRESULT CALLBACK COMBO_WindowProc( HWND hwnd, UINT message, WPARAM wParam return SendMessageW(lphc->hWndEdit, EM_LIMITTEXT, wParam, lParam); return TRUE;
+ case CB_GETMINVISIBLE: + return lphc->visibleItems; + + case CB_SETMINVISIBLE: + lphc->visibleItems = (INT)wParam; + return TRUE; + default: if (message >= WM_USER) WARN("unknown msg WM_USER+%04x wp=%04lx lp=%08lx\n", message - WM_USER, wParam, lParam ); diff --git a/dll/win32/comctl32/comctl32.h b/dll/win32/comctl32/comctl32.h index ee47772658..73564eb294 100644 --- a/dll/win32/comctl32/comctl32.h +++ b/dll/win32/comctl32/comctl32.h @@ -147,6 +147,7 @@ typedef struct INT fixedOwnerDrawHeight; INT droppedWidth; /* last two are not used unless set */ INT editHeight; /* explicitly */ + INT visibleItems; } HEADCOMBO, *LPHEADCOMBO;
extern BOOL COMBO_FlipListbox(HEADCOMBO *lphc, BOOL ok, BOOL bRedrawButton) DECLSPEC_HIDDEN;