https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e3e173ffaafbccb0e9b52…
commit e3e173ffaafbccb0e9b52926d41626d5a4dc38cd
Author: Joachim Henze <Joachim.Henze(a)reactos.org>
AuthorDate: Sat Mar 16 02:11:00 2019 +0100
Commit: Joachim Henze <Joachim.Henze(a)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/313c63e194aebdd517b3a85f8fe4d…
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;