1

我正在尝试获取 MFC 中列的顺序CListCtrl。最初我尝试调用通知GetColumnOrderArray()的消息处理程序HDN_ENDDRAG,但这总是返回旧的(拖放前)列顺序。因此,根据SO 帖子评论中的建议,我尝试同时处理 theHDN_BEGINDRAG和 theHDN_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;
}
4

2 回答 2

0

这可能是一个有点简单的解决方案,为什么不在GetColumnOrderArray()列表控件的父级需要关闭时调用呢?

如果您确实需要立即将列顺序用于其他目的并且从您引用的 SO 帖子中调用,看起来HDN_ENDDRAG还为时过早,请GetColumnOrderArray()尝试PostMessage在末尾的列表控件(父级)中OnHdnEnddrag()使用消息编号该消息的处理程序中的范围WM_USER through 0x7FFF和调用GetColumnOrderArray()

于 2013-08-22T15:55:28.367 回答
0

虽然这是一个老问题,但我刚刚在查看 CListCtrl 列拖动时遇到了它,并认为我会对其进行一些更新,以防它对其他人有用。

OP提到,

HDITEM columnStruct;

List->GetHeaderCtrl()->GetItem(phdr->iItem, &columnStruct); // but this call just fills columnStruct with junk values

这将是因为您尚未初始化 columnStruct 足以告诉 GetItem 您有兴趣检索哪些数据。您需要使用各种标志初始化 columnStruct.mask,例如 HDI_WIDTH | HDI_ORDER,如果你使用 HDI_TEXT,那么给 columnStruct.pszText 一个缓冲区和 columnStruct.cchTextMax 缓冲区的大小。

例如,这记录在 MSDN 上的 CHeaderCtrl::GetItem 文档中

在掩码元素中设置的任何标志都可确保在返回时正确填写相应元素中的值。如果掩码元素设置为零,则其他结构元素中的值无意义。

于 2014-05-19T15:13:09.067 回答