我们在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;
}
}