X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f022dc238aa392e951e625ef7105d6e9bfd9572a..6cab4fcac7fe26d9ae5a1d29066e0893d689bb38:/src/msw/listbox.cpp diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index 1c7c0b5785..c732b395ac 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -356,15 +356,6 @@ void wxListBox::DoSetItemClientData(unsigned int n, void *clientData) wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetClientData") ); -#if wxUSE_OWNER_DRAWN - if ( m_windowStyle & wxLB_OWNERDRAW ) - { - // client data must be pointer to wxOwnerDrawn, otherwise we would crash - // in OnMeasure/OnDraw. - wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes")); - } -#endif // wxUSE_OWNER_DRAWN - if ( ListBox_SetItemData(GetHwnd(), n, clientData) == LB_ERR ) wxLogDebug(wxT("LB_SETITEMDATA failed")); } @@ -474,8 +465,6 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items, pNewItem->SetName(items[i]); pNewItem->SetFont(GetFont()); m_aItems.Insert(pNewItem, n); - - ListBox_SetItemData(GetHwnd(), n, pNewItem); } #endif // wxUSE_OWNER_DRAWN AssignNewItemClientData(n, clientData, i, type); @@ -490,12 +479,12 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items, int wxListBox::DoListHitTest(const wxPoint& point) const { - LRESULT lRes = ::SendMessage(GetHwnd(), LB_ITEMFROMPOINT, - 0L, MAKELONG(point.x, point.y)); + LRESULT lRes = ::SendMessage(GetHwnd(), LB_ITEMFROMPOINT, + 0, MAKELPARAM(point.x, point.y)); // non zero high-order word means that this item is outside of the client // area, IOW the point is outside of the listbox - return HIWORD(lRes) ? wxNOT_FOUND : lRes; + return HIWORD(lRes) ? wxNOT_FOUND : LOWORD(lRes); } void wxListBox::SetString(unsigned int n, const wxString& s) @@ -533,9 +522,6 @@ void wxListBox::SetString(unsigned int n, const wxString& s) { // update item's text m_aItems[n]->SetName(s); - - // reassign the item's data - ListBox_SetItemData(GetHwnd(), n, m_aItems[n]); } #endif //USE_OWNER_DRAWN @@ -654,13 +640,18 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) } wxEventType evtType; + int n; if ( param == LBN_SELCHANGE ) { evtType = wxEVT_COMMAND_LISTBOX_SELECTED; + n = SendMessage(GetHwnd(), LB_GETCARETINDEX, 0, 0); + + // NB: conveniently enough, LB_ERR is the same as wxNOT_FOUND } else if ( param == LBN_DBLCLK ) { evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED; + n = HitTest(ScreenToClient(wxGetMousePosition())); } else { @@ -668,25 +659,19 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) return false; } - wxCommandEvent event(evtType, m_windowId); - event.SetEventObject( this ); - // retrieve the affected item - int n = SendMessage(GetHwnd(), LB_GETCARETINDEX, 0, 0); - if ( n != LB_ERR ) - { - if ( HasClientObjectData() ) - event.SetClientObject( GetClientObject(n) ); - else if ( HasClientUntypedData() ) - event.SetClientData( GetClientData(n) ); - - event.SetString(GetString(n)); - } - else - { + if ( n == wxNOT_FOUND ) return false; - } + wxCommandEvent event(evtType, m_windowId); + event.SetEventObject(this); + + if ( HasClientObjectData() ) + event.SetClientObject( GetClientObject(n) ); + else if ( HasClientUntypedData() ) + event.SetClientData( GetClientData(n) ); + + event.SetString(GetString(n)); event.SetInt(n); return HandleWindowEvent(event); @@ -747,17 +732,12 @@ bool wxListBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), false ); DRAWITEMSTRUCT *pStruct = (DRAWITEMSTRUCT *)item; - UINT itemID = pStruct->itemID; // the item may be -1 for an empty listbox - if ( itemID == (UINT)-1 ) + if ( pStruct->itemID == (UINT)-1 ) return false; - LRESULT data = ListBox_GetItemData(GetHwnd(), pStruct->itemID); - - wxCHECK( data && (data != LB_ERR), false ); - - wxListBoxItem *pItem = (wxListBoxItem *)data; + wxListBoxItem *pItem = (wxListBoxItem *)m_aItems[pStruct->itemID]; wxDCTemp dc((WXHDC)pStruct->hDC); wxPoint pt1(pStruct->rcItem.left, pStruct->rcItem.top);