- Documented things known to be unimplemented.
- Implemented CBN_SELCHANGE, CBN_KILLFOCUS, and CBN_SELENDOK. - Corrected CBEN_ENDEDIT notifies to always have edit control text. - Locked "selected" state of icon to focus state of edit control (if it exists) just like native.
This commit is contained in:
parent
0d2df474aa
commit
a7a006a00d
@ -1,5 +1,24 @@
|
|||||||
/*
|
/*
|
||||||
* ComboBoxEx control v2 (mod3)
|
* TODO <-------------
|
||||||
|
* 1. The following extended styles need to be implemented, use will
|
||||||
|
* result in a FIXME:
|
||||||
|
* CBES_EX_NOEDITIMAGEINDENT
|
||||||
|
* CBES_EX_PATHWORDBREAKPROC
|
||||||
|
* CBES_EX_NOSIZELIMIT
|
||||||
|
* CBES_EX_CASESENSITIVE
|
||||||
|
* 2. None of the following callback items are implemented. Therefor
|
||||||
|
* no CBEN_GETDISPINFO notifies are issued. Use in either CBEM_INSERTITEM
|
||||||
|
* or CBEM_SETITEM will result in a FIXME:
|
||||||
|
* LPSTR_TEXTCALLBACK
|
||||||
|
* I_IMAGECALLBACK
|
||||||
|
* I_INDENTCALLBACK
|
||||||
|
* 3. No use is made of the iOverlay image.
|
||||||
|
* 4. Notify CBEN_DRAGBEGIN is not implemented.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ComboBoxEx control v2 (mod4)
|
||||||
*
|
*
|
||||||
* Copyright 1998, 1999 Eric Kohl
|
* Copyright 1998, 1999 Eric Kohl
|
||||||
*
|
*
|
||||||
@ -8,12 +27,6 @@
|
|||||||
* I will only improve this control once in a while.
|
* I will only improve this control once in a while.
|
||||||
* Eric <ekohl@abo.rhein-zeitung.de>
|
* Eric <ekohl@abo.rhein-zeitung.de>
|
||||||
*
|
*
|
||||||
* TODO:
|
|
||||||
* - All messages.
|
|
||||||
* - All notifications.
|
|
||||||
*
|
|
||||||
* FIXME:
|
|
||||||
* - should include "combo.h"
|
|
||||||
|
|
||||||
* Changes Guy Albertelli <galberte@neo.lrun.com>
|
* Changes Guy Albertelli <galberte@neo.lrun.com>
|
||||||
* v1 Implemented messages: CB_SETITEMHEIGHT, WM_WINDOWPOSCHANGING,
|
* v1 Implemented messages: CB_SETITEMHEIGHT, WM_WINDOWPOSCHANGING,
|
||||||
@ -36,6 +49,15 @@
|
|||||||
* 10. Implement CB_FINDSTRINGEXACT in both the Combo and ComboEx window
|
* 10. Implement CB_FINDSTRINGEXACT in both the Combo and ComboEx window
|
||||||
* procs to match the items. This eliminates dup entries in the listbox.
|
* procs to match the items. This eliminates dup entries in the listbox.
|
||||||
*
|
*
|
||||||
|
* mod 4
|
||||||
|
* 1. Implemented CBN_SELCHANGE, CBN_KILLFOCUS, and CBN_SELENDOK.
|
||||||
|
* 2. Fix putting text in CBEN_ENDEDIT notifys for CBN_DROPDOWN case.
|
||||||
|
* 3. Lock image selected status to focus state of edit control if
|
||||||
|
* edit control exists. Mimics native actions.
|
||||||
|
* 4. Implemented WM_SETFOCUS in EditWndProc to track status of
|
||||||
|
* focus for 3 above.
|
||||||
|
* 5. The LBN_SELCHANGE is just for documentation purposes.
|
||||||
|
*
|
||||||
* Test vehicals were the ControlSpy modules (rebar.exe and comboboxex.exe),
|
* Test vehicals were the ControlSpy modules (rebar.exe and comboboxex.exe),
|
||||||
* and IE 4.0.
|
* and IE 4.0.
|
||||||
*
|
*
|
||||||
@ -91,6 +113,7 @@ typedef struct
|
|||||||
* but CBEN_ENDEDIT{A|W}
|
* but CBEN_ENDEDIT{A|W}
|
||||||
* not yet issued. */
|
* not yet issued. */
|
||||||
#define WCBE_EDITCHG 0x00000002 /* Edit issued EN_CHANGE */
|
#define WCBE_EDITCHG 0x00000002 /* Edit issued EN_CHANGE */
|
||||||
|
#define WCBE_EDITFOCUSED 0x00000004 /* Edit control has focus */
|
||||||
|
|
||||||
|
|
||||||
#define ID_CB_EDIT 1001
|
#define ID_CB_EDIT 1001
|
||||||
@ -333,6 +356,22 @@ COMBOEX_FindItem(COMBOEX_INFO *infoPtr, INT index)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
COMBOEX_WarnCallBack (CBE_ITEMDATA *item)
|
||||||
|
{
|
||||||
|
if (item->pszText == LPSTR_TEXTCALLBACKW)
|
||||||
|
FIXME("Callback not implemented yet for pszText\n");
|
||||||
|
if (item->iImage == I_IMAGECALLBACK)
|
||||||
|
FIXME("Callback not implemented yet for iImage\n");
|
||||||
|
if (item->iSelectedImage == I_IMAGECALLBACK)
|
||||||
|
FIXME("Callback not implemented yet for iSelectedImage\n");
|
||||||
|
if (item->iOverlay == I_IMAGECALLBACK)
|
||||||
|
FIXME("Callback not implemented yet for iOverlay\n");
|
||||||
|
if (item->iIndent == I_INDENTCALLBACK)
|
||||||
|
FIXME("Callback not implemented yet for iIndent\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* *** CBEM_xxx message support *** */
|
/* *** CBEM_xxx message support *** */
|
||||||
|
|
||||||
|
|
||||||
@ -393,6 +432,8 @@ COMBOEX_GetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
{
|
{
|
||||||
COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
|
COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
|
||||||
|
|
||||||
|
TRACE("-- 0x%08lx\n", infoPtr->dwExtStyle);
|
||||||
|
|
||||||
return (LRESULT)infoPtr->dwExtStyle;
|
return (LRESULT)infoPtr->dwExtStyle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,7 +443,7 @@ COMBOEX_GetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
{
|
{
|
||||||
COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
|
COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
|
||||||
|
|
||||||
TRACE("(0x%08x 0x%08lx)\n", wParam, lParam);
|
TRACE("-- 0x%p\n", infoPtr->himl);
|
||||||
|
|
||||||
return (LRESULT)infoPtr->himl;
|
return (LRESULT)infoPtr->himl;
|
||||||
}
|
}
|
||||||
@ -570,6 +611,8 @@ COMBOEX_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
item->lParam = cit->lParam;
|
item->lParam = cit->lParam;
|
||||||
infoPtr->nb_items++;
|
infoPtr->nb_items++;
|
||||||
|
|
||||||
|
COMBOEX_WarnCallBack (item);
|
||||||
|
|
||||||
COMBOEX_DumpItem (item);
|
COMBOEX_DumpItem (item);
|
||||||
|
|
||||||
SendMessageW (infoPtr->hwndCombo, CB_INSERTSTRING,
|
SendMessageW (infoPtr->hwndCombo, CB_INSERTSTRING,
|
||||||
@ -726,6 +769,8 @@ COMBOEX_SetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
if (cit->mask & CBEIF_LPARAM)
|
if (cit->mask & CBEIF_LPARAM)
|
||||||
cit->lParam = cit->lParam;
|
cit->lParam = cit->lParam;
|
||||||
|
|
||||||
|
COMBOEX_WarnCallBack (item);
|
||||||
|
|
||||||
COMBOEX_DumpItem (item);
|
COMBOEX_DumpItem (item);
|
||||||
|
|
||||||
/* if original request was to update edit control, do some fast foot work */
|
/* if original request was to update edit control, do some fast foot work */
|
||||||
@ -1057,7 +1102,7 @@ COMBOEX_Command (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
INT command = HIWORD(wParam);
|
INT command = HIWORD(wParam);
|
||||||
CBE_ITEMDATA *item = 0;
|
CBE_ITEMDATA *item = 0;
|
||||||
WCHAR wintext[520];
|
WCHAR wintext[520];
|
||||||
INT cursel, n;
|
INT cursel, n, oldItem;
|
||||||
NMCBEENDEDITA cbeend;
|
NMCBEENDEDITA cbeend;
|
||||||
|
|
||||||
TRACE("for command %d\n", command);
|
TRACE("for command %d\n", command);
|
||||||
@ -1100,7 +1145,22 @@ COMBOEX_Command (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
item = (CBE_ITEMDATA *)SendMessageW (infoPtr->hwndCombo,
|
||||||
|
CB_GETITEMDATA,
|
||||||
|
cursel, 0);
|
||||||
|
if ((INT)item == CB_ERR) {
|
||||||
|
TRACE("failed to find match??? item=%p cursel=%d\n",
|
||||||
|
item, cursel);
|
||||||
|
if (infoPtr->hwndEdit)
|
||||||
|
SetFocus(infoPtr->hwndEdit);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (infoPtr->flags & WCBE_ACTEDIT) {
|
if (infoPtr->flags & WCBE_ACTEDIT) {
|
||||||
|
WideCharToMultiByte (CP_ACP, 0, item->pszText, -1,
|
||||||
|
cbeend.szText, sizeof(cbeend.szText),
|
||||||
|
NULL, NULL);
|
||||||
cbeend.fChanged = (infoPtr->flags & WCBE_EDITCHG);
|
cbeend.fChanged = (infoPtr->flags & WCBE_EDITCHG);
|
||||||
cbeend.iNewSelection = SendMessageW (infoPtr->hwndCombo,
|
cbeend.iNewSelection = SendMessageW (infoPtr->hwndCombo,
|
||||||
CB_GETCURSEL, 0, 0);
|
CB_GETCURSEL, 0, 0);
|
||||||
@ -1118,6 +1178,71 @@ COMBOEX_Command (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
SetFocus(infoPtr->hwndCombo);
|
SetFocus(infoPtr->hwndCombo);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case CBN_SELCHANGE:
|
||||||
|
/*
|
||||||
|
* CB_GETCURSEL(Combo)
|
||||||
|
* CB_GETITEMDATA(Combo) < simulated by COMBOEX_FindItem
|
||||||
|
* lstrlenA
|
||||||
|
* WM_SETTEXT(Edit)
|
||||||
|
* WM_GETTEXTLENGTH(Edit)
|
||||||
|
* WM_GETTEXT(Edit)
|
||||||
|
* EM_SETSEL(Edit, 0,0)
|
||||||
|
* WM_GETTEXTLENGTH(Edit)
|
||||||
|
* WM_GETTEXT(Edit)
|
||||||
|
* EM_SETSEL(Edit, 0,len)
|
||||||
|
* return WM_COMMAND to parent
|
||||||
|
*/
|
||||||
|
oldItem = SendMessageW (infoPtr->hwndCombo, CB_GETCURSEL, 0, 0);
|
||||||
|
if (!(item = COMBOEX_FindItem(infoPtr, oldItem))) {
|
||||||
|
ERR("item %d not found. Problem!\n", oldItem);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
COMBOEX_SetEditText (infoPtr, item);
|
||||||
|
return SendMessageW (GetParent (hwnd), WM_COMMAND, wParam,
|
||||||
|
(LPARAM)hwnd);
|
||||||
|
|
||||||
|
case CBN_SELENDOK:
|
||||||
|
/*
|
||||||
|
* We have to change the handle since we are the control
|
||||||
|
* issuing the message. IE4 depends on this.
|
||||||
|
*/
|
||||||
|
return SendMessageW (GetParent (hwnd), WM_COMMAND, wParam,
|
||||||
|
(LPARAM)hwnd);
|
||||||
|
|
||||||
|
case CBN_KILLFOCUS:
|
||||||
|
/*
|
||||||
|
* from native trace:
|
||||||
|
*
|
||||||
|
* pass to parent
|
||||||
|
* WM_GETTEXT(Edit, 104)
|
||||||
|
* CB_GETCURSEL(Combo) rets -1
|
||||||
|
* WM_NOTIFY(CBEN_ENDEDITA) with CBENF_KILLFOCUS
|
||||||
|
* CB_GETCURSEL(Combo)
|
||||||
|
* InvalidateRect(Combo, 0, 0)
|
||||||
|
* return 0
|
||||||
|
*/
|
||||||
|
SendMessageW (GetParent (hwnd), WM_COMMAND, wParam,
|
||||||
|
(LPARAM)hwnd);
|
||||||
|
if (infoPtr->flags & WCBE_ACTEDIT) {
|
||||||
|
GetWindowTextA (infoPtr->hwndEdit, cbeend.szText, 260);
|
||||||
|
cbeend.fChanged = (infoPtr->flags & WCBE_EDITCHG);
|
||||||
|
cbeend.iNewSelection = SendMessageW (infoPtr->hwndCombo,
|
||||||
|
CB_GETCURSEL, 0, 0);
|
||||||
|
cbeend.iWhy = CBENF_KILLFOCUS;
|
||||||
|
|
||||||
|
infoPtr->flags &= ~(WCBE_ACTEDIT | WCBE_EDITCHG);
|
||||||
|
if (COMBOEX_Notify (infoPtr, CBEN_ENDEDITA,
|
||||||
|
(NMHDR *)&cbeend, FALSE)) {
|
||||||
|
/* abort the change */
|
||||||
|
TRACE("Notify requested abort of change\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* possible CB_GETCURSEL */
|
||||||
|
InvalidateRect (infoPtr->hwndCombo, 0, 0);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case CBN_CLOSEUP:
|
||||||
default:
|
default:
|
||||||
/*
|
/*
|
||||||
* We have to change the handle since we are the control
|
* We have to change the handle since we are the control
|
||||||
@ -1191,7 +1316,7 @@ COMBOEX_DrawItem (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
CBE_ITEMDATA *item = 0;
|
CBE_ITEMDATA *item = 0;
|
||||||
SIZE txtsize;
|
SIZE txtsize;
|
||||||
RECT rect;
|
RECT rect;
|
||||||
int drawimage;
|
int drawimage, drawstate;
|
||||||
UINT xbase;
|
UINT xbase;
|
||||||
UINT xioff = 0; /* size and spacer of image if any */
|
UINT xioff = 0; /* size and spacer of image if any */
|
||||||
IMAGEINFO iinfo;
|
IMAGEINFO iinfo;
|
||||||
@ -1340,18 +1465,46 @@ COMBOEX_DrawItem (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
case ODA_SELECT:
|
case ODA_SELECT:
|
||||||
case ODA_DRAWENTIRE:
|
case ODA_DRAWENTIRE:
|
||||||
drawimage = -1;
|
drawimage = -1;
|
||||||
|
drawstate = ILD_NORMAL;
|
||||||
if (!(infoPtr->dwExtStyle & CBES_EX_NOEDITIMAGE)) {
|
if (!(infoPtr->dwExtStyle & CBES_EX_NOEDITIMAGE)) {
|
||||||
if (item->mask & CBEIF_IMAGE) drawimage = item->iImage;
|
if (item->mask & CBEIF_IMAGE)
|
||||||
if ((dis->itemState & ODS_SELECTED) &&
|
drawimage = item->iImage;
|
||||||
(item->mask & CBEIF_SELECTEDIMAGE))
|
if (dis->itemState & ODS_COMBOEXLBOX) {
|
||||||
drawimage = item->iSelectedImage;
|
/* drawing listbox entry */
|
||||||
|
if (dis->itemState & ODS_SELECTED) {
|
||||||
|
if (item->mask & CBEIF_SELECTEDIMAGE)
|
||||||
|
drawimage = item->iSelectedImage;
|
||||||
|
drawstate = ILD_SELECTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* drawing combo/edit entry */
|
||||||
|
if (infoPtr->hwndEdit) {
|
||||||
|
/* if we have an edit control, the slave the
|
||||||
|
* selection state to the Edit focus state
|
||||||
|
*/
|
||||||
|
if (infoPtr->flags & WCBE_EDITFOCUSED) {
|
||||||
|
if (item->mask & CBEIF_SELECTEDIMAGE)
|
||||||
|
drawimage = item->iSelectedImage;
|
||||||
|
drawstate = ILD_SELECTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* if we don't have an edit control, use
|
||||||
|
* the requested state.
|
||||||
|
*/
|
||||||
|
if (dis->itemState & ODS_SELECTED) {
|
||||||
|
if (item->mask & CBEIF_SELECTEDIMAGE)
|
||||||
|
drawimage = item->iSelectedImage;
|
||||||
|
drawstate = ILD_SELECTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (drawimage != -1) {
|
if (drawimage != -1) {
|
||||||
TRACE("drawing image state=%d\n", dis->itemState & ODS_SELECTED);
|
TRACE("drawing image state=%d\n", dis->itemState & ODS_SELECTED);
|
||||||
ImageList_Draw (infoPtr->himl, drawimage, dis->hDC,
|
ImageList_Draw (infoPtr->himl, drawimage, dis->hDC,
|
||||||
xbase, dis->rcItem.top,
|
xbase, dis->rcItem.top, drawstate);
|
||||||
(dis->itemState & ODS_SELECTED) ?
|
|
||||||
ILD_SELECTED : ILD_NORMAL);
|
|
||||||
}
|
}
|
||||||
if ((item->mask & CBEIF_TEXT) && item->pszText) {
|
if ((item->mask & CBEIF_TEXT) && item->pszText) {
|
||||||
UINT x, y;
|
UINT x, y;
|
||||||
@ -1476,7 +1629,7 @@ COMBOEX_WindowPosChanging (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
|
COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
|
||||||
LRESULT ret;
|
LRESULT ret;
|
||||||
RECT cbx_wrect, cbx_crect, cb_wrect;
|
RECT cbx_wrect, cbx_crect, cb_wrect;
|
||||||
UINT width;
|
UINT width, height;
|
||||||
WINDOWPOS *wp = (WINDOWPOS *)lParam;
|
WINDOWPOS *wp = (WINDOWPOS *)lParam;
|
||||||
|
|
||||||
ret = DefWindowProcA (hwnd, WM_WINDOWPOSCHANGING, wParam, lParam);
|
ret = DefWindowProcA (hwnd, WM_WINDOWPOSCHANGING, wParam, lParam);
|
||||||
@ -1486,8 +1639,8 @@ COMBOEX_WindowPosChanging (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
/* width is winpos value + border width of comboex */
|
/* width is winpos value + border width of comboex */
|
||||||
width = wp->cx
|
width = wp->cx
|
||||||
+ cbx_wrect.right-cbx_wrect.left
|
+ (cbx_wrect.right-cbx_wrect.left)
|
||||||
- (cbx_crect.right - cbx_crect.left);
|
- (cbx_crect.right-cbx_crect.left);
|
||||||
|
|
||||||
TRACE("EX window=(%d,%d)-(%d,%d), client=(%d,%d)-(%d,%d)\n",
|
TRACE("EX window=(%d,%d)-(%d,%d), client=(%d,%d)-(%d,%d)\n",
|
||||||
cbx_wrect.left, cbx_wrect.top, cbx_wrect.right, cbx_wrect.bottom,
|
cbx_wrect.left, cbx_wrect.top, cbx_wrect.right, cbx_wrect.bottom,
|
||||||
@ -1496,12 +1649,22 @@ COMBOEX_WindowPosChanging (HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||||||
cb_wrect.left, cb_wrect.top, cb_wrect.right, cb_wrect.bottom,
|
cb_wrect.left, cb_wrect.top, cb_wrect.right, cb_wrect.bottom,
|
||||||
width, cb_wrect.bottom-cb_wrect.top);
|
width, cb_wrect.bottom-cb_wrect.top);
|
||||||
|
|
||||||
SetWindowPos (infoPtr->hwndCombo, HWND_TOP, 0, 0,
|
if (width) SetWindowPos (infoPtr->hwndCombo, HWND_TOP, 0, 0,
|
||||||
width,
|
width,
|
||||||
cb_wrect.bottom-cb_wrect.top,
|
cb_wrect.bottom-cb_wrect.top,
|
||||||
SWP_NOACTIVATE);
|
SWP_NOACTIVATE);
|
||||||
|
|
||||||
COMBOEX_AdjustEditPos (infoPtr);
|
GetWindowRect (infoPtr->hwndCombo, &cb_wrect);
|
||||||
|
|
||||||
|
/* height is combo window height plus border width of comboex */
|
||||||
|
height = (cb_wrect.bottom-cb_wrect.top)
|
||||||
|
+ (cbx_wrect.bottom-cbx_wrect.top)
|
||||||
|
- (cbx_crect.bottom-cbx_crect.top);
|
||||||
|
if (wp->cy < height) wp->cy = height;
|
||||||
|
if (infoPtr->hwndEdit) {
|
||||||
|
COMBOEX_AdjustEditPos (infoPtr);
|
||||||
|
InvalidateRect (infoPtr->hwndCombo, 0, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1515,6 +1678,7 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
COLORREF nbkc, obkc;
|
COLORREF nbkc, obkc;
|
||||||
HDC hDC;
|
HDC hDC;
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
LRESULT lret;
|
||||||
|
|
||||||
TRACE("hwnd=%x msg=%x wparam=%x lParam=%lx, info_ptr=%p\n",
|
TRACE("hwnd=%x msg=%x wparam=%x lParam=%lx, info_ptr=%p\n",
|
||||||
hwnd, uMsg, wParam, lParam, infoPtr);
|
hwnd, uMsg, wParam, lParam, infoPtr);
|
||||||
@ -1674,10 +1838,18 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case WM_SETFOCUS:
|
||||||
|
/* remember the focus to set state of icon */
|
||||||
|
lret = CallWindowProcA (infoPtr->prevEditWndProc,
|
||||||
|
hwnd, uMsg, wParam, lParam);
|
||||||
|
infoPtr->flags |= WCBE_EDITFOCUSED;
|
||||||
|
return lret;
|
||||||
|
|
||||||
case WM_KILLFOCUS:
|
case WM_KILLFOCUS:
|
||||||
/*
|
/*
|
||||||
* should do NOTIFY CBEN_ENDEDIT with CBENF_KILLFOCUS
|
* do NOTIFY CBEN_ENDEDIT with CBENF_KILLFOCUS
|
||||||
*/
|
*/
|
||||||
|
infoPtr->flags &= ~WCBE_EDITFOCUSED;
|
||||||
if (infoPtr->flags & WCBE_ACTEDIT) {
|
if (infoPtr->flags & WCBE_ACTEDIT) {
|
||||||
infoPtr->flags &= ~(WCBE_ACTEDIT | WCBE_EDITCHG);
|
infoPtr->flags &= ~(WCBE_ACTEDIT | WCBE_EDITCHG);
|
||||||
cbeend.fChanged = FALSE;
|
cbeend.fChanged = FALSE;
|
||||||
@ -1702,9 +1874,11 @@ static LRESULT WINAPI
|
|||||||
COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
COMBOEX_INFO *infoPtr = (COMBOEX_INFO *)GetPropA (hwnd, (LPCSTR)(LONG) ComboExInfo);
|
COMBOEX_INFO *infoPtr = (COMBOEX_INFO *)GetPropA (hwnd, (LPCSTR)(LONG) ComboExInfo);
|
||||||
|
NMCBEENDEDITA cbeend;
|
||||||
NMMOUSE nmmse;
|
NMMOUSE nmmse;
|
||||||
COLORREF nbkc, obkc;
|
COLORREF nbkc, obkc;
|
||||||
HDC hDC;
|
HDC hDC;
|
||||||
|
HWND focusedhwnd;
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
|
||||||
TRACE("hwnd=%x msg=%x wparam=%x lParam=%lx, info_ptr=%p\n",
|
TRACE("hwnd=%x msg=%x wparam=%x lParam=%lx, info_ptr=%p\n",
|
||||||
@ -1759,12 +1933,51 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
hwnd, uMsg, wParam, lParam);
|
hwnd, uMsg, wParam, lParam);
|
||||||
|
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
/* traces show that COMBOEX does not issue CBN_EDITUPDATE
|
switch (HIWORD(wParam)) {
|
||||||
* on the EN_UPDATE
|
|
||||||
*/
|
|
||||||
if (HIWORD(wParam) == EN_UPDATE) return 0;
|
|
||||||
|
|
||||||
if (HIWORD(wParam) == EN_SETFOCUS) {
|
case EN_UPDATE:
|
||||||
|
/* traces show that COMBOEX does not issue CBN_EDITUPDATE
|
||||||
|
* on the EN_UPDATE
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case EN_KILLFOCUS:
|
||||||
|
/*
|
||||||
|
* Native does:
|
||||||
|
*
|
||||||
|
* GetFocus() retns AA
|
||||||
|
* GetWindowTextA(Edit)
|
||||||
|
* CB_GETCURSEL(Combo) (got -1)
|
||||||
|
* WM_NOTIFY(CBEN_ENDEDITA) with CBENF_KILLFOCUS
|
||||||
|
* CB_GETCURSEL(Combo) (got -1)
|
||||||
|
* InvalidateRect(Combo, 0, 0)
|
||||||
|
* WM_KILLFOCUS(Combo, AA)
|
||||||
|
* return 0;
|
||||||
|
*/
|
||||||
|
focusedhwnd = GetFocus();
|
||||||
|
if (infoPtr->flags & WCBE_ACTEDIT) {
|
||||||
|
GetWindowTextA (infoPtr->hwndEdit, cbeend.szText, 260);
|
||||||
|
cbeend.fChanged = (infoPtr->flags & WCBE_EDITCHG);
|
||||||
|
cbeend.iNewSelection = SendMessageW (infoPtr->hwndCombo,
|
||||||
|
CB_GETCURSEL, 0, 0);
|
||||||
|
cbeend.iWhy = CBENF_KILLFOCUS;
|
||||||
|
|
||||||
|
infoPtr->flags &= ~(WCBE_ACTEDIT | WCBE_EDITCHG);
|
||||||
|
if (COMBOEX_Notify (infoPtr, CBEN_ENDEDITA,
|
||||||
|
(NMHDR *)&cbeend, FALSE)) {
|
||||||
|
/* abort the change */
|
||||||
|
TRACE("Notify requested abort of change\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* possible CB_GETCURSEL */
|
||||||
|
InvalidateRect (infoPtr->hwndCombo, 0, 0);
|
||||||
|
if (focusedhwnd)
|
||||||
|
SendMessageW (infoPtr->hwndCombo, WM_KILLFOCUS,
|
||||||
|
(WPARAM)focusedhwnd, 0);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case EN_SETFOCUS: {
|
||||||
/*
|
/*
|
||||||
* For EN_SETFOCUS this issues the same calls and messages
|
* For EN_SETFOCUS this issues the same calls and messages
|
||||||
* as the native seems to do.
|
* as the native seems to do.
|
||||||
@ -1788,9 +2001,9 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
infoPtr->flags |= WCBE_ACTEDIT;
|
infoPtr->flags |= WCBE_ACTEDIT;
|
||||||
infoPtr->flags &= ~WCBE_EDITCHG; /* no change yet */
|
infoPtr->flags &= ~WCBE_EDITCHG; /* no change yet */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HIWORD(wParam) == EN_CHANGE) {
|
case EN_CHANGE: {
|
||||||
/*
|
/*
|
||||||
* For EN_CHANGE this issues the same calls and messages
|
* For EN_CHANGE this issues the same calls and messages
|
||||||
* as the native seems to do.
|
* as the native seems to do.
|
||||||
@ -1834,10 +2047,43 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
CBN_EDITCHANGE),
|
CBN_EDITCHANGE),
|
||||||
infoPtr->hwndSelf);
|
infoPtr->hwndSelf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fall through */
|
case LBN_SELCHANGE:
|
||||||
|
/*
|
||||||
|
* Therefore from traces there is no additional code here
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Using native COMCTL32 gets the following:
|
||||||
|
* 1 == SHDOCVW.DLL issues call/message
|
||||||
|
* 2 == COMCTL32.DLL issues call/message
|
||||||
|
* 3 == WINE issues call/message
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* for LBN_SELCHANGE:
|
||||||
|
* 1 CB_GETCURSEL(ComboEx)
|
||||||
|
* 1 CB_GETDROPPEDSTATE(ComboEx)
|
||||||
|
* 1 CallWindowProc( *2* for WM_COMMAND(LBN_SELCHANGE)
|
||||||
|
* 2 CallWindowProc( *3* for WM_COMMAND(LBN_SELCHANGE)
|
||||||
|
** call CBRollUp( xxx, TRUE for LBN_SELCHANGE, TRUE)
|
||||||
|
* 3 WM_COMMAND(ComboEx, CBN_SELENDOK)
|
||||||
|
* WM_USER+49(ComboLB, 1,0) <=============!!!!!!!!!!!
|
||||||
|
* 3 ShowWindow(ComboLB, SW_HIDE)
|
||||||
|
* 3 RedrawWindow(Combo, RDW_UPDATENOW)
|
||||||
|
* 3 WM_COMMAND(ComboEX, CBN_CLOSEUP)
|
||||||
|
** end of CBRollUp
|
||||||
|
* 3 WM_COMMAND(ComboEx, CBN_SELCHANGE) (echo to parent)
|
||||||
|
* ? LB_GETCURSEL <==|
|
||||||
|
* ? LB_GETTEXTLEN |
|
||||||
|
* ? LB_GETTEXT | Needs to be added to
|
||||||
|
* ? WM_CTLCOLOREDIT(ComboEx) | Combo processing
|
||||||
|
* ? LB_GETITEMDATA |
|
||||||
|
* ? WM_DRAWITEM(ComboEx) <==|
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}/* fall through */
|
||||||
default:
|
default:
|
||||||
return CallWindowProcA (infoPtr->prevComboWndProc,
|
return CallWindowProcA (infoPtr->prevComboWndProc,
|
||||||
hwnd, uMsg, wParam, lParam);
|
hwnd, uMsg, wParam, lParam);
|
||||||
@ -1907,7 +2153,6 @@ COMBOEX_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
/* Combo messages we are not sure if we need to process or just forward */
|
/* Combo messages we are not sure if we need to process or just forward */
|
||||||
case CB_GETDROPPEDCONTROLRECT:
|
case CB_GETDROPPEDCONTROLRECT:
|
||||||
case CB_GETDROPPEDSTATE:
|
|
||||||
case CB_GETITEMDATA:
|
case CB_GETITEMDATA:
|
||||||
case CB_GETITEMHEIGHT:
|
case CB_GETITEMHEIGHT:
|
||||||
case CB_GETLBTEXT:
|
case CB_GETLBTEXT:
|
||||||
@ -1926,6 +2171,7 @@ COMBOEX_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
/* Combo messages OK to just forward to the regular COMBO */
|
/* Combo messages OK to just forward to the regular COMBO */
|
||||||
case CB_GETCOUNT:
|
case CB_GETCOUNT:
|
||||||
case CB_GETCURSEL:
|
case CB_GETCURSEL:
|
||||||
|
case CB_GETDROPPEDSTATE:
|
||||||
case CB_SETDROPPEDWIDTH:
|
case CB_SETDROPPEDWIDTH:
|
||||||
case CB_SETEXTENDEDUI:
|
case CB_SETEXTENDEDUI:
|
||||||
case CB_SHOWDROPDOWN:
|
case CB_SHOWDROPDOWN:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user