Неправильная сортировка столбцов 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, я не t иметь стрелки сортировки в заголовках. Если я использую свой метод, который вы можете видеть выше, я получаю пробел в сортировке. Я нажимаю на сортировку, а в следующий раз не будет сортировки, и снова и снова, пожалуйста, помогите мне.


person user1711993    schedule 07.10.2013    source источник
comment
Вы вызываете SortMeAscending независимо от того, является ли элемент управления заголовком возрастающим или нет — это преднамеренно?   -  person mungflesh    schedule 07.10.2013
comment
Это не имеет значения. Он все равно сортирует один раз, а следующий пропускает   -  person user1711993    schedule 07.10.2013


Ответы (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

person cha    schedule 07.10.2013