Установка индикатора сортировки на CListCtrl очищает заголовок столбца - PullRequest
1 голос
/ 27 января 2020

enter image description here При установке индикатора сортировки для определенного столбца с очисткой заголовка этого столбца.

Фрагмент кода

HDITEM headerInfo = {0};

for (int colindex = 0; colindex < n; colindex++)
{
    if (TRUE == pHDR->GetItem(colindex, &headerInfo))
    {

        headerInfo.mask = HDI_FORMAT;
    // column match?
        if (colindex == column)
        {
            if (ascending)
            {
                headerInfo.fmt |= HDF_SORTUP;
                headerInfo.fmt &= ~HDF_SORTDOWN;
            }
            else
            {
                headerInfo.fmt |= HDF_SORTDOWN;
                headerInfo.fmt &= ~HDF_SORTUP;
            }
        }
        // switch off sort arrows
        else
        {
            headerInfo.fmt &= ~HDF_SORTDOWN & ~HDF_SORTUP;
        }       
        pHDR->SetItem(colindex, &headerInfo);
    }
}

Если я удаляю headerInfo его инициализация работает нормально в режиме отладки, но происходит сбой в режиме выпуска. HDITEM headerInfo;

Заголовок столбца был Name. Его очищают после нажатия на него

Ответы [ 2 ]

1 голос
/ 28 января 2020

Наконец я получил ответ, мы должны применить HDI_FORMAT до GetItem. Если мы подадим заявку после GetItem, она очистит маскированные флаги. Я проверил, и он работает, как ожидалось.

HDITEM headerInfo = {0};
headerInfo.mask = HDI_FORMAT;

for (int colindex = 0; colindex < n; colindex++)
{
if (TRUE == pHDR->GetItem(colindex, &headerInfo))
{
    // column match?
    if (colindex == column)
    {
        if (ascending)
        {
            headerInfo.fmt |= HDF_SORTUP;
            headerInfo.fmt &= ~HDF_SORTDOWN;
        }
        else
        {
            headerInfo.fmt |= HDF_SORTDOWN;
            headerInfo.fmt &= ~HDF_SORTUP;
        }
    }
    // switch off sort arrows
    else
    {
        headerInfo.fmt &= ~HDF_SORTDOWN & ~HDF_SORTUP;
    }       
    pHDR->SetItem(colindex, &headerInfo);
}
}

Спасибо всем за предложения и вклад.

0 голосов
/ 28 января 2020

Вы ошиблись.

Во-первых, если вы позвоните GetItem с headerInfo.mask, установленным в 0, вы ничего не получите обратно. Для последующих вызовов он будет установлен на HDI_FORMAT, поэтому вы будете получать информацию о формате.

Во-вторых, неясно, зачем вам нужен этот GetItem вызов в любом случае; Вы не используете ни одно из полей. Вы только проверяете, что этот вызов возвращает TRUE, но это ожидается для всех допустимых индексов столбцов.

И, наконец, в вашем SetItem вы утверждаете, что член fmt действителен, но это не не содержит HDF_STRING флаг, поэтому текст для этого элемента отображаться не будет.

...