UnpackCtlColor(wParam, lParam, &nCtlColor, &hdc, &hwnd);
return (WXLRESULT)OnCtlColor(hdc, hwnd, nCtlColor, nMsg, wParam, lParam);
+
+ case CB_SETCURSEL:
+ // Selection was set with SetSelection. Update the value too.
+ if ((int)wParam > GetCount())
+ m_value = wxEmptyString;
+ else
+ m_value = GetString(wParam);
+ break;
+
}
return wxChoice::MSWWindowProc(nMsg, wParam, lParam);
{
case CBN_SELCHANGE:
sel = GetSelection();
- if ( sel > -1 )
+
+ // somehow we get 2 CBN_SELCHANGE events with the same index when
+ // the user selects an item in the combobox -- ignore duplicates
+ if ( sel > -1 && sel != m_selectionOld )
{
- value = GetString(sel);
+ m_selectionOld = sel;
+
+ // GetValue() would still return the old value from here but
+ // according to the docs we should return the new value if the
+ // user calls it in his event handler, so update internal
+ // m_value
+ m_value = GetString(sel);
wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, GetId());
event.SetInt(sel);
event.SetEventObject(this);
- event.SetString(value);
+ event.SetString(m_value);
ProcessCommand(event);
}
- else
+ else // no valid selection
{
+ m_selectionOld = sel;
+
+ // hence no EVT_TEXT neither
break;
}
// want the new one)
if ( sel == -1 )
{
- value = GetValue();
+ m_value = wxGetWindowText(GetHwnd());
}
else // we're synthesizing text updated event from sel change
{
- // We need to retrieve the current selection because the user
- // may have changed it in the previous handler (for CBN_SELCHANGE
- // above).
+ // We need to retrieve the current selection because the
+ // user may have changed it in the previous handler (for
+ // CBN_SELCHANGE above).
sel = GetSelection();
if ( sel > -1 )
{
- value = GetString(sel);
+ m_value = GetString(sel);
}
- // we need to do this because the user code expects
- // wxComboBox::GetValue() to return the new value from
- // "text updated" handler but it hadn't been updated yet
- SetValue(value);
}
- event.SetString(value);
+ event.SetString(m_value);
event.SetEventObject(this);
ProcessCommand(event);
}
SetStringSelection(value);
else
SetWindowText(GetHwnd(), value.c_str());
+
+ m_value = value;
+ m_selectionOld = GetSelection();
}
// Clipboard operations