CTreectrl控件和CImageList的使用
树控件可以配上checkbox、icon和state icon,Overlay Image来实现其美观和状态表明。
其中icon为每一个item的图标,state icon顾名思义则是根据item的状态来变化的。
如图所示:


- 紧挨着item为item自有的icon。可以在选中、未选中时变化。
- 最左侧的为state icon,在状态变化时变化
- checkbox可看作state icon的一种,二者不能同时出现。
- checkbox必须在icon存在(即树控件有ImageList)的时候才能正确显示。
- overlay image覆盖的是icon
如何使用状态图标 或者 Overlay Image,调用关系如下图所示:

- 一个TreeCtrl首先和要一个ImageList结合起来,通过SetImageList
- 树的item有其自然的state
- ImageList有Normal和State两种。分别对应icon和state icon
- state用不同的位表示了不同的内容,因此需要mask来配合。
重点说明Mask的作用:Mask与其说是一个"面具",盖住了state里一部分的bit位,不如更说是一个点石成金的“金手指”,指向谁谁有效。
图中的红色矩形可以理解为一个MASK,其指向哪几位时,哪几们就变红(有效),表明当前设置的是哪个状态。
跟网络里的子网掩码一样。只有“有效”的IP位才用1,子网的都用0.二者做与运算……
一个具体的例子:
const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES |
TVS_LINESATROOT | TVS_HASBUTTONS |TVS_CHECKBOXES;
if (!m_wndTree.Create (dwViewStyle, rectDummy, this, 1))
{
TRACE0("Failed to create workspace view\n");
return -1; // fail to create
}
///////////////////////////////////////////////////////////////////////////////////////
//将Tree和ImageList结合
m_wndTree.SetImageList(&m_imglistTree,TVSIL_NORMAL);
m_wndTree.SetImageList(&m_imglistTree,TVSIL_STATE);
//给图像列表设置OverlayImage
//2为ImageList中index为2的图像,1为Overlay mask的index。从1开始。
m_imglistTree.SetOverlayImage(2,1);
// Setup trees content:
HTREEITEM hRoot1 = m_wndTree.InsertItem (_T("空间天气监控站"),0,0);
HTREEITEM hST1 = m_wndTree.InsertItem (_T("太阳射电望远镜观测站"), 0, 1, hRoot1);
HTREEITEM hST1_01 = m_wndTree.InsertItem(_T("SMT-01"),0,1, hST1);
m_wndTree.InsertItem(_T("SMT-02"),0,1, hST1);
m_wndTree.InsertItem(_T("SMT-03"),0,1, hST1);
m_wndTree.InsertItem(_T("SMT-04"), 0,1,hST1);
//将第一组的第一个站点的观测设备图标用Overlay Image覆盖,
//表示该设备状态异常
//同时将其父结点的图像用Overlay Image覆盖,表示该组有导演设备
m_wndTree.SetItemState(hST1_01,TVIS_OVERLAYMASK,INDEXTOOVERLAYMASK(1));
m_wndTree.SetItemState(hST1,TVIS_OVERLAYMASK,INDEXTOOVERLAYMASK(1));
浙公网安备 33010602011771号