CTreectrl控件和CImageList的使用

树控件可以配上checkboxiconstate iconOverlay 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));

  

posted on 2011-09-06 18:51  LateStop  阅读(2622)  评论(0)    收藏  举报

导航