+#if wxUSE_UXTHEME
+ #include "wx/msw/uxtheme.h"
+#endif
+
+#if wxUSE_TOOLTIPS
+ #include "wx/tooltip.h"
+#endif // wxUSE_TOOLTIPS
+
+// ----------------------------------------------------------------------------
+// wxWin macros
+// ----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(wxComboBox, wxControl)
+ EVT_MENU(wxID_CUT, wxComboBox::OnCut)
+ EVT_MENU(wxID_COPY, wxComboBox::OnCopy)
+ EVT_MENU(wxID_PASTE, wxComboBox::OnPaste)
+ EVT_MENU(wxID_UNDO, wxComboBox::OnUndo)
+ EVT_MENU(wxID_REDO, wxComboBox::OnRedo)
+ EVT_MENU(wxID_CLEAR, wxComboBox::OnDelete)
+ EVT_MENU(wxID_SELECTALL, wxComboBox::OnSelectAll)
+
+ EVT_UPDATE_UI(wxID_CUT, wxComboBox::OnUpdateCut)
+ EVT_UPDATE_UI(wxID_COPY, wxComboBox::OnUpdateCopy)
+ EVT_UPDATE_UI(wxID_PASTE, wxComboBox::OnUpdatePaste)
+ EVT_UPDATE_UI(wxID_UNDO, wxComboBox::OnUpdateUndo)
+ EVT_UPDATE_UI(wxID_REDO, wxComboBox::OnUpdateRedo)
+ EVT_UPDATE_UI(wxID_CLEAR, wxComboBox::OnUpdateDelete)
+ EVT_UPDATE_UI(wxID_SELECTALL, wxComboBox::OnUpdateSelectAll)
+END_EVENT_TABLE()
+
+// ----------------------------------------------------------------------------
+// function prototypes
+// ----------------------------------------------------------------------------
+
+LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam);
+
+// ---------------------------------------------------------------------------
+// global vars
+// ---------------------------------------------------------------------------
+
+// the pointer to standard radio button wnd proc
+static WNDPROC gs_wndprocEdit = (WNDPROC)NULL;
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wnd proc for subclassed edit control
+// ----------------------------------------------------------------------------
+
+LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ HWND hwndCombo = ::GetParent(hWnd);
+ wxWindow *win = wxFindWinFromHandle((WXHWND)hwndCombo);
+
+ switch ( message )
+ {
+ // forward some messages to the combobox to generate the appropriate
+ // wxEvents from them
+ case WM_KEYUP:
+ case WM_KEYDOWN:
+ case WM_CHAR:
+ case WM_SYSCHAR:
+ case WM_SYSKEYDOWN:
+ case WM_SYSKEYUP:
+ case WM_SETFOCUS:
+ case WM_KILLFOCUS:
+ {
+ wxComboBox *combo = wxDynamicCast(win, wxComboBox);
+ if ( !combo )
+ {
+ // we can get WM_KILLFOCUS while our parent is already half
+ // destroyed and hence doesn't look like a combobx any
+ // longer, check for it to avoid bogus assert failures
+ if ( !win->IsBeingDeleted() )
+ {
+ wxFAIL_MSG( wxT("should have combo as parent") );
+ }
+ }
+ else if ( combo->MSWProcessEditMsg(message, wParam, lParam) )
+ {
+ // handled by parent
+ return 0;
+ }
+ }
+ break;
+
+ case WM_GETDLGCODE:
+ {
+ wxCHECK_MSG( win, 0, wxT("should have a parent") );
+
+ if ( win->GetWindowStyle() & wxTE_PROCESS_ENTER )
+ {
+ // need to return a custom dlg code or we'll never get it
+ return DLGC_WANTMESSAGE;
+ }
+ }
+ break;
+ }
+
+ return ::CallWindowProc(CASTWNDPROC gs_wndprocEdit, hWnd, message, wParam, lParam);
+}
+
+// ----------------------------------------------------------------------------
+// wxComboBox callbacks
+// ----------------------------------------------------------------------------