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

相关推荐
派阿喵搞电子39 分钟前
在UI界面内修改了对象名,在#include “ui_mainwindow.h“没更新
c++·qt·ubuntu·ui
C++ 老炮儿的技术栈2 小时前
UDP 与 TCP 的区别是什么?
开发语言·c++·windows·算法·visual studio
mochensage3 小时前
CSP信奥赛C++常用系统函数汇总
c++·信奥
mochensage3 小时前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
fpcc3 小时前
跟我学c++中级篇——多线程中的文件处理
c++
5:004 小时前
云备份项目
linux·开发语言·c++
乄夜5 小时前
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
c语言·c++·单片机·嵌入式硬件·物联网·面试·职场和发展
YYDS3145 小时前
C++动态规划-01背包
开发语言·c++·动态规划
wydaicls6 小时前
十一.C++ 类 -- 面向对象思想
开发语言·c++
姜君竹6 小时前
QT的工程文件.pro文件
开发语言·c++·qt·系统架构