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") );
}
}
break;
-#endif // 0
// deal with tooltips here
#if wxUSE_TOOLTIPS && defined(TTN_NEEDTEXT)
case WM_KEYUP:
return HandleKeyUp(wParam, lParam);
+
+ case WM_SETFOCUS:
+ return HandleSetFocus((WXHWND)wParam);
+
+ case WM_KILLFOCUS:
+ return HandleKillFocus((WXHWND)wParam);
}
return FALSE;
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;
);
}
+ // and finally, show the control
+ Show(TRUE);
+
return TRUE;
}
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))
}
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))
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