树展控件CTreeCtrl的遍历与状态(check)检查

需要完成功能:根据用户的选择来安排几画面显示。

遍历:用递归来完成。

状态检验:GetCheck()

1.首先定义递归函数,对每个叶结点进行检验,若被选中,则记录变量自加1.

int CMainFrame::TreeTravesal(HTREEITEM hStart)
{
	HTREEITEM hChildItem = NULL;
	AfxMessageBox(m_wndChannelBrowser.m_wndTree.GetItemText(hStart));
	if (m_wndChannelBrowser.m_wndTree.ItemHasChildren(hStart))
	{
	   hChildItem = m_wndChannelBrowser.m_wndTree.GetChildItem(hStart);
		while(hChildItem!=NULL)
		{
			TreeTravesal(hChildItem); //递归遍历孩子节点   
			hChildItem =m_wndChannelBrowser.m_wndTree.GetNextItem(hChildItem, TVGN_NEXT);   
		}   
	}
	else 
	{
		if(m_wndChannelBrowser.m_wndTree.GetCheck(hStart))
		{
			m_nNumOfCheckedTreeItem++;
		}
	}
	return m_nNumOfCheckedTreeItem;
}

  2.菜单项(播放选中视频)的响应函数:

void CMainFrame::OnPlaySelected()
{
	// TODO: 在此添加命令处理程序代码
	m_nNumOfCheckedTreeItem = 0; //先将计数清零
	HTREEITEM hItem = m_wndChannelBrowser.m_wndTree.GetRootItem();

	int i = 0;	
	i = TreeTravesal(hItem);//得到当前选中的通道数目。

        //在MainFrame里得到View的指针
	CFrameWnd*   pActiveFrame=GetActiveFrame();
	CMSVideoMonitorView*   pView=(CMSVideoMonitorView*)(pActiveFrame->GetActiveView());

	//按照i的值来安排画面为几通道
	if (i == 0) //没有选择
	{
		MessageBox(_T("没有选定通道!"));
	}
	else if (i == 1)//一通道
	{
		pView->OnArrangeScreen(32860);
	}

  ......

}

  

其中:

  • 在MainFrame里得到View的指针的方法需要注意

  CFrameWnd*   pActiveFrame=GetActiveFrame();
  CMSVideoMonitorView*   pView=(CMSVideoMonitorView*)(pActiveFrame->GetActiveView());
  这是一种常用的方法,适合MDI和SDI(未验证)程序。

  • 递归算法需要理解。

posted on 2011-08-29 18:06  LateStop  阅读(3965)  评论(0)    收藏  举报

导航