Hi.

I'm trying to fix PR 1114 and ran into the following problem:

The listbox of WinRAR isn't updated because CBN_SELENDOK isn't sent.

CBN_SELENDOK is supposed to be sent by CBRollUp() called by the LBN_SELCHANGE handler but isn't because the listbox (of the combobox) is already rolled up when LBN_SELCHANGE is received.

The premature CBRollUp() is caused by a click into the combo/listbox which SetFocus()es the listbox which causes a KILLFOCUS sent to the edit control which was holding the focus before and then forwards the KILLFOCUS to it's parent (the ComboLBox) which rolls the listbox up and issues CBN_SELENDCANCEL.

(This causes also a visible difference between native and builtin comctl32 - native ComboBoxEx rolls up on mouseup, ours rolls up on mousedown)

So the problem is that the editbox has the focus although the listbox is rolled down - this is the case for DROPDOWN comboboxes but only possible since the listbox takes care of this special case and forwards the focus to the edit control.

Since a ComboBoxEx is a DROPDOWNLIST with an edit control drawn itself the editbox has to lose the focus when the listbox is rolled down.

The listbox code actually takes care of that and sets the focus to the listbox if it's not child of a DROPDOWN CB but the CBN_SETFOCUS handling in comboex.c sets the focus back to the edit control for some reason, stating:

        * We also need to set the focus back to the Edit control
        * after passing the command to the parent of the ComboEx.

Putting an "case CBN_SETFOCUS:" before the CBN_SELENDOK case (making sure that the focus isn't set to the edit control after a CBN_SETFOCUS) makes WinRAR work, makes the listbox roll up on mouseup (looks exactly like native comctl32) and doesn't seem to cause any problems.

However, if the ComboBoxEx receives another CBN_* (except those handled by case statements which all *don't* set the focus to the edit box) I think it will set the focus back to the edit control (although the listbox is still rolled down) and when the user then selects an item it will again roll up and send CBN_SELENDCANCEL.

So would it be right to completly remove the focus-forwarding to the edit control? (Since I know nothing about Win32 programming, the comments talk about MSIE4 expecting some specific behaviour and I don't wanna cause a regression I decided to ask here first :)

-flexo



Reply via email to