(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;
}
}
}
它正在发挥作用,但对于一项简单的任务而言似乎有点过分了。
我认为我必须遗漏一些显而易见的事情而不必这样做。
更简单吗?
感谢。
答案 0 :(得分:4)
除了您已经完成的自定义绘图之外,您还可以为所有选定项目设置TVIS_DROPHILITED状态。但我不确定这是否真的是你想要的,特别是如果你的树控制也是一个放弃目标。
您还可以尝试将树控件的主题设置为资源管理器:
SetWindowTheme(hTreeControl, L"Explorer", NULL);
这使得树控件看起来与Windows资源管理器中的颜色相同。也许那些更符合你的喜好。
答案 1 :(得分:2)
您可以使用SetItemState和TVIS_BOLD将所选项目的文字设置为粗体。你不需要自定义绘图,而且代码总是更好。
答案 2 :(得分:0)
你可以用pcd-> nmcd.uItemState&替换this-> isSelected。 CDIS_SELECTED
答案 3 :(得分:0)
原始投递中缺少的一个小细节是自定义OnCustomDraw处理程序的消息映射项是:
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
对Max提供OnCustomDraw实现表示敬意。