首页 > 解决方案 > 在 CListCtrl 上设置排序指示符正在清除列标题

问题描述

在此处输入图像描述在清除该列标题的特定列上设置排序指示器时。

代码片段

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标头信息;

列标题是名称。点击后清除

标签: c++mfcclistctrl

解决方案


最后我得到了答案,我们必须应用HDI_FORMATbefore 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);
}
}

谢谢大家的建议和意见。


推荐阅读