//首先,在界面中拉进一个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();//删除所有节点