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

标签 c++ mfc event-handling clistctrl

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

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

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

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

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

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

如果有任何帮助,我将不胜感激。干杯。

最佳答案

使用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

关于c++ - 调整列表列大小时 HDN_ENDTRACK 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1426665/

相关文章:

c++ - 使用 Regex 更改大量代码

使用枚举类的 C++11 标准符合位掩码

c++ - MFC创建不失去焦点的无模式对话框

event-handling - 我应该为 Pub 和 Sub 与 Redis 使用单独的连接吗?

python - Monocle 是否使用了事件驱动编程的错误示例?

c++ - 测试用例 VS ASSERTION 语句

c++ - 将双数组转换为 double 结构

MFC 设备上下文 SelectObject 绘制位图

c++ - CRichEditCtrl 作为语法高亮编程语言编辑器 : SetSelectionCharFormat, 撤消

c++ - 接收 COM 事件