C++ 调整列表列大小时HDN_ENDTRACK出现问题

C++ 调整列表列大小时HDN_ENDTRACK出现问题,c++,mfc,event-handling,clistctrl,C++,Mfc,Event Handling,Clistctrl,我在处理从CListCtrl派生的自定义类的HDN_ENDTRACKW消息时遇到了一点问题 从本质上讲,似乎在发送此消息时,存储列宽度的实际值在执行处理代码之后才会更新 句柄中的代码只是指示进度条调整大小,以填充调整大小的列的宽度。 守则: void ProgListCtrl::OnEndTrack(NMHDR* pNMHDR, LRESULT* pResult) { int width = ListView_GetColumnWidth(GetSafeHwnd(), m_nProgressC

我在处理从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大小以填充它所在的列。这是连续的,宽度值似乎总是比实际值落后一步


我非常感激任何帮助。干杯。

使用
HDN\u 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\u项目更改
HDN\u项目更改
通知,而不是
HDN\u尾迹
使用
HDN\u尾迹
本身提供给您的信息,即:

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\u项目更改
HDN\u项目更改
通知,而不是
HDN\u结束跟踪

HDN\u项目更改!除了消息映射之外,它不需要我做任何更改。谢谢你的帮助!NMHEADER和NMHDR是两种不同的结构。你怎么能把一个抛给另一个?NMHDR不指定强制转换运算符。@SahilSingh通过
WM\u NOTIFY
交付的所有结构都以
NMHDR
字段开始。这在“
lParam
:指向包含通知代码和附加信息的
NMHDR
结构的指针。对于某些通知消息,此参数指向将
NMHDR
结构作为其第一个成员的较大结构。”指向第一个成员的指针也是指向整个结构的指针,因此类型转换是安全的,只要您对转换使用正确的结构类型。@SahilSingh
HDN_ENDTRACK
将指针发送到
NMHEADER
结构的
NMHDR
成员,根据:“
lParam
:指向
NMHEADER
结构的指针,该结构包含有关头控件和其分隔符被拖动的项的信息。“HDN_成功了!除了消息映射之外,它不需要我做任何更改。谢谢你的帮助!NMHEADER和NMHDR是两种不同的结构。你怎么能把一个抛给另一个?NMHDR不指定强制转换运算符。@SahilSingh通过
WM\u NOTIFY
交付的所有结构都以
NMHDR
字段开始。这在“
lParam
:指向包含通知代码和附加信息的
NMHDR
结构的指针。对于某些通知消息,此参数指向将
NMHDR
结构作为其第一个成员的较大结构。”指向第一个成员的指针也是指向整个结构的指针,因此类型转换是安全的,只要您对转换使用正确的结构类型。@SahilSingh
HDN_ENDTRACK
将指针发送到
NMHEADER
结构的
NMHDR
成员,根据:“
lParam
:指向
NMHEADER
结构的指针,该结构包含有关header控件和其分隔符被拖动的项的信息。”