#include "wx/choice.h"
#include "wx/utils.h"
#include "wx/log.h"
+ #include "wx/brush.h"
+ #include "wx/settings.h"
#endif
#include "wx/msw/private.h"
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
-#endif
// ============================================================================
// implementation
if ( !CreateControl(parent, id, pos, size, style, validator, name) )
return FALSE;
- long msStyle = WS_CHILD | CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
+ long msStyle = WS_CHILD | CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL /* | WS_CLIPSIBLINGS */;
if ( style & wxCB_SORT )
msStyle |= CBS_SORT;
- // the experience shows that wxChoice vs. wxComboBox distinction confuses
+ // Experience shows that wxChoice vs. wxComboBox distinction confuses
// quite a few people - try to help them
wxASSERT_MSG( !(style & wxCB_DROPDOWN) &&
!(style & wxCB_READONLY) &&
!(style & wxCB_SIMPLE),
- wxT("this style flag is ignored by wxChoice, you "
- "probably want to use a wxComboBox") );
+ _T("this style flag is ignored by wxChoice, you ")
+ _T("probably want to use a wxComboBox") );
if ( !MSWCreateControl(wxT("COMBOBOX"), msStyle) )
return FALSE;
+ // A choice/combobox normally has a white background (or other, depending
+ // on global settings) rather than inheriting the parent's background colour.
+ SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW));
+
for ( int i = 0; i < n; i++ )
{
Append(choices[i]);
return TRUE;
}
+wxChoice::~wxChoice()
+{
+ Free();
+}
+
// ----------------------------------------------------------------------------
// adding/deleting items to/from the list
// ----------------------------------------------------------------------------
int n = (int)SendMessage(GetHwnd(), CB_ADDSTRING, 0, (LONG)item.c_str());
if ( n == CB_ERR )
{
- wxLogLastError("SendMessage(CB_ADDSTRING)");
+ wxLogLastError(wxT("SendMessage(CB_ADDSTRING)"));
}
return n;
}
void wxChoice::Clear()
+{
+ Free();
+
+ SendMessage(GetHwnd(), CB_RESETCONTENT, 0, 0);
+}
+
+void wxChoice::Free()
{
if ( HasClientObjectData() )
{
delete GetClientObject(n);
}
}
-
- SendMessage(GetHwnd(), CB_RESETCONTENT, 0, 0);
}
// ----------------------------------------------------------------------------
if (len) {
if ( ::SendMessage(GetHwnd(), CB_GETLBTEXT, n,
(LPARAM)str.GetWriteBuf(len)) == CB_ERR ) {
- wxLogLastError("SendMessage(CB_GETLBTEXT)");
+ wxLogLastError(wxT("SendMessage(CB_GETLBTEXT)"));
}
str.UngetWriteBuf();
}
wxLogLastError(wxT("CB_GETITEMDATA"));
// unfortunately, there is no way to return an error code to the user
- rc = (LPARAM) NULL;
+ rc = (LPARAM) NULL;
}
return (void *)rc;
wxControl::DoSetSize(x, y, width, -1, sizeFlags);
}
-wxSize wxChoice::DoGetBestSize()
+wxSize wxChoice::DoGetBestSize() const
{
// find the widest string
int wLine;
return FALSE;
}
- wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, m_windowId);
- event.SetInt(GetSelection());
- event.SetEventObject(this);
- event.SetString(GetStringSelection());
- ProcessCommand(event);
+ int n = GetSelection();
+ if (n > -1)
+ {
+ wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, m_windowId);
+ event.SetInt(n);
+ event.SetEventObject(this);
+ event.SetString(GetStringSelection());
+ if ( HasClientObjectData() )
+ event.SetClientObject( GetClientObject(n) );
+ else if ( HasClientUntypedData() )
+ event.SetClientData( GetClientData(n) );
+ ProcessCommand(event);
+ }
return TRUE;
}
+WXHBRUSH wxChoice::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
+ WXUINT message,
+ WXWPARAM wParam,
+ WXLPARAM lParam)
+{
+#if wxUSE_CTL3D
+ if ( m_useCtl3D )
+ {
+ HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
+ return (WXHBRUSH) hbrush;
+ }
+#endif // wxUSE_CTL3D
+
+ HDC hdc = (HDC)pDC;
+ if (GetParent()->GetTransparentBackground())
+ SetBkMode(hdc, TRANSPARENT);
+ else
+ SetBkMode(hdc, OPAQUE);
+
+ wxColour colBack = GetBackgroundColour();
+
+ if (!IsEnabled())
+ colBack = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+
+ ::SetBkColor(hdc, wxColourToRGB(colBack));
+ ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour()));
+
+ wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBack, wxSOLID);
+
+ return (WXHBRUSH)brush->GetResourceHandle();
+}
+
+