【MFC】设置CTreeCtrl单个节点的文字颜色

问题

功能调整需要依据不同状态设置树控件中单个节点的文字颜色。

分析

1、CTreeCtrl 本身有设置文字颜色的接口SetTextColor ,但是这个接口是设置树控件整体的文字颜色。

2、在自定义接口 可以对树控件单个节点进行更新文字颜色和背景颜色,接收自定义绘制消息NM_CUSTOMDRAW

解决

1、头文件中定义自定义绘制接口

cpp 复制代码
// .h 文件
//...
// 定义自定义绘制接口
afx_msg void OnNMCustomdrawTree(NMHDR *pNMHDR, LRESULT *pResult);

//...
// 定义树控件变量
CTreeCtrl                       m_treeList;

2、cpp文件中接收消息并实现接口

cpp 复制代码
// .cpp 文件

// 接收消息
BEGIN_MESSAGE_MAP(ModelTreeDlg, CDialogEx)
	//...
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_TREE_MODEL, &OnNMCustomdrawTreeModel)	
END_MESSAGE_MAP()
	

// 实现接口
void OnNMCustomdrawTreeModel(NMHDR* pNMHDR, LRESULT* pResult)
{
	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
    if (NULL == pLVCD)
    	return;
	*pResult = CDRF_DODEFAULT;
    *pResult |= CDRF_NOTIFYITEMDRAW;
    *pResult |= CDRF_NOTIFYSUBITEMDRAW;
    *pResult |= CDRF_NOTIFYPOSTPAINT;
    const DWORD dwDrawStage = pLVCD->nmcd.dwDrawStage;
    if (dwDrawStage != CDDS_ITEMPOSTPAINT || tree.m_bScolling)
    	return;
    // 获取树控件范围
    CRect treeRect;
    m_treeList.GetClientRect(treeRect);
    //界面重绘,树节点后添加图标
    HTREEITEM hItem = (HTREEITEM)pLVCD->nmcd.dwItemSpec;
    CRect textRect;
    if(tree.GetItemRect(hItem, &textRect, TRUE) == false)
    	return;
    //获取节点的文本文字
    CString txt = tree.GetItemText(hItem);
    CDC* pdc = CDC::FromHandle(pLVCD->nmcd.hdc);
    // 设置背景颜色
    pdc->FillSolidRect(&textRect, GetSysColor(COLOR_WINDOW));
    // 设置文字颜色,默认黑色,依据实体状态更新
    COLORREF color = RGB(255, 255, 255);
    color = GetSysColor(COLOR_WINDOWTEXT);
    pdc->SetTextColor(color);
    // 一定要调用 不然不会更新颜色显示
    pdc->TextOut(textRect.left + 2, textRect.top + 2, txt);
}

3、搞定!效果如下:

相关推荐
汉克老师7 小时前
CSP-J 初赛(以满分为目标):第二十七课 《图的遍历——BFS广度优先搜索——像“水波纹”一样,一层一层地搜索》
c++·csp-j·小学生·学c++编程
闻缺陷则喜何志丹7 小时前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
汉克老师8 小时前
CSP-J 初赛(以满分为目标):第二十六课 《图的遍历——DFS深度优先搜索——从“树的先序遍历”走进真正的图世界》
c++·csp-j·小学生·学c++编程
程序猿编码8 小时前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
影视飓风TIM8 小时前
C++哈希表深度剖析:冲突处理、rehash、迭代器与unordered容器封装
c++·哈希算法·散列表
C++ 老炮儿的技术栈9 小时前
Qt5 使用 QPainter 绘制阿基米德螺线
开发语言·c++·windows·qt·代码化
xxwxx__9 小时前
深入理解 C++ STL:stack、queue 与 deque 从使用到底层实现全解析
开发语言·c++·算法
wuminyu9 小时前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
郝学胜-神的一滴9 小时前
C++11 工程级应用 08:Lambda表达式与Tuple元组
开发语言·jvm·c++·python·程序人生·开源
水饺编程11 小时前
第5章,[Win32 章节] :圆角矩形教学插图绘制程序
c语言·c++·windows·visual studio