X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fe56156fb5c4e7024f2bb6dee4efe09de58c5e78..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/msw/combobox.cpp diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index 7de89452e5..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,21 +376,41 @@ 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; + static bool s_triedToLoad = false; + if ( !s_triedToLoad ) + { + s_triedToLoad = true; + wxLoadedDLL dllUser32("user32.dll"); + wxDL_INIT_FUNC(s_pfn, GetComboBoxInfo, dllUser32); + } + + if ( s_pfnGetComboBoxInfo ) + { + WinStruct info; + (*s_pfnGetComboBoxInfo)(GetHwnd(), &info); + return info.hwndItem; + } +#endif // WINVER >= 0x0500 +#endif // wxUSE_DYNLIB_CLASS + + if (HasFlag(wxCB_SIMPLE)) + { + POINT pt; + pt.x = pt.y = 4; + return (WXHWND) ::ChildWindowFromPoint(GetHwnd(), pt); + } + // notice that a slightly safer alternative could be to use FindWindowEx() // but it's not available under WinCE so just take the first child for now // to keep one version of the code for all platforms and fix it later if // problems are discovered -#ifndef __WXWINCE__ - COMBOBOXINFO info; - info.cbSize = sizeof(COMBOBOXINFO); - - GetComboBoxInfo(GetHwnd(), & info); - return info.hwndItem; -#else // we assume that the only child of the combobox is the edit window return (WXHWND)::GetWindow(GetHwnd(), GW_CHILD); -#endif } WXHWND wxComboBox::GetEditHWND() const @@ -684,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)