Некорректная сортировка столбцов ClistCtrl

Это моя функция обратного вызова:

int CALLBACK SortMeAscending(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int nRetVal = 0;

PITEMDATA pData1 = (PITEMDATA)lParam1;
PITEMDATA pData2 = (PITEMDATA)lParam2;

switch(lParamSort)
{
case 0:
if(pData1->iSeq < pData2->iSeq)
nRetVal = -1;
else if(pData1->iSeq > pData2->iSeq)
nRetVal = 1;
else
nRetVal = 0;
break;

case 1:
nRetVal = lstrcmp(pData2->pszCueName, pData1->pszCueName);
break;
case 2:
nRetVal = lstrcmp(pData2->pszTags, pData1->pszTags);
break;

default:
break;
}

return nRetVal;
}

int CALLBACK SortMeDescending(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int nRetVal = 0;

PITEMDATA pData1 = (PITEMDATA)lParam1;
PITEMDATA pData2 = (PITEMDATA)lParam2;

switch(lParamSort)
{
case 0:
if(pData1->iSeq > pData2->iSeq)
nRetVal = -1;
else if(pData1->iSeq < pData2->iSeq)
nRetVal = 1;
else
nRetVal = 0;
break;

case 1:
nRetVal = lstrcmp(pData1->pszCueName, pData2->pszCueName);
break;
case 2:
nRetVal = lstrcmp(pData1->pszTags, pData2->pszTags);
break;

default:
break;
}

return nRetVal;
}

это мои OnCompareItems:

int CTest::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn)
{
CMFCHeaderCtrl &headerCntrl = GetHeaderCtrl();

BOOL b = 0;
if(headerCntrl.IsAscending())
{
return SortItems(SortMeDescending, iColumn);
}
else
{
return SortItems(SortMeAscending, iColumn);
}
}

Если я буду следовать этому посту http://support.microsoft.com/kb/250614
У меня нет стрелок сортировки в заголовках.
Если я использую мой метод, который вы видите выше, я получаю некоторый пробел в сортировке.
Я нажимаю на это сортирует и в следующий раз это не будет сортировать и снова и снова
Помогите мне, пожалуйста

1

Решение

Я думаю, что вам нужно использовать CMFCHeaderCtrl :: SetSortColumn установить порядок сортировки столбца. каждый раз, когда вы сортируете. В дополнение к этому фактическая функция сортировки должна вызываться из обработчика HDN_ITEMCLICK.

Итак, если вы указали это:

ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickList1)

В методе OnItemclickList1 напишите этот код:

void CTest::OnItemclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW *pLV = (NMLISTVIEW *) pNMHDR;
CMFCHeaderCtrl &headerCntrl = GetHeaderCtrl();

BOOL b = 0;
if(headerCntrl.IsAscending())
{
headerCntrl.SetSortColumn(pLV->iItem, FALSE);
SortItems(SortMeDescending, pLV->iItem);
}
else
{
headerCntrl.SetSortColumn(pLV->iItem, TRUE);
SortItems(SortMeAscending, iColumn);
}
*pResult = 0;
}

и угробить OnCompareItems

1

Другие решения

Других решений пока нет …