【问题标题】:Changing the color of a selected CTreeCtrl item?更改选定 CTreeCtrl 项的颜色?
【发布时间】:2011-01-08 08:22:45
【问题描述】:

(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;
        }
    }
}

它正在工作,但对于这样一个简单的任务来说似乎有点过头了。

我认为我必须遗漏一些明显的东西才能做到这一点而不必这样做。

还有更简单的吗?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    您可以使用SetItemStateTVIS_BOLD 将所选项目的文本设置为粗体。您不需要为此进行自定义绘制,而且代码越少越好。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        您可以将 this->isSelected 替换为 pcd->nmcd.uItemState & CDIS_SELECTED

        【讨论】:

          【解决方案4】:

          原始帖子中缺少的一个小细节是自定义 OnCustomDraw 处理程序的消息映射条目是:

          ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
          

          感谢 Max 提供 OnCustomDraw 实现。

          【讨论】:

            猜你喜欢
            • 2023-03-26
            • 2013-09-25
            • 2017-04-24
            • 1970-01-01
            • 1970-01-01
            • 2013-11-22
            • 2019-07-14
            • 1970-01-01
            • 2011-12-06
            相关资源
            最近更新 更多