下面是代码: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)我已经调了一天了,实在没办法了,大家给点建议把
{
// 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)我已经调了一天了,实在没办法了,大家给点建议把
参考一下这个
http://download.csdn.net/detail/gameslq/3648385
ListBox里面的排序是在AddString的时候完成的,没有用户事件去触发他(是父窗口的WM_COMPAREITEM消息调用它的回调)还是谢谢你的示例,很不错的ListCtrl
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();
}
{
// TODO: 用您的消息处理程序代码替换下一行
if (lpCIS->itemID1 == -1 || lpCIS->itemID2 == -1)
{
return 0;//总会命中这里
}