X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a756f210019dd5b51331b7181c816d3882146a30..cfce733e1732b46ebb076ef10fae5a7d552dc2f9:/src/msw/combobox.cpp diff --git a/src/msw/combobox.cpp b/src/msw/combobox.cpp index f7c97122e1..283eab16ac 100644 --- a/src/msw/combobox.cpp +++ b/src/msw/combobox.cpp @@ -87,20 +87,33 @@ LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd, switch ( message ) { - // forward some messages to the combobox + // forward some messages to the combobox to generate the appropriate + // wxEvents from them case WM_KEYUP: case WM_KEYDOWN: case WM_CHAR: + case WM_SETFOCUS: + case WM_KILLFOCUS: { wxComboBox *combo = wxDynamicCast(win, wxComboBox); - wxCHECK_MSG( combo, 0, _T("should have combo as parent") ); - - if ( combo->MSWProcessEditMsg(message, wParam, lParam) ) + 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( _T("should have combo as parent") ); + } + } + else if ( combo->MSWProcessEditMsg(message, wParam, lParam) ) + { + // handled by parent return 0; + } } break; -#if 0 case WM_GETDLGCODE: { wxCHECK_MSG( win, 0, _T("should have a parent") ); @@ -112,7 +125,6 @@ LRESULT APIENTRY _EXPORT wxComboEditWndProc(HWND hWnd, } } break; -#endif // 0 // deal with tooltips here #if wxUSE_TOOLTIPS && defined(TTN_NEEDTEXT) @@ -196,6 +208,12 @@ bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam) case WM_KEYUP: return HandleKeyUp(wParam, lParam); + + case WM_SETFOCUS: + return HandleSetFocus((WXHWND)wParam); + + case WM_KILLFOCUS: + return HandleKillFocus((WXHWND)wParam); } return FALSE; @@ -286,6 +304,11 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { + // pretend that wxComboBox is hidden while it is positioned and resized and + // show it only right before leaving this method because otherwise there is + // some noticeable flicker while the control rearranges itself + m_isShown = FALSE; + // first create wxWin object if ( !CreateControl(parent, id, pos, size, style, validator, name) ) return FALSE; @@ -342,6 +365,9 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, ); } + // and finally, show the control + Show(TRUE); + return TRUE; } @@ -350,9 +376,9 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, void wxComboBox::SetValue(const wxString& value) { // If newlines are denoted by just 10, must stick 13 in front. - int singletons = 0; - int len = value.Length(); - int i; + size_t singletons = 0; + size_t len = value.Length(); + size_t i; for (i = 0; i < len; i ++) { if ((i > 0) && (value[i] == 10) && (value[i-1] != 13)) @@ -360,8 +386,9 @@ void wxComboBox::SetValue(const wxString& value) } if (singletons > 0) { - wxChar *tmp = new wxChar[len + singletons + 1]; - int j = 0; + wxString tmp; + tmp.Alloc(len + singletons); + size_t j = 0; for (i = 0; i < len; i ++) { if ((i > 0) && (value[i] == 10) && (value[i-1] != 13)) @@ -372,12 +399,16 @@ void wxComboBox::SetValue(const wxString& value) tmp[j] = value[i]; j ++; } - tmp[j] = 0; - SetWindowText(GetHwnd(), tmp); - delete[] tmp; + if (GetWindowStyle() & wxCB_READONLY) + SetStringSelection(tmp); + else + SetWindowText(GetHwnd(), tmp.c_str()); } else - SetWindowText(GetHwnd(), value); + if (GetWindowStyle() & wxCB_READONLY) + SetStringSelection(value); + else + SetWindowText(GetHwnd(), value.c_str()); } // Clipboard operations