树展控件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(未验证)程序。
- 递归算法需要理解。
浙公网安备 33010602011771号