MFC之CTreeCtrl

需求:点击左侧树,右侧根据点击的对象显示对应的窗口,如果选择叶子节点的话,右侧直接显示叶子所在位置

.h文件里

public: CTreeCtrl m_tabTree;  //声明这个树

protected CDevInfo *m_devInfo;  //声明右侧要显示的dialog类型的窗口

初始化树,给树添加数据

HTREEITEM hRoot;
    hRoot = m_tabTree.InsertItem(getStringTab(IDS_ROOT_MOBILE_INFO), TVI_ROOT, TVI_LAST);  
    m_tabTree.InsertItem(getStringTab(IDS_ITEM_DEV_PARM), hRoot, TVI_LAST);
    m_tabTree.InsertItem(getStringTab(IDS_ITEM_SECURITY_PARM), hRoot, TVI_LAST);
    m_tabTree.InsertItem(getStringTab(IDS_ITEM_DEV_MANAGE), hRoot, TVI_LAST);
    m_tabTree.Expand(hRoot, TVE_EXPAND);

初始化右边的窗口

    CRect rc;
    int dlg_width;
    int dlg_height;

    GetClientRect(rc);
    dlg_width = rc.right - 500- 20;  //自己调的位置
    dlg_height = rc.bottom -  10;   //自己调的位置
    if (m_devInfo == NULL)
    {
        m_devInfo = new CDevInfo(this);

        m_devInfo->Create(IDD_DEV_INFO_CFG,this);
    }
    m_devInfo->SetWindowPos(NULL,165,20,dlg_width,dlg_height,SWP_NOACTIVATE);//设置窗口的位置

重写树的 OnNMClickTree方法,**为什么不用OnTvnSelchangedTree**,因为这个方法只有在树的节点改变才会被调用,就是当左侧选中要看的树节点后,在窗口处滚动屏幕,把目标滚出视野,再去点击左侧的同一个树节点,界面上会没有反应。

void CCarCpsDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: 在此添加控件通知处理程序代码
    TRACE(" OnNMClickTree   \r\n");
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    *pResult = 0;
    CString      itemname;
    CString      parentname;
    CPoint pt;
    GetCursorPos(&pt);
    m_tabTree.ScreenToClient(&pt);
    UINT uFlags;
    HTREEITEM hitem = m_tabTree.HitTest(pt, &uFlags);   //这里获取所点击的项必须用这个方法,否则达不到我们想要的效果
    HTREEITEM    parentitem = m_tabTree.GetParentItem(hitem);
    parentname = m_tabTree.GetItemText(parentitem);
    itemname = m_tabTree.GetItemText(hitem);

if (itemname == getStringTab(IDS_ROOT_MOBILE_INFO)
  )  {
        ShowDlg(itemname, _T(""));

        return;
    }

    if (parentname == getStringTab(IDS_ROOT_MOBILE_INFO)
     )  {
        ShowDlg(parentname, itemname);
    }

 

}

 

void CCarCpsDlg::ShowDlg(CString Name, CString ChildName) {

    if (Name == getStringTab(IDS_ROOT_MOBILE_INFO))
    {
        m_devInfo->ShowWindow(TRUE);
        m_devInfo->ShowSelectTab(ChildName);
    }

}

最后去CDevInfo里面实现一下ShowSelectTab方法

void CDevInfo::ShowSelectTab(CString childName) {
    SCROLLINFO scrollinfo;
    GetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);

    RECT rectCtr;


    if (childName == getStringTab(IDS_ITEM_DEV_PARM))
    {
        ScrollWindow(0, (scrollinfo.nPos - scrollinfo.nMin) * 10 - 300);//这个300是自己调的值,正好使屏幕滚动到指定位置
        scrollinfo.nPos = scrollinfo.nMin +30 ;
        SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
    }

}

至此,就实现了点击树,能显示对应的界面并定位到对应的位置。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值