You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理WM_NOTIFY/NM_CUSTOMDRAW时,如何获取TreeView当前绘制项的文本?

在TreeView的NM_CUSTOMDRAW消息中获取当前绘制项的文本

当然可以获取,具体实现步骤如下:

  • 处理NM_CUSTOMDRAW消息时,先将传入的NMHDR指针转换为NMTVCUSTOMDRAW类型指针——TreeView的自定义绘制消息携带的是这个结构体:
    LPNMTVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMTVCUSTOMDRAW>(pNMHDR);
    
  • 从pNMCD->nmcd.itemSpec提取当前绘制项的HTREEITEM句柄。
  • 通过TreeView_GetItemText宏或直接发送TVM_GETITEM消息获取项文本,注意提前准备足够大小的缓冲区存储内容。

示例代码(C++)

case NM_CUSTOMDRAW:
{
    LPNMTVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMTVCUSTOMDRAW>(pNMHDR);
    // 针对项绘制前的阶段处理
    if (pNMCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
    {
        HTREEITEM hItem = static_cast<HTREEITEM>(pNMCD->nmcd.itemSpec);
        TCHAR szText[256] = {0};
        TVITEM tvItem = {0};
        tvItem.mask = TVIF_TEXT;
        tvItem.hItem = hItem;
        tvItem.pszText = szText;
        tvItem.cchTextMax = _countof(szText);
        
        // 获取当前项文本
        TreeView_GetItem(pNMCD->nmcd.hdr.hwndFrom, &tvItem);
        
        // 此时szText即为当前绘制项的文本,可用于自定义绘制逻辑
        // ...
    }
    return CDRF_DODEFAULT;
}

如果不确定文本长度,可先获取所需缓冲区大小再动态分配内存:

HTREEITEM hItem = static_cast<HTREEITEM>(pNMCD->nmcd.itemSpec);
TVITEM tvItem = {0};
tvItem.mask = TVIF_TEXT;
tvItem.hItem = hItem;
tvItem.pszText = nullptr;
tvItem.cchTextMax = 0;
TreeView_GetItem(pNMCD->nmcd.hdr.hwndFrom, &tvItem);

int textLen = tvItem.cchTextMax;
TCHAR* pText = new TCHAR[textLen + 1];
tvItem.pszText = pText;
tvItem.cchTextMax = textLen + 1;
TreeView_GetItem(pNMCD->nmcd.hdr.hwndFrom, &tvItem);

// 使用pText进行后续操作
// ...

delete[] pText;

内容的提问来源于stack exchange,提问作者user3161924

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:01:22