当前位置: 首页 > article >正文

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

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

分析
1、CTreeCtrl本身有设置文字颜色的接口SetTextColor,但是这个接口是设置树控件整体的文字颜色。
2、在自定义接口可以对树控件单个节点进行更新文字颜色和背景颜色,接收自定义绘制消息NM_CUSTOMDRAW

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

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

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

2、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、搞定!效果如下:
在这里插入图片描述


http://www.kler.cn/a/488678.html

相关文章:

  • Ubuntu20.04中EasyConnect启动报错
  • 从阿拉伯数字看大端小端字节序
  • 设计模式 行为型 责任链模式(Chain of Responsibility Pattern)与 常见技术框架应用 解析
  • 在Java中实现集合排序
  • 1. npm 常用命令详解
  • java1-相对路径与绝对路径
  • Jenkins git SSH获取code报错:git@github.com: Permission denied (publickey).
  • 计算机网络 (33)传输控制协议TCP概述
  • 【HTML+CSS+JS+VUE】web前端教程-18-css引入方式
  • 2025年第三届“华数杯”国际赛B题解题思路与代码(Matlab版)
  • 网络安全测评技术与标准
  • LeetCode:2274. 不含特殊楼层的最大连续楼层数(排序 Java)
  • smplx blender插件笔记
  • 甘蔗叶片图像元素含量的回归预测多模型实现【含私人数据集】
  • Windows 程序设计2:第一个Windows实例程序
  • 什么是数据湖?大数据架构的未来趋势
  • C++ 中的 template <typename T> 用法 ← 泛型
  • 【UE5 C++课程系列笔记】23——多线程基础——AsyncTask
  • vscode开启调试模式,结合Delve调试器调试golang项目详细步骤
  • 每日算法Day14【删除二叉搜索树中的节点、修剪二叉搜索树、将有序数组转换为二叉搜索树、把二叉搜索树转换为累加树】
  • PHP 循环控制结构深度剖析:从基础到实战应用
  • 后端技术选型 sa-token校验学习 上 登录校验复习
  • 【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
  • 从企业级 RAG 到 AI Assistant , Elasticsearch AI 搜索技术实践
  • STM32 中的 CRH 和 CRL 寄存器
  • React+css+切换主题色