X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/63f7d5022e786be61c0226314dac98739f49a426..d141826876edc1e7dd5bf18d050cea8754a3f718:/src/msw/combobox.cpp diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index 7ae8dfc956..9537a60acc 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -188,7 +188,7 @@ LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd, // longer, check for it to avoid bogus assert failures if ( !win->IsBeingDeleted() ) { - wxFAIL_MSG( _T("should have combo as parent") ); + wxFAIL_MSG( wxT("should have combo as parent") ); } } else if ( combo->MSWProcessEditMsg(message, wParam, lParam) ) @@ -201,7 +201,7 @@ LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd, case WM_GETDLGCODE: { - wxCHECK_MSG( win, 0, _T("should have a parent") ); + wxCHECK_MSG( win, 0, wxT("should have a parent") ); if ( win->GetWindowStyle() & wxTE_PROCESS_ENTER ) { @@ -342,8 +342,19 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD id) // down is cancelled (see #8474) m_lastAcceptedSelection = wxID_NONE; } + { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId()); + event.SetEventObject(this); + ProcessCommand(event); + } + break; + case CBN_CLOSEUP: + { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_CLOSEUP, GetId()); + event.SetEventObject(this); + ProcessCommand(event); + } break; - case CBN_SELENDOK: #ifndef __SMARTPHONE__ // we need to reset this to prevent the selection from being undone @@ -427,6 +438,32 @@ bool wxComboBox::MSWShouldPreProcessMessage(WXMSG *pMsg) WXHWND wxComboBox::GetEditHWNDIfAvailable() const { +#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 + + 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 @@ -441,10 +478,10 @@ WXHWND wxComboBox::GetEditHWND() const // this function should not be called for wxCB_READONLY controls, it is // the callers responsibility to check this wxASSERT_MSG( !HasFlag(wxCB_READONLY), - _T("read-only combobox doesn't have any edit control") ); + wxT("read-only combobox doesn't have any edit control") ); WXHWND hWndEdit = GetEditHWNDIfAvailable(); - wxASSERT_MSG( hWndEdit, _T("combobox without edit control?") ); + wxASSERT_MSG( hWndEdit, wxT("combobox without edit control?") ); return hWndEdit; } @@ -452,7 +489,7 @@ WXHWND wxComboBox::GetEditHWND() const wxWindow *wxComboBox::GetEditableWindow() { wxASSERT_MSG( !HasFlag(wxCB_READONLY), - _T("read-only combobox doesn't have any edit control") ); + wxT("read-only combobox doesn't have any edit control") ); return this; } @@ -665,6 +702,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)