X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1690c2ce3629e96ba25539c2524d1435546d1e37..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/msw/combobox.cpp diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index 84b1bca018..c5a74dc211 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -39,6 +39,7 @@ #endif #include "wx/clipbrd.h" +#include "wx/dynlib.h" #include "wx/wupdlock.h" #include "wx/msw/private.h" @@ -54,69 +55,6 @@ // wxWin macros // ---------------------------------------------------------------------------- -#if wxUSE_EXTENDED_RTTI -WX_DEFINE_FLAGS( wxComboBoxStyle ) - -wxBEGIN_FLAGS( wxComboBoxStyle ) - // new style border flags, we put them first to - // use them for streaming out - wxFLAGS_MEMBER(wxBORDER_SIMPLE) - wxFLAGS_MEMBER(wxBORDER_SUNKEN) - wxFLAGS_MEMBER(wxBORDER_DOUBLE) - wxFLAGS_MEMBER(wxBORDER_RAISED) - wxFLAGS_MEMBER(wxBORDER_STATIC) - wxFLAGS_MEMBER(wxBORDER_NONE) - - // old style border flags - wxFLAGS_MEMBER(wxSIMPLE_BORDER) - wxFLAGS_MEMBER(wxSUNKEN_BORDER) - wxFLAGS_MEMBER(wxDOUBLE_BORDER) - wxFLAGS_MEMBER(wxRAISED_BORDER) - wxFLAGS_MEMBER(wxSTATIC_BORDER) - wxFLAGS_MEMBER(wxBORDER) - - // standard window styles - wxFLAGS_MEMBER(wxTAB_TRAVERSAL) - wxFLAGS_MEMBER(wxCLIP_CHILDREN) - wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) - wxFLAGS_MEMBER(wxWANTS_CHARS) - wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) - wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) - wxFLAGS_MEMBER(wxVSCROLL) - wxFLAGS_MEMBER(wxHSCROLL) - - wxFLAGS_MEMBER(wxCB_SIMPLE) - wxFLAGS_MEMBER(wxCB_SORT) - wxFLAGS_MEMBER(wxCB_READONLY) - wxFLAGS_MEMBER(wxCB_DROPDOWN) - -wxEND_FLAGS( wxComboBoxStyle ) - -IMPLEMENT_DYNAMIC_CLASS_XTI(wxComboBox, wxChoice,"wx/combobox.h") - -wxBEGIN_PROPERTIES_TABLE(wxComboBox) - wxEVENT_PROPERTY( Select , wxEVT_COMMAND_COMBOBOX_SELECTED , wxCommandEvent ) - wxEVENT_PROPERTY( TextEnter , wxEVT_COMMAND_TEXT_ENTER , wxCommandEvent ) - - // TODO DELEGATES - wxPROPERTY( Font , wxFont , SetFont , GetFont , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY_COLLECTION( Choices , wxArrayString , wxString , AppendString , GetStrings , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY( Value ,wxString, SetValue, GetValue, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY( Selection ,int, SetSelection, GetSelection, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY_FLAGS( WindowStyle , wxComboBoxStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style -wxEND_PROPERTIES_TABLE() - -wxBEGIN_HANDLERS_TABLE(wxComboBox) -wxEND_HANDLERS_TABLE() - -wxCONSTRUCTOR_5( wxComboBox , wxWindow* , Parent , wxWindowID , Id , wxString , Value , wxPoint , Position , wxSize , Size ) - -#else - -IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxChoice) - -#endif - BEGIN_EVENT_TABLE(wxComboBox, wxControl) EVT_MENU(wxID_CUT, wxComboBox::OnCut) EVT_MENU(wxID_COPY, wxComboBox::OnCopy) @@ -300,7 +238,7 @@ bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam) // fall through case WM_SYSCHAR: - return HandleChar(wParam, lParam, true /* isASCII */); + return HandleChar(wParam, lParam); case WM_SYSKEYDOWN: case WM_KEYDOWN: @@ -438,6 +376,7 @@ bool wxComboBox::MSWShouldPreProcessMessage(WXMSG *pMsg) WXHWND wxComboBox::GetEditHWNDIfAvailable() const { +#if wxUSE_DYNLIB_CLASS #if defined(WINVER) && WINVER >= 0x0500 typedef BOOL (WINAPI *GetComboBoxInfo_t)(HWND, COMBOBOXINFO*); static GetComboBoxInfo_t s_pfnGetComboBoxInfo = NULL; @@ -455,7 +394,8 @@ WXHWND wxComboBox::GetEditHWNDIfAvailable() const (*s_pfnGetComboBoxInfo)(GetHwnd(), &info); return info.hwndItem; } -#endif +#endif // WINVER >= 0x0500 +#endif // wxUSE_DYNLIB_CLASS if (HasFlag(wxCB_SIMPLE)) { @@ -702,6 +642,22 @@ void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent& event) event.Enable(IsEditable() && !wxTextEntry::IsEmpty()); } +void wxComboBox::MSWDoPopupOrDismiss(bool show) +{ + wxASSERT_MSG( !HasFlag(wxCB_SIMPLE), + wxT("can't popup/dismiss the list for simple combo box") ); + + // we *must* set focus to the combobox before showing or hiding the drop + // down as without this we get WM_LBUTTONDOWN messages with invalid HWND + // when hiding it (whether programmatically or manually) resulting in a + // crash when we pass them to IsDialogMessage() + // + // this can be seen in the combo page of the widgets sample under Windows 7 + SetFocus(); + + ::SendMessage(GetHwnd(), CB_SHOWDROPDOWN, show, 0); +} + #if wxUSE_TOOLTIPS void wxComboBox::DoSetToolTip(wxToolTip *tip)