下面是代码:int CMyListBox::CompareItem(LPCOMPAREITEMSTRUCT lpCIS)
{
// TODO:  用您的消息处理程序代码替换下一行
DWORD item1,item2;
item1 = lpCIS->itemData1;
item2 = lpCIS->itemData2;
if (item1 < item2)
{
return -1;
}
else
{
return 1;
}
return 0;
}
void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
// TODO: 在此处添加消息处理程序代码
CDC dc;
dc.Attach(lpDIS->hDC); CRect rect = lpDIS->rcItem;
UINT  nIndex = lpDIS->itemID; CBrush* pBrush = new CBrush(
::GetSysColor((lpDIS->itemState&ODS_SELECTED)?COLOR_HIGHLIGHT:COLOR_WINDOW));
dc.FillRect(&rect,pBrush); if (lpDIS->itemState&ODS_FOCUS)
{
dc.DrawFocusRect(rect);
}

if (nIndex != (UINT)-1)
{
//  CString str;
//  GetText(nIndex,str); in_addr addr;
addr.S_un.S_addr = (DWORD)(lpDIS->itemData); dc.SetBkMode(TRANSPARENT);
dc.DrawText(inet_ntoa(addr),-1,&rect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);
} dc.Detach();
}
问题是这样的,我想将添加到ListBox的各个项目按照他们的ItemData排序
但是发现只重载CompareItem函数会报莫名其妙的错误于是又重载了DrawItem、MeasureItem来启动自绘目前的问题就是CompareItem、DrawItem、MeasureItem三个函数传入的结构
(LPCOMPAREITEMSTRUCT、LPDRAWITEMSTRUCT、LPMEASUREITEMSTRUCT)
里面的itemData项都不正确推断是因为AddString就会触发排序和重绘,这时还没有调用到SetItemData,
所以上述三个结构的itemData项在第一遍调用的时候总是一个固定的初始化值但是又没有办法在AddString之前就把ItemData设置好,所以一直都得不到想要的结果
ListBox没有按预期的顺序排序,重绘的第一个List项也会是一个固定的错误值(取决于初始的ItemData)我已经调了一天了,实在没办法了,大家给点建议把

解决方案 »

  1.   

    http://blog.csdn.net/visualeleven/article/details/5935430
    参考一下这个
      

  2.   

    请参考这个,代码简介明了
    http://download.csdn.net/detail/gameslq/3648385
      

  3.   

    我的问题是ListBox不是ListCtrl,
    ListBox里面的排序是在AddString的时候完成的,没有用户事件去触发他(是父窗口的WM_COMPAREITEM消息调用它的回调)还是谢谢你的示例,很不错的ListCtrl
      

  4.   


    VisualEleven你好
    我参考你的博文写了下我的DrawItem,但是也不能正常工作void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
    {
    // TODO: 在此处添加消息处理程序代码
    ASSERT(lpDIS->CtlType == ODT_LISTBOX); 
    CDC dc;
    dc.Attach(lpDIS->hDC); CRect rect = lpDIS->rcItem;
    UINT nIndex = lpDIS->itemID;
    COLORREF bkClr;
    COLORREF frClr = RGB(0,0,0); // 若为焦点项则前、背景色高亮
    if (lpDIS->itemState&ODS_SELECTED)
    {
    bkClr = RGB(100,100,255);
    frClr = GetSysColor(COLOR_HIGHLIGHTTEXT);
    }
    else
    {
    // 不为焦点项,背景色浅蓝与白色交替
    if ((lpDIS->itemID)%2)
    {
    bkClr = RGB(220,220,255);
    }
    else
    {
    bkClr = RGB(255,255,255);
    }
    }
    // 设置前景色
    dc.SetTextColor(frClr);
    dc.SetBkMode(TRANSPARENT);
    // 填充背景色
    CBrush* pBrush = new CBrush(bkClr);
    dc.FillRect(&rect,pBrush); if (lpDIS->itemState&ODS_FOCUS)
    {
    dc.DrawFocusRect(rect);
    }

    if (nIndex != (UINT)-1)
    {
    in_addr addr;
    addr.S_un.S_addr = (DWORD)lpDIS->itemData;
    dc.DrawText(inet_ntoa(addr),-1,&rect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);/*  dc.DrawText((LPCTSTR)lpDIS->itemData,-1,&rect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);*/
    //这里被注释掉的这行,如果将itemData当做LPCSTR使用的话会报其他地方的错误
    //将itemData当做我设置的IP使用的话则可以得到正确结果
    } dc.Detach();
    }
      

  5.   

    然后就是我的CompareItem函数传入的结构体总有一项的ID是-1int CMyListBox::CompareItem(LPCOMPAREITEMSTRUCT lpCIS)
    {
    // TODO:  用您的消息处理程序代码替换下一行
    if (lpCIS->itemID1 == -1 || lpCIS->itemID2 == -1)
    {
    return 0;//总会命中这里
    }