#include "wx/renderer.h"
#include "wx/msw/private.h"
+#include "wx/msw/dc.h"
// ----------------------------------------------------------------------------
// private functions
class wxCheckListBoxItem : public wxOwnerDrawn
{
-friend class WXDLLEXPORT wxCheckListBox;
+friend class WXDLLIMPEXP_FWD_CORE wxCheckListBox;
public:
// ctor
wxCheckListBoxItem(wxCheckListBox *pParent, size_t nIndex);
if ( !wxOwnerDrawn::OnDrawItem(dc, rc, act, stat) )
return false;
+ wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl();
// now draw the check mark part
- HDC hdc = GetHdcOf(dc);
+ HDC hdc = GetHdcOf(*impl);
int nBmpWidth = ::GetSystemMetrics(SM_CXMENUCHECK),
nBmpHeight = ::GetSystemMetrics(SM_CYMENUCHECK);
wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, m_pParent->GetId());
event.SetInt(m_nIndex);
event.SetEventObject(m_pParent);
+ event.SetString(m_pParent->GetString(m_nIndex));
m_pParent->ProcessCommand(event);
}
if ( nItem != wxNOT_FOUND )
{
- wxCheckListBoxItem *item = GetItem(nItem);
- item->Toggle();
- item->SendEvent();
+ // people expect to get "kill focus" event for the currently
+ // focused control before getting events from the other controls
+ // and, equally importantly, they may prevent the focus change from
+ // taking place at all (e.g. because the old control contents is
+ // invalid and needs to be corrected) in which case we shouldn't
+ // generate this event at all
+ SetFocus();
+ if ( FindFocus() == this )
+ {
+ wxCheckListBoxItem *item = GetItem(nItem);
+ item->Toggle();
+ item->SendEvent();
+ }
}
//else: it's not an error, just click outside of client zone
}