VC修改树控件的item颜色且使其被选中的item在失去焦点后保持高亮显示

我们在Windows桌面开发中使用树控件,可能会用到修改item的文字颜色和背景颜色,要做到这一点,原理是为每一个item设置它的TVITEM结构体的lParam值,之后在父窗口类的消息映射ON_NOTIFY(NM_CUSTOMDRAW...的函数中实现具体绘制,绘制时LPNMTVCUSTOMDRAW->nmcd.lItemlParam知道是哪一个item,为它设置具体的颜色。可参考这篇文章:

VC++ 中如何更改Tree Control控件中节点的背景色和节点文字的颜色_tipler的博客-CSDN博客

但我这里,要记录的是VC中树控件的一个问题:当树控件的某一项被选中后,会高亮显示,如果这时候树控件失去焦点,这个高亮的显示就会消失,而呈现出灰色,这是VC中树控件的默认行为。可很多时候我们不希望它呈现灰色,而是一直保持高亮显示,该怎么做?处理方法还是和上面提到的一样,下面贴出示例代码:

//在头文件的类声明中添加下面一行
afx_msg void OnCustomdrawNavigationBar(NMHDR *pNMHDR, LRESULT *pResult);

//添加消息映射
ON_NOTIFY(NM_CUSTOMDRAW, IDC_NAVIGATION_BAR, &CFrameWindow::OnCustomdrawNavigationBar)


//消息映射函数的实现
void CFrameWindow::OnCustomdrawNavigationBar(NMHDR *pNMHDR, LRESULT *pResult)
{
	NMTVCUSTOMDRAW *pTVCD = reinterpret_cast<NMTVCUSTOMDRAW *>(pNMHDR);
	
	// TODO: 在此添加控件通知处理程序代码
	*pResult = CDRF_DODEFAULT;

	if (CDDS_PREPAINT == pTVCD->nmcd.dwDrawStage)
	{
		*pResult = CDRF_NOTIFYITEMDRAW;
	}
	else if (CDDS_ITEMPREPAINT & pTVCD->nmcd.dwDrawStage)
	{
		COLORREF clrWhite, crlBlue;
		clrWhite = RGB(255, 255, 255);
		crlBlue = RGB(0, 120, 215);

		HTREEITEM selectedItem = navigation_bar.GetSelectedItem();

		//if (pTVCD->nmcd.uItemState & CDIS_SELECTED)
		if (selectedItem == (HTREEITEM)pTVCD->nmcd.dwItemSpec)
		{
			pTVCD->clrText = clrWhite;
			pTVCD->clrTextBk = crlBlue;
		}
		else
		{
			pTVCD->clrText = crlBlue;
			pTVCD->clrTextBk = clrWhite;
		}

		*pResult = CDRF_DODEFAULT;
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值