diff --git a/dll/win32/comctl32/combo.c b/dll/win32/comctl32/combo.c index 712e27276a5..bf03292af1f 100644 --- a/dll/win32/comctl32/combo.c +++ b/dll/win32/comctl32/combo.c @@ -1050,8 +1050,7 @@ static void CBDropDown( LPHEADCOMBO lphc ) if( !(lphc->wState & CBF_NOREDRAW) ) - RedrawWindow( lphc->self, NULL, 0, RDW_INVALIDATE | - RDW_ERASE | RDW_UPDATENOW | RDW_NOCHILDREN ); + RedrawWindow( lphc->self, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW ); EnableWindow( lphc->hWndLBox, TRUE ); if (GetCapture() != lphc->self) diff --git a/win32ss/user/user32/controls/combo.c b/win32ss/user/user32/controls/combo.c index eb9d6fd86d7..2d43ca13fc6 100644 --- a/win32ss/user/user32/controls/combo.c +++ b/win32ss/user/user32/controls/combo.c @@ -17,18 +17,7 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * - * NOTES - * - * This code was audited for completeness against the documented features - * of Comctl32.dll version 6.0 on Oct. 4, 2004, by Dimitrie O. Paun. - * - * Unless otherwise noted, we believe this code to be complete, as per - * the specification mentioned above. - * If you discover missing features, or bugs, please note them below. - * * TODO: - * - ComboBox_[GS]etMinVisible() - * - CB_GETMINVISIBLE, CB_SETMINVISIBLE * - CB_SETTOPINDEX */ @@ -179,23 +168,17 @@ static LRESULT COMBO_NCCreate(HWND hwnd, LONG style) return FALSE; } -/*********************************************************************** - * COMBO_NCDestroy - */ static LRESULT COMBO_NCDestroy( LPHEADCOMBO lphc ) { + if (lphc) + { + if ((CB_GETTYPE(lphc) != CBS_SIMPLE) && lphc->hWndLBox) + DestroyWindow(lphc->hWndLBox); - if( lphc ) - { - TRACE("[%p]: freeing storage\n", lphc->self); - - if( (CB_GETTYPE(lphc) != CBS_SIMPLE) && lphc->hWndLBox ) - DestroyWindow( lphc->hWndLBox ); - - SetWindowLongPtrW( lphc->self, 0, 0 ); - HeapFree( GetProcessHeap(), 0, lphc ); - } - return 0; + SetWindowLongPtrW(lphc->self, 0, 0); + HeapFree(GetProcessHeap(), 0, lphc); + } + return 0; } /*********************************************************************** @@ -651,6 +634,44 @@ static void CBPaintButton( LPHEADCOMBO lphc, HDC hdc, RECT rectButton) DrawFrameControl(hdc, &rectButton, DFC_SCROLL, buttonState); } +/*********************************************************************** + * 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; + + if (CB_DISABLED(lphc)) + { +#ifdef __REACTOS__ + hBkgBrush = GetControlColor(lphc->owner, lphc->self, hDC, WM_CTLCOLORSTATIC); +#else + hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLORSTATIC, (WPARAM)hDC, (LPARAM)lphc->self); +#endif + SetTextColor(hDC, GetSysColor(COLOR_GRAYTEXT)); + } + else + { +#ifdef __REACTOS__ + hBkgBrush = GetControlColor(lphc->owner, lphc->self, hDC, WM_CTLCOLOREDIT); +#else + hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLOREDIT, (WPARAM)hDC, (LPARAM)lphc->self); +#endif + } + + if (!hBkgBrush) + hBkgBrush = GetSysColorBrush(COLOR_WINDOW); + + return hBkgBrush; +} + /*********************************************************************** * CBPaintText * @@ -696,8 +717,8 @@ static void CBPaintText( } else /* paint text field ourselves */ { - UINT itemState = ODS_COMBOBOXEDIT; - HFONT hPrevFont = (lphc->hFont) ? SelectObject(hdc, lphc->hFont) : 0; + UINT itemState = ODS_COMBOBOXEDIT; + HFONT hPrevFont = (lphc->hFont) ? SelectObject(hdc, lphc->hFont) : 0; /* * Give ourselves some space. @@ -801,117 +822,46 @@ static void CBPaintBorder( DrawEdge(hdc, &clientRect, EDGE_SUNKEN, BF_RECT); } -/*********************************************************************** - * 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)) - { -#ifdef __REACTOS__ - hBkgBrush = GetControlColor(lphc->owner, lphc->self, hDC, WM_CTLCOLORSTATIC); -#else - hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLORSTATIC, - (WPARAM)hDC, (LPARAM)lphc->self ); -#endif - /* - * 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? */ -#ifdef __REACTOS__ - hBkgBrush = GetControlColor(lphc->owner, lphc->self, hDC, WM_CTLCOLOREDIT); -#else - hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLOREDIT, - (WPARAM)hDC, (LPARAM)lphc->self ); -#endif - } - - /* - * Catch errors. - */ - if( !hBkgBrush ) - hBkgBrush = GetSysColorBrush(COLOR_WINDOW); - - return hBkgBrush; -} - - -/*********************************************************************** - * COMBO_Paint - */ static LRESULT COMBO_Paint(LPHEADCOMBO lphc, HDC hParamDC) { - PAINTSTRUCT ps; - HDC hDC; + PAINTSTRUCT ps; + HDC hDC; - hDC = (hParamDC) ? hParamDC - : BeginPaint( lphc->self, &ps); + hDC = (hParamDC) ? hParamDC : BeginPaint(lphc->self, &ps); - TRACE("hdc=%p\n", hDC); + if (hDC && !(lphc->wState & CBF_NOREDRAW)) + { + HBRUSH hPrevBrush, hBkgBrush; - if( hDC && !(lphc->wState & CBF_NOREDRAW) ) - { - HBRUSH hPrevBrush, hBkgBrush; + hBkgBrush = COMBO_PrepareColors(lphc, hDC); + hPrevBrush = SelectObject(hDC, hBkgBrush); + if (!(lphc->wState & CBF_EDIT)) + FillRect(hDC, &lphc->textRect, hBkgBrush); - /* - * Retrieve the background brush and select it in the - * DC. - */ - hBkgBrush = COMBO_PrepareColors(lphc, hDC); + CBPaintBorder(lphc->self, lphc, hDC); - hPrevBrush = SelectObject( hDC, hBkgBrush ); - if (!(lphc->wState & CBF_EDIT)) - FillRect(hDC, &lphc->textRect, hBkgBrush); + if (!IsRectEmpty(&lphc->buttonRect)) + CBPaintButton(lphc, hDC, lphc->buttonRect); - /* - * In non 3.1 look, there is a sunken border on the combobox - */ - CBPaintBorder(lphc->self, lphc, hDC); + if (CB_GETTYPE(lphc) != CBS_DROPDOWNLIST) + { + RECT rPadEdit = lphc->textRect; - if( !IsRectEmpty(&lphc->buttonRect) ) - { - CBPaintButton(lphc, hDC, lphc->buttonRect); - } + InflateRect(&rPadEdit, EDIT_CONTROL_PADDING(), EDIT_CONTROL_PADDING()); + FrameRect(hDC, &rPadEdit, GetSysColorBrush(COLOR_WINDOW)); + } - /* paint the edit control padding area */ - if (CB_GETTYPE(lphc) != CBS_DROPDOWNLIST) - { - RECT rPadEdit = lphc->textRect; + if (!(lphc->wState & CBF_EDIT)) + CBPaintText(lphc, hDC, lphc->textRect); - InflateRect(&rPadEdit, EDIT_CONTROL_PADDING(), EDIT_CONTROL_PADDING()); - - FrameRect( hDC, &rPadEdit, GetSysColorBrush(COLOR_WINDOW) ); - } - - if( !(lphc->wState & CBF_EDIT) ) - CBPaintText( lphc, hDC, lphc->textRect); - - if( hPrevBrush ) - SelectObject( hDC, hPrevBrush ); + if (hPrevBrush) + SelectObject(hDC, hPrevBrush); } - if( !hParamDC ) - EndPaint(lphc->self, &ps); + if (!hParamDC) + EndPaint(lphc->self, &ps); - return 0; + return 0; } /*********************************************************************** @@ -927,7 +877,7 @@ static INT CBUpdateLBox( LPHEADCOMBO lphc, BOOL bSelect ) idx = LB_ERR; length = SendMessageW( lphc->hWndEdit, WM_GETTEXTLENGTH, 0, 0 ); - if( length > 0 ) + if (length > 0) pText = HeapAlloc( GetProcessHeap(), 0, (length + 1) * sizeof(WCHAR)); TRACE("\t edit text length %i\n", length ); @@ -966,10 +916,8 @@ static void CBUpdateEdit( LPHEADCOMBO lphc , INT index ) length = SendMessageW(lphc->hWndLBox, LB_GETTEXTLEN, (WPARAM)index, 0); if( length != LB_ERR) { - if( (pText = HeapAlloc( GetProcessHeap(), 0, (length + 1) * sizeof(WCHAR))) ) - { + if ((pText = HeapAlloc(GetProcessHeap(), 0, (length + 1) * sizeof(WCHAR)))) SendMessageW(lphc->hWndLBox, LB_GETTEXT, (WPARAM)index, (LPARAM)pText ); - } } } @@ -1019,7 +967,7 @@ static void CBDropDown( LPHEADCOMBO lphc ) lphc->droppedIndex = SendMessageW(lphc->hWndLBox, LB_GETCURSEL, 0, 0); SendMessageW(lphc->hWndLBox, LB_SETTOPINDEX, - (WPARAM)(lphc->droppedIndex == LB_ERR ? 0 : lphc->droppedIndex), 0 ); + (WPARAM)(lphc->droppedIndex == LB_ERR ? 0 : lphc->droppedIndex), 0); SendMessageW(lphc->hWndLBox, LB_CARETON, 0, 0); } @@ -1058,10 +1006,10 @@ static void CBDropDown( LPHEADCOMBO lphc ) if (nDroppedHeight < nHeight) { - if (nItems < 5) - nDroppedHeight = (nItems+1)*nIHeight; - else if (nDroppedHeight < 6*nIHeight) - nDroppedHeight = 6*nIHeight; + if (nItems < 5) + nDroppedHeight = (nItems+1)*nIHeight; + else if (nDroppedHeight < 6*nIHeight) + nDroppedHeight = 6*nIHeight; } } @@ -1086,8 +1034,7 @@ static void CBDropDown( LPHEADCOMBO lphc ) if( !(lphc->wState & CBF_NOREDRAW) ) - RedrawWindow( lphc->self, NULL, 0, RDW_INVALIDATE | - RDW_ERASE | RDW_UPDATENOW | RDW_NOCHILDREN ); + RedrawWindow(lphc->self, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW); EnableWindow( lphc->hWndLBox, TRUE ); if (GetCapture() != lphc->self) @@ -1170,7 +1117,7 @@ BOOL COMBO_FlipListbox( LPHEADCOMBO lphc, BOOL ok, BOOL bRedrawButton ) * CBRepaintButton */ static void CBRepaintButton( LPHEADCOMBO lphc ) - { +{ InvalidateRect(lphc->self, &lphc->buttonRect, TRUE); UpdateWindow(lphc->self); } @@ -1212,7 +1159,7 @@ static void COMBO_KillFocus( LPHEADCOMBO lphc ) if( CB_GETTYPE(lphc) == CBS_DROPDOWNLIST ) SendMessageW(lphc->hWndLBox, LB_CARETOFF, 0, 0); - lphc->wState &= ~CBF_FOCUSED; + lphc->wState &= ~CBF_FOCUSED; /* redraw text */ if( !(lphc->wState & CBF_EDIT) ) @@ -1833,455 +1780,398 @@ static char *strdupA(LPCSTR str) */ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode ) { - LPHEADCOMBO lphc = (LPHEADCOMBO)GetWindowLongPtrW( hwnd, 0 ); + LPHEADCOMBO lphc = (LPHEADCOMBO)GetWindowLongPtrW(hwnd, 0); #ifdef __REACTOS__ - PWND pWnd; + PWND pWnd; - pWnd = ValidateHwnd(hwnd); - if (pWnd) - { - if (!pWnd->fnid) - { + pWnd = ValidateHwnd(hwnd); + if (pWnd) + { + if (!pWnd->fnid) NtUserSetWindowFNID(hwnd, FNID_COMBOBOX); - } - else - { + else + { if (pWnd->fnid != FNID_COMBOBOX) { - ERR("Wrong window class for ComboBox! fnId 0x%x\n",pWnd->fnid); - return 0; + ERR("Wrong window class for ComboBox! fnId 0x%x\n",pWnd->fnid); + return 0; } } - } + } #endif - TRACE("[%p]: msg %s wp %08lx lp %08lx\n", - hwnd, SPY_GetMsgName(message, hwnd), wParam, lParam ); - #ifndef __REACTOS__ - if (!IsWindow(hwnd)) return 0; + if (!IsWindow(hwnd)) return 0; #endif - if( lphc || message == WM_NCCREATE ) - switch(message) - { - - /* System messages */ - - case WM_NCCREATE: - { - LONG style = unicode ? ((LPCREATESTRUCTW)lParam)->style : - ((LPCREATESTRUCTA)lParam)->style; - return COMBO_NCCreate(hwnd, style); - } - case WM_NCDESTROY: - COMBO_NCDestroy(lphc); + if (lphc || message == WM_NCCREATE) + switch(message) + { + case WM_NCCREATE: + { + LONG style = unicode ? ((LPCREATESTRUCTW)lParam)->style : ((LPCREATESTRUCTA)lParam)->style; + return COMBO_NCCreate(hwnd, style); + } + case WM_NCDESTROY: + COMBO_NCDestroy(lphc); #ifdef __REACTOS__ - NtUserSetWindowFNID(hwnd, FNID_DESTROY); + NtUserSetWindowFNID(hwnd, FNID_DESTROY); #endif - break;/* -> DefWindowProc */ + break; + case WM_CREATE: + { + HWND hwndParent; + LONG style; + if(unicode) + { + hwndParent = ((LPCREATESTRUCTW)lParam)->hwndParent; + style = ((LPCREATESTRUCTW)lParam)->style; + } + else + { + hwndParent = ((LPCREATESTRUCTA)lParam)->hwndParent; + style = ((LPCREATESTRUCTA)lParam)->style; + } + return COMBO_Create(hwnd, lphc, hwndParent, style, unicode); + } + case WM_PRINTCLIENT: + case WM_PAINT: + return COMBO_Paint(lphc, (HDC)wParam); + case WM_ERASEBKGND: + return 1; + case WM_GETDLGCODE: + { + LRESULT result = DLGC_WANTARROWS | DLGC_WANTCHARS; + if (lParam && (((LPMSG)lParam)->message == WM_KEYDOWN)) + { + int vk = (int)((LPMSG)lParam)->wParam; - case WM_CREATE: - { - HWND hwndParent; - LONG style; - if(unicode) - { - hwndParent = ((LPCREATESTRUCTW)lParam)->hwndParent; - style = ((LPCREATESTRUCTW)lParam)->style; - } - else - { - hwndParent = ((LPCREATESTRUCTA)lParam)->hwndParent; - style = ((LPCREATESTRUCTA)lParam)->style; - } - return COMBO_Create(hwnd, lphc, hwndParent, style, unicode); - } - - case WM_PRINTCLIENT: - /* Fallthrough */ - case WM_PAINT: - /* wParam may contain a valid HDC! */ - return COMBO_Paint(lphc, (HDC)wParam); - - case WM_ERASEBKGND: - /* do all painting in WM_PAINT like Windows does */ - return 1; - - case WM_GETDLGCODE: - { - LRESULT result = DLGC_WANTARROWS | DLGC_WANTCHARS; - if (lParam && (((LPMSG)lParam)->message == WM_KEYDOWN)) - { - int vk = (int)((LPMSG)lParam)->wParam; - - if ((vk == VK_RETURN || vk == VK_ESCAPE) && (lphc->wState & CBF_DROPPED)) - result |= DLGC_WANTMESSAGE; - } - return result; - } - case WM_SIZE: - if( lphc->hWndLBox && - !(lphc->wState & CBF_NORESIZE) ) COMBO_Size( lphc ); - return TRUE; - case WM_SETFONT: - COMBO_Font( lphc, (HFONT)wParam, (BOOL)lParam ); - return TRUE; - case WM_GETFONT: - return (LRESULT)lphc->hFont; - case WM_SETFOCUS: - if( lphc->wState & CBF_EDIT ) { - SetFocus( lphc->hWndEdit ); - /* The first time focus is received, select all the text */ - if( !(lphc->wState & CBF_BEENFOCUSED) ) { - SendMessageW(lphc->hWndEdit, EM_SETSEL, 0, -1); - lphc->wState |= CBF_BEENFOCUSED; - } - } - else - COMBO_SetFocus( lphc ); - return TRUE; - case WM_KILLFOCUS: - { - HWND hwndFocus = WIN_GetFullHandle( (HWND)wParam ); - if( !hwndFocus || - (hwndFocus != lphc->hWndEdit && hwndFocus != lphc->hWndLBox )) - COMBO_KillFocus( lphc ); - return TRUE; + if ((vk == VK_RETURN || vk == VK_ESCAPE) && (lphc->wState & CBF_DROPPED)) + result |= DLGC_WANTMESSAGE; + } + return result; + } + case WM_SIZE: + if (lphc->hWndLBox && !(lphc->wState & CBF_NORESIZE)) + COMBO_Size(lphc); + return TRUE; + case WM_SETFONT: + COMBO_Font(lphc, (HFONT)wParam, (BOOL)lParam); + return TRUE; + case WM_GETFONT: + return (LRESULT)lphc->hFont; + case WM_SETFOCUS: + if (lphc->wState & CBF_EDIT) { + SetFocus( lphc->hWndEdit ); + if (!(lphc->wState & CBF_BEENFOCUSED)) { + SendMessageW(lphc->hWndEdit, EM_SETSEL, 0, -1); + lphc->wState |= CBF_BEENFOCUSED; } - case WM_COMMAND: - return COMBO_Command( lphc, wParam, WIN_GetFullHandle( (HWND)lParam ) ); - case WM_GETTEXT: - return unicode ? COMBO_GetTextW( lphc, wParam, (LPWSTR)lParam ) - : COMBO_GetTextA( lphc, wParam, (LPSTR)lParam ); - case WM_SETTEXT: - case WM_GETTEXTLENGTH: - case WM_CLEAR: - if ((message == WM_GETTEXTLENGTH) && !ISWIN31 && !(lphc->wState & CBF_EDIT)) - { - int j = SendMessageW(lphc->hWndLBox, LB_GETCURSEL, 0, 0); - if (j == -1) return 0; - return unicode ? SendMessageW(lphc->hWndLBox, LB_GETTEXTLEN, j, 0) : - SendMessageA(lphc->hWndLBox, LB_GETTEXTLEN, j, 0); - } - else if( lphc->wState & CBF_EDIT ) - { - LRESULT ret; - lphc->wState |= CBF_NOEDITNOTIFY; - ret = unicode ? SendMessageW(lphc->hWndEdit, message, wParam, lParam) : - SendMessageA(lphc->hWndEdit, message, wParam, lParam); - lphc->wState &= ~CBF_NOEDITNOTIFY; - return ret; - } - else return CB_ERR; - case WM_CUT: - case WM_PASTE: - case WM_COPY: - if( lphc->wState & CBF_EDIT ) - { - return unicode ? SendMessageW(lphc->hWndEdit, message, wParam, lParam) : - SendMessageA(lphc->hWndEdit, message, wParam, lParam); - } - else return CB_ERR; - - case WM_DRAWITEM: - case WM_DELETEITEM: - case WM_COMPAREITEM: - case WM_MEASUREITEM: - return COMBO_ItemOp(lphc, message, lParam); - case WM_ENABLE: - if( lphc->wState & CBF_EDIT ) - EnableWindow( lphc->hWndEdit, (BOOL)wParam ); - EnableWindow( lphc->hWndLBox, (BOOL)wParam ); - - /* Force the control to repaint when the enabled state changes. */ - InvalidateRect(lphc->self, NULL, TRUE); - return TRUE; - case WM_SETREDRAW: - if( wParam ) - lphc->wState &= ~CBF_NOREDRAW; - else - lphc->wState |= CBF_NOREDRAW; - - if( lphc->wState & CBF_EDIT ) - SendMessageW(lphc->hWndEdit, message, wParam, lParam); - SendMessageW(lphc->hWndLBox, message, wParam, lParam); - return 0; - case WM_SYSKEYDOWN: + } + else + COMBO_SetFocus(lphc); + return TRUE; + case WM_KILLFOCUS: + { + HWND hwndFocus = WIN_GetFullHandle((HWND)wParam); + if (!hwndFocus || (hwndFocus != lphc->hWndEdit && hwndFocus != lphc->hWndLBox)) + COMBO_KillFocus(lphc); + return TRUE; + } + case WM_COMMAND: + return COMBO_Command(lphc, wParam, WIN_GetFullHandle((HWND)lParam)); + case WM_GETTEXT: + return unicode ? COMBO_GetTextW(lphc, wParam, (LPWSTR)lParam) + : COMBO_GetTextA(lphc, wParam, (LPSTR)lParam); + case WM_SETTEXT: + case WM_GETTEXTLENGTH: + case WM_CLEAR: + if ((message == WM_GETTEXTLENGTH) && !ISWIN31 && !(lphc->wState & CBF_EDIT)) + { + int j = SendMessageW(lphc->hWndLBox, LB_GETCURSEL, 0, 0); + if (j == -1) return 0; + return unicode ? SendMessageW(lphc->hWndLBox, LB_GETTEXTLEN, j, 0) : + SendMessageA(lphc->hWndLBox, LB_GETTEXTLEN, j, 0); + } + else if (lphc->wState & CBF_EDIT) + { + LRESULT ret; + lphc->wState |= CBF_NOEDITNOTIFY; + ret = unicode ? SendMessageW(lphc->hWndEdit, message, wParam, lParam) : + SendMessageA(lphc->hWndEdit, message, wParam, lParam); + lphc->wState &= ~CBF_NOEDITNOTIFY; + return ret; + } + else return CB_ERR; + case WM_CUT: + case WM_PASTE: + case WM_COPY: + if (lphc->wState & CBF_EDIT) + return unicode ? SendMessageW(lphc->hWndEdit, message, wParam, lParam) : + SendMessageA(lphc->hWndEdit, message, wParam, lParam); + else return CB_ERR; + case WM_DRAWITEM: + case WM_DELETEITEM: + case WM_COMPAREITEM: + case WM_MEASUREITEM: + return COMBO_ItemOp(lphc, message, lParam); + case WM_ENABLE: + if (lphc->wState & CBF_EDIT) + EnableWindow(lphc->hWndEdit, (BOOL)wParam); + EnableWindow(lphc->hWndLBox, (BOOL)wParam); + InvalidateRect(lphc->self, NULL, TRUE); + return TRUE; + case WM_SETREDRAW: + if (wParam) + lphc->wState &= ~CBF_NOREDRAW; + else + lphc->wState |= CBF_NOREDRAW; + if (lphc->wState & CBF_EDIT) + SendMessageW(lphc->hWndEdit, message, wParam, lParam); + SendMessageW(lphc->hWndLBox, message, wParam, lParam); + return 0; + case WM_SYSKEYDOWN: #ifdef __REACTOS__ - if( KF_ALTDOWN & HIWORD(lParam) ) + if (KF_ALTDOWN & HIWORD(lParam)) #else - if( KEYDATA_ALT & HIWORD(lParam) ) + if (KEYDATA_ALT & HIWORD(lParam)) #endif - if( wParam == VK_UP || wParam == VK_DOWN ) - COMBO_FlipListbox( lphc, FALSE, FALSE ); - return 0; - - case WM_KEYDOWN: - if ((wParam == VK_RETURN || wParam == VK_ESCAPE) && - (lphc->wState & CBF_DROPPED)) - { - CBRollUp( lphc, wParam == VK_RETURN, FALSE ); - return TRUE; - } - else if ((wParam == VK_F4) && !(lphc->wState & CBF_EUI)) - { - COMBO_FlipListbox( lphc, FALSE, FALSE ); - return TRUE; - } - /* fall through */ - case WM_CHAR: - case WM_IME_CHAR: - { - HWND hwndTarget; - - if( lphc->wState & CBF_EDIT ) - hwndTarget = lphc->hWndEdit; - else - hwndTarget = lphc->hWndLBox; - - return unicode ? SendMessageW(hwndTarget, message, wParam, lParam) : - SendMessageA(hwndTarget, message, wParam, lParam); - } - case WM_LBUTTONDOWN: - if( !(lphc->wState & CBF_FOCUSED) ) SetFocus( lphc->self ); - if( lphc->wState & CBF_FOCUSED ) COMBO_LButtonDown( lphc, lParam ); - return TRUE; - case WM_LBUTTONUP: - COMBO_LButtonUp( lphc ); - return TRUE; - case WM_MOUSEMOVE: - if( lphc->wState & CBF_CAPTURE ) - COMBO_MouseMove( lphc, wParam, lParam ); - return TRUE; - - case WM_MOUSEWHEEL: - if (wParam & (MK_SHIFT | MK_CONTROL)) - return unicode ? DefWindowProcW(hwnd, message, wParam, lParam) : - DefWindowProcA(hwnd, message, wParam, lParam); - - if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) return SendMessageW(hwnd, WM_KEYDOWN, VK_UP, 0); - if (GET_WHEEL_DELTA_WPARAM(wParam) < 0) return SendMessageW(hwnd, WM_KEYDOWN, VK_DOWN, 0); - return TRUE; - - /* Combo messages */ - - case CB_ADDSTRING: - if( unicode ) - { - if( lphc->dwStyle & CBS_LOWERCASE ) - CharLowerW((LPWSTR)lParam); - else if( lphc->dwStyle & CBS_UPPERCASE ) - CharUpperW((LPWSTR)lParam); - return SendMessageW(lphc->hWndLBox, LB_ADDSTRING, 0, lParam); - } - else /* unlike the unicode version, the ansi version does not overwrite - the string if converting case */ - { - char *string = NULL; - LRESULT ret; - if( lphc->dwStyle & CBS_LOWERCASE ) - { - string = strdupA((LPSTR)lParam); - CharLowerA(string); - } - - else if( lphc->dwStyle & CBS_UPPERCASE ) - { - string = strdupA((LPSTR)lParam); - CharUpperA(string); - } - - ret = SendMessageA(lphc->hWndLBox, LB_ADDSTRING, 0, string ? (LPARAM)string : lParam); - HeapFree(GetProcessHeap(), 0, string); - return ret; - } - case CB_INSERTSTRING: - if( unicode ) - { - if( lphc->dwStyle & CBS_LOWERCASE ) - CharLowerW((LPWSTR)lParam); - else if( lphc->dwStyle & CBS_UPPERCASE ) - CharUpperW((LPWSTR)lParam); - return SendMessageW(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam); - } - else - { - if( lphc->dwStyle & CBS_LOWERCASE ) - CharLowerA((LPSTR)lParam); - else if( lphc->dwStyle & CBS_UPPERCASE ) - CharUpperA((LPSTR)lParam); - - return SendMessageA(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam); - } - case CB_DELETESTRING: - return unicode ? SendMessageW(lphc->hWndLBox, LB_DELETESTRING, wParam, 0) : - SendMessageA(lphc->hWndLBox, LB_DELETESTRING, wParam, 0); - case CB_SELECTSTRING: - return COMBO_SelectString(lphc, (INT)wParam, lParam, unicode); - case CB_FINDSTRING: - return unicode ? SendMessageW(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam) : - SendMessageA(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam); - case CB_FINDSTRINGEXACT: - return unicode ? SendMessageW(lphc->hWndLBox, LB_FINDSTRINGEXACT, wParam, lParam) : - SendMessageA(lphc->hWndLBox, LB_FINDSTRINGEXACT, wParam, lParam); - case CB_SETITEMHEIGHT: - return COMBO_SetItemHeight( lphc, (INT)wParam, (INT)lParam); - case CB_GETITEMHEIGHT: - if( (INT)wParam >= 0 ) /* listbox item */ - return SendMessageW(lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0); - return CBGetTextAreaHeight(hwnd, lphc); - case CB_RESETCONTENT: - SendMessageW(lphc->hWndLBox, LB_RESETCONTENT, 0, 0); - if( (lphc->wState & CBF_EDIT) && CB_HASSTRINGS(lphc) ) - { - static const WCHAR empty_stringW[] = { 0 }; - SendMessageW(lphc->hWndEdit, WM_SETTEXT, 0, (LPARAM)empty_stringW); - } - else - InvalidateRect(lphc->self, NULL, TRUE); - return TRUE; - case CB_INITSTORAGE: - return SendMessageW(lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam); - case CB_GETHORIZONTALEXTENT: - return SendMessageW(lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0); - case CB_SETHORIZONTALEXTENT: - return SendMessageW(lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0); - case CB_GETTOPINDEX: - return SendMessageW(lphc->hWndLBox, LB_GETTOPINDEX, 0, 0); - case CB_GETLOCALE: - return SendMessageW(lphc->hWndLBox, LB_GETLOCALE, 0, 0); - case CB_SETLOCALE: - return SendMessageW(lphc->hWndLBox, LB_SETLOCALE, wParam, 0); - case CB_SETDROPPEDWIDTH: - if( (CB_GETTYPE(lphc) == CBS_SIMPLE) || - (INT)wParam >= 32768 ) - return CB_ERR; - /* new value must be higher than combobox width */ - if((INT)wParam >= lphc->droppedRect.right - lphc->droppedRect.left) - lphc->droppedWidth = wParam; - else if(wParam) - lphc->droppedWidth = 0; - - /* recalculate the combobox area */ - CBCalcPlacement(hwnd, lphc, &lphc->textRect, &lphc->buttonRect, &lphc->droppedRect ); - - /* fall through */ - case CB_GETDROPPEDWIDTH: - if( lphc->droppedWidth ) - return lphc->droppedWidth; - return lphc->droppedRect.right - lphc->droppedRect.left; - case CB_GETDROPPEDCONTROLRECT: - if( lParam ) CBGetDroppedControlRect(lphc, (LPRECT)lParam ); - return CB_OKAY; - case CB_GETDROPPEDSTATE: - return (lphc->wState & CBF_DROPPED) != 0; - case CB_DIR: - return unicode ? SendMessageW(lphc->hWndLBox, LB_DIR, wParam, lParam) : - SendMessageA(lphc->hWndLBox, LB_DIR, wParam, lParam); - - case CB_SHOWDROPDOWN: - if( CB_GETTYPE(lphc) != CBS_SIMPLE ) - { - if( wParam ) - { - if( !(lphc->wState & CBF_DROPPED) ) - CBDropDown( lphc ); - } - else - if( lphc->wState & CBF_DROPPED ) - CBRollUp( lphc, FALSE, TRUE ); - } - return TRUE; - case CB_GETCOUNT: - return SendMessageW(lphc->hWndLBox, LB_GETCOUNT, 0, 0); - case CB_GETCURSEL: - return SendMessageW(lphc->hWndLBox, LB_GETCURSEL, 0, 0); - case CB_SETCURSEL: - lParam = SendMessageW(lphc->hWndLBox, LB_SETCURSEL, wParam, 0); - if( lParam >= 0 ) - SendMessageW(lphc->hWndLBox, LB_SETTOPINDEX, wParam, 0); - - /* no LBN_SELCHANGE in this case, update manually */ - if( lphc->wState & CBF_EDIT ) - CBUpdateEdit( lphc, (INT)wParam ); - else - InvalidateRect(lphc->self, &lphc->textRect, TRUE); - lphc->wState &= ~CBF_SELCHANGE; - return lParam; - case CB_GETLBTEXT: - return unicode ? SendMessageW(lphc->hWndLBox, LB_GETTEXT, wParam, lParam) : - SendMessageA(lphc->hWndLBox, LB_GETTEXT, wParam, lParam); - case CB_GETLBTEXTLEN: - return unicode ? SendMessageW(lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0) : - SendMessageA(lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0); - case CB_GETITEMDATA: - return SendMessageW(lphc->hWndLBox, LB_GETITEMDATA, wParam, 0); - case CB_SETITEMDATA: - return SendMessageW(lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam); - case CB_GETEDITSEL: - /* Edit checks passed parameters itself */ - if( lphc->wState & CBF_EDIT ) - return SendMessageW(lphc->hWndEdit, EM_GETSEL, wParam, lParam); - return CB_ERR; - case CB_SETEDITSEL: - if( lphc->wState & CBF_EDIT ) - return SendMessageW(lphc->hWndEdit, EM_SETSEL, - (INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam) ); - return CB_ERR; - case CB_SETEXTENDEDUI: - if( CB_GETTYPE(lphc) == CBS_SIMPLE ) - return CB_ERR; - if( wParam ) - lphc->wState |= CBF_EUI; - else lphc->wState &= ~CBF_EUI; - return CB_OKAY; - case CB_GETEXTENDEDUI: - return (lphc->wState & CBF_EUI) != 0; - case CB_GETCOMBOBOXINFO: - return COMBO_GetComboBoxInfo(lphc, (COMBOBOXINFO *)lParam); - case CB_LIMITTEXT: - if( lphc->wState & CBF_EDIT ) - return SendMessageW(lphc->hWndEdit, EM_LIMITTEXT, wParam, lParam); - return TRUE; + if(wParam == VK_UP || wParam == VK_DOWN) + COMBO_FlipListbox(lphc, FALSE, FALSE); + return 0; + case WM_KEYDOWN: + if ((wParam == VK_RETURN || wParam == VK_ESCAPE) && + (lphc->wState & CBF_DROPPED)) + { + CBRollUp(lphc, wParam == VK_RETURN, FALSE); + return TRUE; + } + else if ((wParam == VK_F4) && !(lphc->wState & CBF_EUI)) + { + COMBO_FlipListbox(lphc, FALSE, FALSE); + return TRUE; + } + /* fall through */ + case WM_CHAR: + case WM_IME_CHAR: + { + HWND hwndTarget; + if (lphc->wState & CBF_EDIT) + hwndTarget = lphc->hWndEdit; + else + hwndTarget = lphc->hWndLBox; + return unicode ? SendMessageW(hwndTarget, message, wParam, lParam) : + SendMessageA(hwndTarget, message, wParam, lParam); + } + case WM_LBUTTONDOWN: + if (!(lphc->wState & CBF_FOCUSED)) SetFocus(lphc->self); + if (lphc->wState & CBF_FOCUSED) COMBO_LButtonDown(lphc, lParam); + return TRUE; + case WM_LBUTTONUP: + COMBO_LButtonUp(lphc); + return TRUE; + case WM_MOUSEMOVE: + if (lphc->wState & CBF_CAPTURE) + COMBO_MouseMove(lphc, wParam, lParam); + return TRUE; + case WM_MOUSEWHEEL: + if (wParam & (MK_SHIFT | MK_CONTROL)) + return unicode ? DefWindowProcW(hwnd, message, wParam, lParam) : + DefWindowProcA(hwnd, message, wParam, lParam); + if (GET_WHEEL_DELTA_WPARAM(wParam) > 0) return SendMessageW(hwnd, WM_KEYDOWN, VK_UP, 0); + if (GET_WHEEL_DELTA_WPARAM(wParam) < 0) return SendMessageW(hwnd, WM_KEYDOWN, VK_DOWN, 0); + return TRUE; + case CB_ADDSTRING: + if (unicode) + { + if (lphc->dwStyle & CBS_LOWERCASE) + CharLowerW((LPWSTR)lParam); + else if (lphc->dwStyle & CBS_UPPERCASE) + CharUpperW((LPWSTR)lParam); + return SendMessageW(lphc->hWndLBox, LB_ADDSTRING, 0, lParam); + } + else + { + char *string = NULL; + LRESULT ret; + if (lphc->dwStyle & CBS_LOWERCASE) + { + string = strdupA((LPSTR)lParam); + CharLowerA(string); + } + else if (lphc->dwStyle & CBS_UPPERCASE) + { + string = strdupA((LPSTR)lParam); + CharUpperA(string); + } + ret = SendMessageA(lphc->hWndLBox, LB_ADDSTRING, 0, string ? (LPARAM)string : lParam); + HeapFree(GetProcessHeap(), 0, string); + return ret; + } + case CB_INSERTSTRING: + if (unicode) + { + if (lphc->dwStyle & CBS_LOWERCASE) + CharLowerW((LPWSTR)lParam); + else if (lphc->dwStyle & CBS_UPPERCASE) + CharUpperW((LPWSTR)lParam); + return SendMessageW(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam); + } + else + { + if (lphc->dwStyle & CBS_LOWERCASE) + CharLowerA((LPSTR)lParam); + else if (lphc->dwStyle & CBS_UPPERCASE) + CharUpperA((LPSTR)lParam); + return SendMessageA(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam); + } + case CB_DELETESTRING: + return unicode ? SendMessageW(lphc->hWndLBox, LB_DELETESTRING, wParam, 0) : + SendMessageA(lphc->hWndLBox, LB_DELETESTRING, wParam, 0); + case CB_SELECTSTRING: + return COMBO_SelectString(lphc, (INT)wParam, lParam, unicode); + case CB_FINDSTRING: + return unicode ? SendMessageW(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam) : + SendMessageA(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam); + case CB_FINDSTRINGEXACT: + return unicode ? SendMessageW(lphc->hWndLBox, LB_FINDSTRINGEXACT, wParam, lParam) : + SendMessageA(lphc->hWndLBox, LB_FINDSTRINGEXACT, wParam, lParam); + case CB_SETITEMHEIGHT: + return COMBO_SetItemHeight(lphc, (INT)wParam, (INT)lParam); + case CB_GETITEMHEIGHT: + if ((INT)wParam >= 0) + return SendMessageW(lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0); + return CBGetTextAreaHeight(hwnd, lphc); + case CB_RESETCONTENT: + SendMessageW(lphc->hWndLBox, LB_RESETCONTENT, 0, 0); + if ((lphc->wState & CBF_EDIT) && CB_HASSTRINGS(lphc)) + { + static const WCHAR empty_stringW[] = { 0 }; + SendMessageW(lphc->hWndEdit, WM_SETTEXT, 0, (LPARAM)empty_stringW); + } + else + InvalidateRect(lphc->self, NULL, TRUE); + return TRUE; + case CB_INITSTORAGE: + return SendMessageW(lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam); + case CB_GETHORIZONTALEXTENT: + return SendMessageW(lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0); + case CB_SETHORIZONTALEXTENT: + return SendMessageW(lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0); + case CB_GETTOPINDEX: + return SendMessageW(lphc->hWndLBox, LB_GETTOPINDEX, 0, 0); + case CB_GETLOCALE: + return SendMessageW(lphc->hWndLBox, LB_GETLOCALE, 0, 0); + case CB_SETLOCALE: + return SendMessageW(lphc->hWndLBox, LB_SETLOCALE, wParam, 0); + case CB_SETDROPPEDWIDTH: + if ((CB_GETTYPE(lphc) == CBS_SIMPLE) || (INT)wParam >= 32768) + return CB_ERR; + if ((INT)wParam >= lphc->droppedRect.right - lphc->droppedRect.left) + lphc->droppedWidth = wParam; + else if (wParam) + lphc->droppedWidth = 0; + CBCalcPlacement(hwnd, lphc, &lphc->textRect, &lphc->buttonRect, &lphc->droppedRect ); + /* fall through */ + case CB_GETDROPPEDWIDTH: + if (lphc->droppedWidth) + return lphc->droppedWidth; + return lphc->droppedRect.right - lphc->droppedRect.left; + case CB_GETDROPPEDCONTROLRECT: + if (lParam) CBGetDroppedControlRect(lphc, (LPRECT)lParam); + return CB_OKAY; + case CB_GETDROPPEDSTATE: + return (lphc->wState & CBF_DROPPED) != 0; + case CB_DIR: + return unicode ? SendMessageW(lphc->hWndLBox, LB_DIR, wParam, lParam) : + SendMessageA(lphc->hWndLBox, LB_DIR, wParam, lParam); + case CB_SHOWDROPDOWN: + if (CB_GETTYPE(lphc) != CBS_SIMPLE) + { + if (wParam) + { + if (!(lphc->wState & CBF_DROPPED)) + CBDropDown(lphc); + } + else if (lphc->wState & CBF_DROPPED) + CBRollUp(lphc, FALSE, TRUE); + } + return TRUE; + case CB_GETCOUNT: + return SendMessageW(lphc->hWndLBox, LB_GETCOUNT, 0, 0); + case CB_GETCURSEL: + return SendMessageW(lphc->hWndLBox, LB_GETCURSEL, 0, 0); + case CB_SETCURSEL: + lParam = SendMessageW(lphc->hWndLBox, LB_SETCURSEL, wParam, 0); + if (lParam >= 0) + SendMessageW(lphc->hWndLBox, LB_SETTOPINDEX, wParam, 0); + if(lphc->wState & CBF_EDIT) + CBUpdateEdit(lphc, (INT)wParam); + else + InvalidateRect(lphc->self, &lphc->textRect, TRUE); + lphc->wState &= ~CBF_SELCHANGE; + return lParam; + case CB_GETLBTEXT: + return unicode ? SendMessageW(lphc->hWndLBox, LB_GETTEXT, wParam, lParam) : + SendMessageA(lphc->hWndLBox, LB_GETTEXT, wParam, lParam); + case CB_GETLBTEXTLEN: + return unicode ? SendMessageW(lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0) : + SendMessageA(lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0); + case CB_GETITEMDATA: + return SendMessageW(lphc->hWndLBox, LB_GETITEMDATA, wParam, 0); + case CB_SETITEMDATA: + return SendMessageW(lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam); + case CB_GETEDITSEL: + if (lphc->wState & CBF_EDIT) + return SendMessageW(lphc->hWndEdit, EM_GETSEL, wParam, lParam); + return CB_ERR; + case CB_SETEDITSEL: + if (lphc->wState & CBF_EDIT) + return SendMessageW(lphc->hWndEdit, EM_SETSEL, (INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam)); + return CB_ERR; + case CB_SETEXTENDEDUI: + if (CB_GETTYPE(lphc) == CBS_SIMPLE) + return CB_ERR; + if (wParam) + lphc->wState |= CBF_EUI; + else lphc->wState &= ~CBF_EUI; + return CB_OKAY; + case CB_GETEXTENDEDUI: + return (lphc->wState & CBF_EUI) != 0; + case CB_GETCOMBOBOXINFO: + return COMBO_GetComboBoxInfo(lphc, (COMBOBOXINFO *)lParam); + case CB_LIMITTEXT: + if (lphc->wState & CBF_EDIT) + return SendMessageW(lphc->hWndEdit, EM_LIMITTEXT, wParam, lParam); + return TRUE; #ifdef __REACTOS__ case WM_UPDATEUISTATE: if (unicode) DefWindowProcW(lphc->self, message, wParam, lParam); else DefWindowProcA(lphc->self, message, wParam, lParam); - if (COMBO_update_uistate(lphc)) { - /* redraw text */ - if( !(lphc->wState & CBF_EDIT) ) + if (!(lphc->wState & CBF_EDIT)) NtUserInvalidateRect(lphc->self, &lphc->textRect, TRUE); } break; - - case WM_CBLOSTTEXTFOCUS: /* undocumented message - deselects the text when focus is lost */ + case WM_CBLOSTTEXTFOCUS: + if (lphc->hWndEdit != NULL) { - if (lphc->hWndEdit != NULL) - { - SendMessage(lphc->self, WM_LBUTTONUP, 0, 0xFFFFFFFF); - SendMessage(lphc->hWndEdit, EM_SETSEL, 0, 0); - lphc->wState &= ~CBF_FOCUSED; - CB_NOTIFY(lphc, CBN_KILLFOCUS); - } + SendMessage(lphc->self, WM_LBUTTONUP, 0, 0xFFFFFFFF); + SendMessage(lphc->hWndEdit, EM_SETSEL, 0, 0); + lphc->wState &= ~CBF_FOCUSED; + CB_NOTIFY(lphc, CBN_KILLFOCUS); } return TRUE; - #endif - - default: - if (message >= WM_USER) - WARN("unknown msg WM_USER+%04x wp=%04lx lp=%08lx\n", - message - WM_USER, wParam, lParam ); - break; - } - return unicode ? DefWindowProcW(hwnd, message, wParam, lParam) : - DefWindowProcA(hwnd, message, wParam, lParam); + default: + break; + } + return unicode ? DefWindowProcW(hwnd, message, wParam, lParam) : + DefWindowProcA(hwnd, message, wParam, lParam); } #ifdef __REACTOS__ @@ -2292,19 +2182,19 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPAR * This is just a wrapper for the real ComboWndProc which locks/unlocks * window structs. */ -LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI ComboWndProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if (!IsWindow(hwnd)) return 0; - return ComboWndProc_common( hwnd, message, wParam, lParam, FALSE ); + return ComboWndProc_common(hwnd, message, wParam, lParam, FALSE); } /*********************************************************************** * ComboWndProcW */ -LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI ComboWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if (!IsWindow(hwnd)) return 0; - return ComboWndProc_common( hwnd, message, wParam, lParam, TRUE ); + return ComboWndProc_common(hwnd, message, wParam, lParam, TRUE); } #endif /* __REACTOS__ */ @@ -2312,10 +2202,8 @@ LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa /************************************************************************* * GetComboBoxInfo (USER32.@) */ -BOOL WINAPI GetComboBoxInfo(HWND hwndCombo, /* [in] handle to combo box */ - PCOMBOBOXINFO pcbi /* [in/out] combo box information */) +BOOL WINAPI GetComboBoxInfo(HWND hwndCombo, PCOMBOBOXINFO pcbi) { - TRACE("(%p, %p)\n", hwndCombo, pcbi); #ifdef __REACTOS__ return NtUserGetComboBoxInfo(hwndCombo, pcbi); #else