更改所选CTreeCtrl项目的颜色?

时间:2010-01-22 19:03:15

标签: visual-studio-2008 user-interface mfc

(VS2008,MFC,功能包)

使用CTreeCtrl,当控件失去焦点时,我需要突出显示所选项目“更好”。

我的树是在资源编辑器中使用“TVS_SHOWSELALWAYS”选项创建的,但颜色不够明显。

我已经有代码通过自定义绘制消息(NM_CUSTOMDRAW)更改项目颜色,如下所示:

void MyTree::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NMTVCUSTOMDRAW *pcd = (NMTVCUSTOMDRAW   *)pNMHDR;
    switch ( pcd->nmcd.dwDrawStage )
    {
    case CDDS_PREPAINT: 
        *pResult = CDRF_NOTIFYITEMDRAW;     
        break;

    case CDDS_ITEMPREPAINT : 
        {
            HTREEITEM   hItem = (HTREEITEM)pcd->nmcd.dwItemSpec;

            if ( this->IsSelected(hItem ))
            {
                pcd->clrText = GetSysColor(COLOR_HIGHLIGHTTEXT);    
                pcd->clrTextBk = GetSysColor(COLOR_HIGHLIGHT);
            }

            *pResult = CDRF_DODEFAULT;// do not set *pResult = CDRF_SKIPDEFAULT
            break;
        }
    }
}

它正在发挥作用,但对于一项简单的任务而言似乎有点过分了。

我认为我必须遗漏一些显而易见的事情而不必这样做。

更简单吗?

感谢。

4 个答案:

答案 0 :(得分:4)

除了您已经完成的自定义绘图之外,您还可以为所有选定项目设置TVIS_DROPHILITED状态。但我不确定这是否真的是你想要的,特别是如果你的树控制也是一个放弃目标。

您还可以尝试将树控件的主题设置为资源管理器:

SetWindowTheme(hTreeControl, L"Explorer", NULL);

这使得树控件看起来与Windows资源管理器中的颜色相同。也许那些更符合你的喜好。

答案 1 :(得分:2)

您可以使用SetItemStateTVIS_BOLD将所选项目的文字设置为粗体。你不需要自定义绘图,而且代码总是更好。

答案 2 :(得分:0)

你可以用pcd-> nmcd.uItemState&替换this-> isSelected。 CDIS_SELECTED

答案 3 :(得分:0)

原始投递中缺少的一个小细节是自定义OnCustomDraw处理程序的消息映射项是:

ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)

对Max提供OnCustomDraw实现表示敬意。