【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、搞定!效果如下:

相关推荐
2401_84149564几秒前
【数据结构】基于Floyd算法的最短路径求解
java·数据结构·c++·python·算法··floyd
纵有疾風起1 小时前
C++模版:模板初阶及STL简介
开发语言·c++·经验分享·开源
QT 小鲜肉1 小时前
【个人成长笔记】Qt Creator快捷键终极指南:从入门到精通
开发语言·c++·笔记·qt·学习·学习方法
勇闯逆流河1 小时前
【C++】用红黑树封装map与set
java·开发语言·数据结构·c++
实心儿儿1 小时前
C++——内存管理
c++
山,离天三尺三1 小时前
深度拷贝详解
开发语言·c++·算法
我狸才不是赔钱货2 小时前
容器:软件世界的标准集装箱
linux·运维·c++·docker·容器
云知谷2 小时前
【嵌入式基本功】单片机嵌入式学习路线
linux·c语言·c++·单片机·嵌入式硬件
kk”3 小时前
C++ stack 和 queue
开发语言·c++
给大佬递杯卡布奇诺3 小时前
FFmpeg 基本API avcodec_send_packet函数内部调用流程分析
c++·ffmpeg·音视频