+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// creation
+// ----------------------------------------------------------------------------
+
+bool wxChoice::Create(wxWindow *parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ int n, const wxString choices[],
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ // Experience shows that wxChoice vs. wxComboBox distinction confuses
+ // quite a few people - try to help them
+ wxASSERT_MSG( !(style & wxCB_DROPDOWN) &&
+ !(style & wxCB_READONLY) &&
+ !(style & wxCB_SIMPLE),
+ wxT("this style flag is ignored by wxChoice, you ")
+ wxT("probably want to use a wxComboBox") );
+
+ return CreateAndInit(parent, id, pos, size, n, choices, style,
+ validator, name);
+}
+
+bool wxChoice::CreateAndInit(wxWindow *parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ int n, const wxString choices[],
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ // initialize wxControl
+ if ( !CreateControl(parent, id, pos, size, style, validator, name) )
+ return false;
+
+ // now create the real HWND
+ if ( !MSWCreateControl(wxT("COMBOBOX"), wxEmptyString, pos, size) )
+ return false;
+
+
+ // initialize the controls contents
+ Append(n, choices);
+
+ // and now we may finally size the control properly (if needed)
+ SetInitialSize(size);
+
+ return true;
+}
+
+void wxChoice::SetLabel(const wxString& label)
+{
+ if ( FindString(label) == wxNOT_FOUND )
+ {
+ // unless we explicitly do this here, CB_GETCURSEL will continue to
+ // return the index of the previously selected item which will result
+ // in wrongly replacing the value being set now with the previously
+ // value if the user simply opens and closes (without selecting
+ // anything) the combobox popup
+ SetSelection(-1);
+ }
+
+ wxChoiceBase::SetLabel(label);
+}
+
+bool wxChoice::Create(wxWindow *parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ const wxArrayString& choices,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ wxCArrayString chs(choices);
+ return Create(parent, id, pos, size, chs.GetCount(), chs.GetStrings(),
+ style, validator, name);
+}
+
+bool wxChoice::MSWShouldPreProcessMessage(WXMSG *pMsg)
+{
+ MSG *msg = (MSG *) pMsg;
+
+ // if the dropdown list is visible, don't preprocess certain keys
+ if ( msg->message == WM_KEYDOWN
+ && (msg->wParam == VK_ESCAPE || msg->wParam == VK_RETURN) )
+ {
+ if (::SendMessage(GetHwndOf(this), CB_GETDROPPEDSTATE, 0, 0))
+ {
+ return false;
+ }
+ }
+
+ return wxControl::MSWShouldPreProcessMessage(pMsg);
+}