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

ops/2025/1/14 20:30:30/

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

分析
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.ppmy.cn/ops/150094.html

相关文章

16_Redis Lua脚本

Redis Lua脚本是Redis提供的一种强大的扩展机制。 1.Redis Lua脚本介绍 1.1 基本概念 Redis Lua脚本允许开发者将一段Lua语言编写的代码发送给Redis服务器执行。这项功能自Redis 2.6版本引入以来,为用户提供了强大的灵活性和扩展能力,使得可以在Redis内部直接处理复杂的业…

解锁企业数字化转型新力量:OpenCoze(开源扣子)

在当今数字化浪潮席卷之下&#xff0c;企业对于高效管理和协同运作的需求愈发迫切&#xff0c;而开源技术正逐渐成为众多企业破局的关键利器。今天&#xff0c;想给大家介绍一款极具潜力的开源项目 ——OpenCoze&#xff0c;中文名称 “开源扣子”。 一、OpenCoze 是什么&…

vscode支持ssh远程开发

文章目录 一、生成ssh使用的公钥/密钥对二、使用vscode通过ssh连接服务器1.安装插件2.配置文件3.连接服务器4.新建文件夹&#xff0c;存放不同的任务5.为不同的项目选择不同的conda环境 三、使用scp命令与服务器互传文件、文件夹1.检查Windows 系统是否支持scp命令2.在Windows系…

matlab函数讲解——randsample

在MATLAB中&#xff0c;randsample函数用于从一个给定的集合中随机选择样本。函数的基本用法是从指定范围内随机选择元素&#xff0c;具体用法如下&#xff1a; 用法 y randsample(n, k, true, w)参数说明 n: 整数&#xff0c;表示从1到n的集合中进行抽样。例如&#xff0c;…

MySQL表的增删改查(进阶)-上篇

目录 数据库约束 约束类型 NULL约束-非空约束 UNIQUE-唯一约束 DEFAULT-默认值约束 PRIMARY KEY-主键约束 FOREIGN KEY-外键约束 CHECK约束&#xff08;了解&#xff09; 表的设计 实体间的关系 数据库约束 数据库中的数据是如此重要&#xff0c;希望数据库里的数据&…

django在线考试系统

Django在线考试系统是一种基于Django框架开发的在线考试平台&#xff0c;它提供了完整的在线考试解决方案。 一、系统概述 Django在线考试系统旨在为用户提供便捷、高效的在线考试环境&#xff0c;满足教育机构、企业、个人等不同场景下的考试需求。通过该系统&#xff0c;用…

CentOS 和 Ubantu你该用哪个

文章目录 **一、CentOS 和 Ubuntu 的详细介绍****1. CentOS****1.1 基本信息****1.2 特点****1.3 缺点** **2. Ubuntu****2.1 基本信息****2.2 特点****2.3 缺点** **二、CentOS 和 Ubuntu 的异同****1. 相同点****2. 不同点****3. 使用体验对比** **三、总结和选择建议** Cent…

【Flink】flink或java异常日志输出不完整问题解决

flink或java异常日志输出不完整问题解决 1.问题 flink submit job&#xff0c;报错查看日志&#xff0c;只有Caused by: java.lang.ClassCastException&#xff0c;异常详情没有&#xff0c; 2.网上参考 参考了网上的几个解决方案&#xff0c;比较精准的如下&#xff1a; https…