X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dd3c394ae4e6f6a0041b69e036d4fdf0a085fe39..891ad68ff5ac338d81ea0c4ff176601761e73517:/src/msw/checklst.cpp?ds=sidebyside diff --git a/src/msw/checklst.cpp b/src/msw/checklst.cpp index 35c0f3ced9..5e46c81073 100644 --- a/src/msw/checklst.cpp +++ b/src/msw/checklst.cpp @@ -40,10 +40,15 @@ #include "wx/settings.h" #include "wx/dcmemory.h" #include "wx/msw/checklst.h" +#include "wx/log.h" #include #include +#ifdef __GNUWIN32__ +#include "wx/msw/gnuwin32/extra.h" +#endif + // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- @@ -222,10 +227,24 @@ void wxCheckListBoxItem::Check(bool check) m_nIndex = (size_t)index; } - size_t nHeight = m_pParent->GetItemHeight(); - size_t y = m_nIndex * nHeight; - RECT rcUpdate = { 0, y, GetDefaultMarginWidth(), y + nHeight}; - InvalidateRect((HWND)m_pParent->GetHWND(), &rcUpdate, FALSE); + HWND hwndListbox = (HWND)m_pParent->GetHWND(); + + #ifdef __WIN32__ + RECT rcUpdate; + + if ( ::SendMessage(hwndListbox, LB_GETITEMRECT, + m_nIndex, (LPARAM)&rcUpdate) == LB_ERR ) + { + wxLogDebug("LB_GETITEMRECT failed"); + } + #else // Win16 + // FIXME this doesn't work if the listbox is scrolled! + size_t nHeight = m_pParent->GetItemHeight(); + size_t y = m_nIndex * nHeight; + RECT rcUpdate = { 0, y, GetDefaultMarginWidth(), y + nHeight}; + #endif // Win32/16 + + InvalidateRect(hwndListbox, &rcUpdate, FALSE); wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, m_pParent->GetId()); event.SetInt(m_nIndex); @@ -300,8 +319,8 @@ void wxCheckListBox::InsertItems(int nItems, const wxString items[], int pos) wxOwnerDrawn *wxCheckListBox::CreateItem(size_t nIndex) { wxCheckListBoxItem *pItem = new wxCheckListBoxItem(this, nIndex); - if ( m_windowFont.Ok() ) - pItem->SetFont(m_windowFont); + if ( m_font.Ok() ) + pItem->SetFont(m_font); return pItem; } @@ -346,15 +365,26 @@ void wxCheckListBox::OnChar(wxKeyEvent& event) if ( event.KeyCode() == WXK_SPACE ) GetItem(GetSelection())->Toggle(); else - wxListBox::OnChar(event); + event.Skip(); } void wxCheckListBox::OnLeftClick(wxMouseEvent& event) { // clicking on the item selects it, clicking on the checkmark toggles if ( event.GetX() <= wxOwnerDrawn::GetDefaultMarginWidth() ) { - // FIXME better use LB_ITEMFROMPOINT perhaps? - size_t nItem = ((size_t)event.GetY()) / m_nItemHeight; + #ifdef __WIN32__ + size_t nItem = (size_t)::SendMessage + ( + (HWND)GetHWND(), + LB_ITEMFROMPOINT, + 0, + MAKELPARAM(event.GetX(), event.GetY()) + ); + #else // Win16 + // FIXME this doesn't work when the listbox is scrolled! + size_t nItem = ((size_t)event.GetY()) / m_nItemHeight; + #endif // Win32/16 + if ( nItem < (size_t)m_noItems ) GetItem(nItem)->Toggle(); //else: it's not an error, just click outside of client zone