X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/275c64304eadef874676ab4aa3663a0f8feefd5d..db414879d45f5da2be534a0f523b0506f2ab1183:/src/msw/choice.cpp diff --git a/src/msw/choice.cpp b/src/msw/choice.cpp index 3fd0fefc5a..74ec10a47b 100644 --- a/src/msw/choice.cpp +++ b/src/msw/choice.cpp @@ -86,10 +86,7 @@ bool wxChoice::CreateAndInit(wxWindow *parent, // initialize the controls contents - for ( int i = 0; i < n; i++ ) - { - Append(choices[i]); - } + Append(n, choices); // and now we may finally size the control properly (if needed) SetInitialSize(size); @@ -358,6 +355,10 @@ void wxChoice::SetString(unsigned int n, const wxString& s) else if ( HasClientObjectData() ) oldObjData = GetClientObject(n); + // and also the selection if we're going to delete the item that was + // selected + const bool wasSelected = static_cast(n) == GetSelection(); + ::SendMessage(GetHwnd(), CB_DELETESTRING, n, 0); ::SendMessage(GetHwnd(), CB_INSERTSTRING, n, (LPARAM)s.wx_str() ); @@ -367,6 +368,11 @@ void wxChoice::SetString(unsigned int n, const wxString& s) else if ( oldObjData ) SetClientObject(n, oldObjData); + // and the selection + if ( wasSelected ) + SetSelection(n); + + // the width could have changed so the best size needs to be recomputed InvalidateBestSize(); } @@ -408,7 +414,7 @@ void wxChoice::DoSetItemClientData(unsigned int n, void* clientData) void* wxChoice::DoGetItemClientData(unsigned int n) const { LPARAM rc = SendMessage(GetHwnd(), CB_GETITEMDATA, n, 0); - if ( rc == CB_ERR ) + if ( rc == CB_ERR && GetLastError() != ERROR_SUCCESS ) { wxLogLastError(wxT("CB_GETITEMDATA")); @@ -752,7 +758,7 @@ bool wxChoice::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) WXHBRUSH wxChoice::MSWControlColor(WXHDC hDC, WXHWND hWnd) { - if ( !IsEnabled() ) + if ( !IsThisEnabled() ) return MSWControlColorDisabled(hDC); return wxChoiceBase::MSWControlColor(hDC, hWnd);