CTreeCtrl

61 篇文章 4 订阅

//首先,在界面中拉进一个Tree ConTrol控件

//插入根节点

CString first = "第一章";

CTreeCtrl *pCTrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);

HTREEITEM hFirst = pCTrl->InsertItem(first);

/*HTREEITEM hFirst = pCTrl->InsertItem(first,TVI_ROOT,TVI_LAST);*/    //上一句相当于这一句


//添加hFirst节点的孩子节点,并且被添加的节点位于hFirst所有孩子节点的末尾

HTREEITEM hSecond;
hSecond = pCTrl->InsertItem(second1, hFirst);

/*hSecond = pCTrl->InsertItem(second1, hFirst,TVI_LAST);*/    //上一句相当于这一句


//以下为实例:

CString first = "第一章";
CString second1 = "第一节";
CString second2 = "第二节";
CString second3 = "第三节";
CString third1 = "一、绪论";
CString third2 = "二、背景";
CString third3 = "三、资料";
CTreeCtrl *pCTrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
HTREEITEM hFirst = pCTrl->InsertItem(first);


HTREEITEM hSecond;


hSecond = pCTrl->InsertItem(second1, hFirst);
HTREEITEM hThird1;
hThird1 = pCTrl->InsertItem(third1, hSecond);
hThird1 = pCTrl->InsertItem(third2, hSecond);
hThird1 = pCTrl->InsertItem(third3, hSecond);


hSecond = pCTrl->InsertItem(second2, hFirst);
HTREEITEM hThird2;
hThird2 = pCTrl->InsertItem(third1, hSecond);
hThird2 = pCTrl->InsertItem(third2, hSecond);
hThird2 = pCTrl->InsertItem(third3, hSecond);


hSecond = pCTrl->InsertItem(second3, hFirst);
HTREEITEM hThird3;
hThird3 = pCTrl->InsertItem(third1, hSecond);
hThird3 = pCTrl->InsertItem(third2, hSecond);
hThird3 = pCTrl->InsertItem(third3, hSecond);

//打开各节点后显示:

//第一章

//    第一节

//        一、绪论

//        二、背景

//        三、资料

//    第二节

//        一、绪论

//        二、背景

//        三、资料

//    第三节

//        一、绪论

//        二、背景

//        三、资料



if(pCTrl->ItemHasChildren(hFirst))                             //判断hFirst节点是否有孩子节点
pCTrl->Expand(hFirst,TVE_EXPAND);        //有孩子节点则展开


CString str;
str = pCTrl->GetItemText(hFirst); //获取节点文本
TRACE(str + "\n"); //输出第一章

pCTrl->SetItemText(hFirst, "new"); //设置节点文本,将原本写着“第一章”的节点的文本改为“new”


//这三行可设置节点文本可编辑,但是编辑后保存不了,需要加一个按回车结束编辑的函数。

long lStyle=::GetWindowLong(pCTrl->GetSafeHwnd(), GWL_STYLE);  
lStyle|=TVS_EDITLABELS;  
::SetWindowLong(pCTrl->GetSafeHwnd(), GWL_STYLE, lStyle);


//pCTrl->ModifyStyle(0,TVS_EDITLABELS); //作用同上三行。


BOOL CCTreeCtrlDlg::PreTranslateMessage(MSG* pMsg)  //自定义函数。功能:编辑节点文本时,按回车结束编辑。
{
CTreeCtrl *pCTrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
    if(pMsg->message == WM_KEYDOWN)  
    {
        if(pMsg->wParam == VK_RETURN)  
        {
CString str;
CEdit * pLableEdit = pCTrl->GetEditControl();
pLableEdit->GetWindowText(str);
TRACE(str + "\n");
HTREEITEM item = pCTrl->GetSelectedItem();
pCTrl->SetItemText(item, str);
            if(pLableEdit && pLableEdit->IsWindowVisible())
            {
                this->SetFocus(); //编辑框失去焦点,结束编辑,从而进入TVN_ENDLABELEDIT 处理  
                return TRUE;  
            }
        }  
    }  
    return CDialog::PreTranslateMessage(pMsg);
}


void Cmission2_720Dlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult)//双击时触发
{
// TODO: 在此添加控件通知处理程序代码

//双击一个节点,获取该节点名并输出
CTreeCtrl *pCTrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
HTREEITEM item = pCTrl->GetSelectedItem();
CString strText= pCTrl->GetItemText(item);
afxDump<<strText;

*pResult = 0;
}


void CCTreeCtrlDlg::OnNMRClickTree1(NMHDR *pNMHDR, LRESULT *pResult) //右键单击CTreeCtrl控件时触发
{//以下代码实际效果是:右键选中某个节点时会弹出菜单,右键没选中节点时则不会弹出菜单。右键点击某个节点时,光标会跟到该节点上。

CTreeCtrl *pCTrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
CPoint point(GetMessagePos());
    unsigned int nFlags = 0;
 
    pCTrl->ScreenToClient(&point);
    HTREEITEM hItem = pCTrl->HitTest(point,&nFlags);
    if  ((nFlags& TVHT_ONITEM) &&(hItem!=NULL))
    {
       pCTrl->SetFocus();
       pCTrl->SelectItem(hItem);
       CMenu MyMenu;
       MyMenu.LoadMenu(IDR_MENU1);//加载菜单资源
       CMenu* popup = MyMenu.GetSubMenu(0);
       GetCursorPos(&point);//获取当前光标的位置,以便使得菜单可以跟随光标这里也可以用pCTrl->ClientToScreen(&point);
       popup->TrackPopupMenu(TPM_LEFTBUTTON|TPM_LEFTALIGN,point.x,point.y,this);
    }
}


void Cmission2_720Dlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)//改变所选择的节点时触发

void Cmission2_720Dlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)//单击时触发


CTreeCtrl *pCTrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
HTREEITEM item = pCTrl->GetSelectedItem();
pCTrl->DeleteItem(item);//删除节点


CTreeCtrl *pCTrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
pCTrl->DeleteAllItems();//删除所有节点

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值