C++ 在CListCtrl上设置排序指示符将清除列标题
在特定列上设置排序指示器时,清除该列的标题 代码片段C++ 在CListCtrl上设置排序指示符将清除列标题,c++,mfc,clistctrl,C++,Mfc,Clistctrl,在特定列上设置排序指示器时,清除该列的标题 代码片段 HDITEM headerInfo = {0}; for (int colindex = 0; colindex < n; colindex++) { if (TRUE == pHDR->GetItem(colindex, &headerInfo)) { headerInfo.mask = HDI_FORMAT; // column match? if (coli
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);
}
}
HDITEM headerInfo={0};
对于(int colindex=0;colindexGetItem(colindex和headerInfo))
{
headerInfo.mask=HDI_格式;
//列匹配?
if(colindex==列)
{
if(升序)
{
headerInfo.fmt |=HDF|u SORTUP;
headerInfo.fmt&=~HDF\u SORTDOWN;
}
其他的
{
headerInfo.fmt |=HDF|u SORTDOWN;
headerInfo.fmt&=~HDF\u SORTUP;
}
}
//关闭排序箭头
其他的
{
headerInfo.fmt&=~HDF\u SORTDOWN&~HDF\u SORTUP;
}
pHDR->SetItem(colindex和headerInfo);
}
}
如果我删除headerInfo
初始化,它在调试模式下工作正常,但在发布模式下崩溃。
HDITEM
headerInfo
科隆的头衔是他的名字。单击它后,它将被清除您有一些地方出错 首先,如果调用
GetItem
,并将headerInfo.mask
设置为0,则不会返回任何内容。对于后续调用,它将设置为HDI\u FORMAT
,因此您将获得格式信息
第二,不管怎么说,GetItem
调用您需要什么都不清楚;您不使用任何字段。您仅测试此调用是否返回TRUE
,但所有有效列索引都应返回该值
最后,在您的
SetItem
中,您声明fmt
成员有效,但它不包含HDF\u字符串
标志,因此该项上不会显示任何文本。最后我得到了答案,我们必须在GetItem
之前应用HDI\u格式。如果我们在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);
}
}
HDITEM headerInfo={0};
headerInfo.mask=HDI_格式;
对于(int colindex=0;colindexGetItem(colindex和headerInfo))
{
//列匹配?
if(colindex==列)
{
if(升序)
{
headerInfo.fmt |=HDF|u SORTUP;
headerInfo.fmt&=~HDF\u SORTDOWN;
}
其他的
{
headerInfo.fmt |=HDF|u SORTDOWN;
headerInfo.fmt&=~HDF\u SORTUP;
}
}
//关闭排序箭头
其他的
{
headerInfo.fmt&=~HDF\u SORTDOWN&~HDF\u SORTUP;
}
pHDR->SetItem(colindex和headerInfo);
}
}
谢谢大家的建议和输入。是否有足够的空间显示标题和排序指示器?@IIinspectable是的,可能会显示一些屏幕抓图…@AndrewTruckle更新了屏幕截图,列标题是Name,单击后,如果使用headerInfo.mask |=HDI_格式,则其将被删除并添加排序指示符级别改进
附加标志而不是替换,因为任何现有的指定文本标题的HDI\u文本
都将被删除?只是一个想法。需要调用GetItem
。如果不这样做,header控件将删除所有未在后续调用SetItem
中设置的fmt
标志。实际上,OP使用的是fmt
字段。@Vlad:但是如果我删除了headerInfo@iam:它在调试模式下“工作不正常”。幸运的是,调试运行时使用位模式(0xCD
)填充未初始化的内存,该位模式恰好设置了所需的位(HDI_FORMAT
,0x04)。发布运行时没有,你会得到内存位置中的任何垃圾。是的,你设置了掩码来声明你想要得到的项目。现在我在您的原始代码中看到了这个错误。做得好。