是LISTVIEW的排序
void CView_ListFiles::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
static int ncurSortCol = -1; // 保存当前的排序列。
// 一开始表示为-1,表示尚未按任何列排序。 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; CListCtrl* lc = &GetListCtrl();
LONG ws = GetWindowLong(lc->m_hWnd, GWL_STYLE);
int nSortOrder; // 排序的方式 // 若点击列与当前排序列不同的列,则改变排序序,并将排序方式改为增序。
// 若当前排序列与点击列相同,则更改增、减序的排序方式
if (ncurSortCol == pNMListView->iSubItem)
{
if (ws & LVS_SORTASCENDING)
{
ws ^= LVS_SORTASCENDING;
nSortOrder = LVS_SORTDESCENDING;
}
else
{
ws ^= LVS_SORTDESCENDING;
nSortOrder = LVS_SORTASCENDING;
}
}
else
{
if (ws & LVS_SORTASCENDING)
ncurSortCol = pNMListView->iSubItem;
if (ws & LVS_SORTASCENDING)
nSortOrder = LVS_SORTASCENDING;
else
nSortOrder = LVS_SORTDESCENDING;
} // 将当前的排序信息保存在窗口Style中,供以后使用
ws |= nSortOrder;
SetWindowLong(lc->m_hWnd, GWL_STYLE, ws); // 将各ITEM的LPARAM用新排序列的内容替换
LVITEM li;
li.mask = LVIF_PARAM|LVIF_TEXT;
TCHAR szItemText[1024];
for (int i = 0; i < lc->GetItemCount(); i++)
{
li.iItem = i;
li.iSubItem = ncurSortCol;
li.cchTextMax = 1024;
li.pszText = szItemText;
lc->GetItem(&li);
TCHAR * szlparam = (TCHAR *)li.lParam;
if (szlparam != NULL)
// 删除以前的信息,释放空间
// 添加List Item时应注意将lParam初始化NULL
delete szlparam; // 复制当前列的szItemText到Item的lParam中
  szlparam = new TCHAR[lstrlen(szItemText) + 1];
lstrcpy(szlparam, szItemText);
lc->SetItemData(i, (DWORD_PTR)szlparam);
} // 开始排序
GetListCtrl().SortItems(ListViewCompareFunc,(LPARAM) (&nSortOrder));
*pResult = 0;
}其中 
TCHAR * szlparam = (TCHAR *)li.lParam;
if (szlparam != NULL)
// 删除以前的信息,释放空间
// 添加List Item时应注意将lParam初始化NULL
delete szlparam; // 复制当前列的szItemText到Item的lParam中
  szlparam = new TCHAR[lstrlen(szItemText) + 1];
很奇怪,看不太懂,szlparam先是指向一个值,然后又删除???看不明白,请高手解答,还有,VS。NET提示说有内存泄漏,我在循环的最后加上delete szlparam会在第二次点击column的时候报错。求救。