【问题标题】:Problem with HDN_ENDTRACK when resizing a list column调整列表列大小时出现 HDN_ENDTRACK 问题
【发布时间】:2009-09-15 11:46:11
【问题描述】:

在处理派生自 CListCtrl 的自定义类的 HDN_ENDTRACKW 消息时遇到了一点问题。

基本上,似乎在发送此消息时,存储列宽度的实际值直到我的处理代码执行后才更新。

句柄内的代码只是指示进度条调整大小,以填充调整后的列的宽度。 代码:

void ProgListCtrl::OnEndTrack(NMHDR* pNMHDR, LRESULT* pResult)
{
 int width = ListView_GetColumnWidth(GetSafeHwnd(), m_nProgressColumn);
 ResizeProgressbar();
}

ListView_GetColumnWidth 目前只是为了帮助调试。

我正在更改的特定列的默认值为 150,当我在 UI 中调整列的大小时,会调用此方法但宽度保持在相同的 150,进度条不会调整大小。仅当再次调整列大小时,宽度值现在才反映第一次调整大小后列的值,然后 ResizeProgressBar 方法正确更改 progbar 大小以填充它所在的列。这是连续的,宽度值似乎总是比实际值落后一步。

我会感谢任何帮助。干杯。

【问题讨论】:

    标签: c++ mfc event-handling clistctrl


    【解决方案1】:

    使用HDN_ENDTRACK本身提供给您的信息,即:

    void ProgListCtrl::OnEndTrack(NMHDR* pNMHDR, LRESULT* pResult)
    {
        NMHEADER *pHdr = (NMHEADER*) pNMHDR;
        if ((pHdr->iItem == m_nProgressColumn) &&
            (pHdr->pitem) &&
            (pHdr->pitem->mask & HDI_WIDTH))
        {
            int width = pHdr->pitem->cxy;
            ResizeProgressbar();
        }
    }
    

    或者,查看HDN_ITEMCHANGINGHDN_ITEMCHANGED 通知而不是HDN_ENDTRACK

    【讨论】:

    • HDN_ITEMCHANGED 工作!它不需要我更改消息映射以外的任何内容。感谢您的帮助!
    • NMHEADER 和 NMHDR 是两种不同的结构。你怎么能把一个扔给另一个? NMHDR 不指定强制转换运算符。
    • @SahilSingh 所有通过WM_NOTIFY 传递的结构都以NMHDR 字段开头。这在documentation 中有说明:“lParam:指向包含通知代码和附加信息的NMHDR 结构的指针。对于某些通知消息,此参数指向一个更大的结构,将NMHDR 结构作为其第一个成员" 指向第一个成员的指针也是指向整个结构的指针,因此只要您使用正确的结构,类型转换是安全的类型的演员。
    • @SahilSingh HDN_ENDTRACK 发送一个指向 NMHEADER 结构的 NMHDR 成员的指针,根据 documentation: "lParam: 指向NMHEADER 结构,其中包含有关标题控件和其分隔符被拖动的项目的信息。"
    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2015-07-24
    • 2021-05-21
    • 2013-05-05
    • 2014-03-15
    相关资源
    最近更新 更多