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)
//else: it shouldn't change
}
-wxSize wxListBox::DoGetBestSize() const
+wxSize wxListBox::DoGetBestClientSize() const
{
// find the widest string
int wLine;
wListbox = 100;
// the listbox should be slightly larger than the widest string
- int cx, cy;
- wxGetCharSize(GetHWND(), &cx, &cy, GetFont());
+ wListbox += 3*GetCharWidth();
- wListbox += 3*cx;
-
- // Add room for the scrollbar
+ // add room for the scrollbar
wListbox += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
// don't make the listbox too tall (limit height to 10 items) but don't
// make it too small neither
- int hListbox = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy)*
+ int hListbox = SendMessage(GetHwnd(), LB_GETITEMHEIGHT, 0, 0)*
wxMin(wxMax(m_noItems, 3), 10);
- wxSize best(wListbox, hListbox);
- CacheBestSize(best);
- return best;
+ return wxSize(wListbox, hListbox);
}
// ----------------------------------------------------------------------------
}
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
{
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);
wxListBoxItem *pItem = (wxListBoxItem *)m_aItems[pStruct->itemID];
wxDCTemp dc((WXHDC)pStruct->hDC);
- wxPoint pt1(pStruct->rcItem.left, pStruct->rcItem.top);
- wxPoint pt2(pStruct->rcItem.right, pStruct->rcItem.bottom);
- wxRect rect(pt1, pt2);
- return pItem->OnDrawItem(dc, rect,
+ return pItem->OnDrawItem(dc, wxRectFromRECT(pStruct->rcItem),
(wxOwnerDrawn::wxODAction)pStruct->itemAction,
(wxOwnerDrawn::wxODStatus)pStruct->itemState);
}