除非应用程序保存了每个项目的数据的私有副本,并在lParam中存放了一个值允许项目的数据被检索,否则比较函数得不到执行。解决方法可以对项目的子项目文本制定LPSTR_TEXTCALLBACK,并响应LVN_GETDISPINFO通知时给列表视图控件提供文本。
eg.
typedef struct tagITEMINFO {
CString strFileName;
DWORD nFileSizeLow;
FILETIME ftLastWriteTime;
}ITEMINFO
ITEMINFO * pItem;
pItem = new ITEMINFO;
//in view fileBOOL CFileView::AddItem(int nIndex, WIN32_FIND_DATA *pfd)
{
//
// Allocate a new ITEMINFO structure and initialize it with information
// about the item
// ITEMINFO *pItem;
try {
pItem = new ITEMINFO;
}
catch (CMemoryException* e) {
e->Delete ();
return FALSE;
} pItem->strFileName = pfd->cFileName;
pItem->nFileSizeLow = pfd->nFileSizeLow;
pItem->ftLastWriteTime = pfd->ftLastWriteTime; //
// Add the item to the list view.
//
LV_ITEM lvi;
lvi.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
lvi.iItem = nIndex;
lvi.iSubItem = 0;
lvi.iImage = 0;
lvi.pszText = LPSTR_TEXTCALLBACK;
lvi.lParam = (LPARAM) pItem;
if (GetListCtrl ().InsertItem (&lvi) == -1)
return FALSE;
return TRUE;
}
void CFileView::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
CString string;
LV_DISPINFO* pDispInfo = (LV_DISPINFO*) pNMHDR; if (pDispInfo->item.mask & LVIF_TEXT) {
ITEMINFO* pItem = (ITEMINFO*) pDispInfo->item.lParam; switch (pDispInfo->item.iSubItem) {

case 0: // File name
::lstrcpy (pDispInfo->item.pszText, pItem->strFileName);
break; case 1: // File size
string.Format (_T("%u"), pItem->nFileSizeLow);
::lstrcpy (pDispInfo->item.pszText, string);
break; case 2: // Date and time
CTime time (pItem->ftLastWriteTime); BOOL pm = FALSE;
int nHour = time.GetHour ();
if (nHour == 0)
nHour = 12;
else if (nHour == 12)
pm = TRUE;
else if (nHour > 12) {
nHour -= 12;
pm = TRUE;
} string.Format (_T("% d / % 0.2d / % 0.2d (%d: % 0.2d % c)"),
time.GetMonth (), time.GetDay (), time.GetYear () & 100,
nHour, time.GetMinute (), pm? _T('p'):_T('a'));
::lstrcpy (pDispInfo -> item.pszText, string);
break;
}
}
*pResult = 0;
}