处理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
相关产品推荐
相关产品推荐

