【发布时间】:2013-08-22 14:19:36
【问题描述】:
我正在尝试获取 MFC CListCtrl 中列的顺序。最初,我尝试在 HDN_ENDDRAG 通知的消息处理程序中调用 GetColumnOrderArray(),但这总是返回旧的(拖放前)列顺序。因此,根据this SO 帖子评论中的建议,我尝试同时处理HDN_BEGINDRAG 和HDN_ENDDRAG,并使用phdr->pitem->iOrder 获取新旧列订单。但是在两个处理程序中,pitem 对我来说始终为 NULL。不知道为什么。
SOOO 我尝试使用存储在消息中的列索引 (phdr->iItem) 直接与 CHeaderCtrl 对话并自己获取列顺序,但是我的标题控件填充的结构中的字段都是无效的;我仍然无法获得列顺序。
我的列表控件是否存在某种更深层次的问题?还是我只是错误地处理了消息?
HDN_BEGINDRAG消息处理程序:
BOOL CDFAManListView::OnHdnBegindrag(UINT, NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
phdr->iItem; // this contains a valid column index
HDITEM columnStruct;
List->GetHeaderCtrl()->GetItem(phdr->iItem, &columnStruct); // but this call just fills columnStruct with junk values
if (phdr->pitem) // pitem is always null
{
initialPosition = phdr->pitem->iOrder;
}
*pResult = 0;
return TRUE;
}
HDN_ENDDRAG消息处理程序:
void CDFAManListView::OnHdnEnddrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
HDITEM columnStruct;
List->GetHeaderCtrl()->GetItem(phdr->iItem, &columnStruct); // still just fills columnStruct with junk
List->GetColumnOrderArray(signalColumnOrder); // gets **old** column order
*pResult = 0;
}
【问题讨论】:
标签: visual-c++ mfc clistctrl