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

相关推荐
汉汉汉汉汉3 小时前
C++中的继承:从基础到复杂
c++
科大饭桶3 小时前
Linux系统编程Day9 -- gdb (linux)和lldb(macOS)调试工具
linux·服务器·c语言·c++
黑色的山岗在沉睡3 小时前
【无标题】
数据结构·c++·算法·图论
2301_785038184 小时前
c++初学day1(类比C语言进行举例,具体原理等到学到更深层的东西再进行解析)
c语言·c++·算法
Dream it possible!5 小时前
LeetCode 面试经典 150_数组/字符串_加油站(14_134_C++_中等)(贪心算法)
c++·leetcode·面试
EnzoRay5 小时前
C++(一)
c++
啊阿狸不会拉杆6 小时前
《算法导论》第 12 章 - 二叉搜索树
数据结构·c++·算法·排序算法
aluluka7 小时前
Emacs 折腾日记(二十九)—— 打造C++ IDE
c++·ide·emacs
岁忧13 小时前
(nice!!!)(LeetCode 每日一题) 3363. 最多可收集的水果数目 (深度优先搜索dfs)
java·c++·算法·leetcode·go·深度优先
略无慕艳意15 小时前
Notes of Effective CMake
c++·c·cmake