百分求关于树型控件的代码,谢谢 要求树型控件的子项可以随意拖放,增减.而且可以保存.如果觉得分不够我可以再加,要不给个思路也可以,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 脱放功能void CTreeDemoDlg::OnBegindragTree1(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; *pResult = 0; CImageList* test; drag=pNMTreeView->itemNew.hItem; //从节点信息建立拖动的图像 test=m_tree.CreateDragImage(drag); //如果无法建立拖动的图像 if(test==NULL) return; test->BeginDrag(0,CPoint(0,0)); //IsDraging:开进行拖拽的标记 this->IsDraging=1; POINT pt=pNMTreeView->ptDrag; ClientToScreen(&pt); test->DragEnter(NULL,pt); //开始捕获鼠标 SetCapture();}void CTreeDemoDlg::OnMouseMove(UINT nFlags, CPoint point) { HTREEITEM tmp; UINT flag; if(this->IsDraging) { POINT pt=point; ClientToScreen(&pt); CImageList::DragMove(pt); //判断鼠标是否在节点区域 if((tmp=m_tree.HitTest(point,&flag))!=NULL) { //隐藏拖动图像 CImageList::DragShowNolock(0); //记录新的放置节点 m_tree.SelectDropTarget(tmp); drop=tmp; //显示拖动图像 CImageList::DragShowNolock(1); } } CDialog::OnMouseMove(nFlags, point);}void CTreeDemoDlg::OnLButtonUp(UINT nFlags, CPoint point) { //如果正在进行拖拽 if(this->IsDraging) { IsDraging=0; //解除在拖拽过程中对树的锁定,隐藏拖拽图像 CImageList::DragLeave(this); CImageList::EndDrag(); //结束鼠标捕获 ReleaseCapture(); m_tree.SelectDropTarget(NULL); //如果拖、放的节点一致 if(drag==drop) return; //展开目标节点 m_tree.Expand(drop,TVE_EXPAND); //设置新节点信息 TVINSERTSTRUCT temp; temp.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; temp.item.hItem=drag; temp.hParent=drop; temp.item.iImage=0;//正常图标 temp.item.iSelectedImage=1;//选中时图标 //设置节点标题 CString text=m_tree.GetItemText(drag); temp.item.cchTextMax=text.GetLength(); temp.item.pszText=text.LockBuffer(); //在目标节点下插入被拖动的节点 m_tree.InsertItem(&temp); //删除源节点 m_tree.DeleteItem(drag); } CDialog::OnLButtonUp(nFlags, point);}void CTreeDemoDlg::OnKeydownTree1(NMHDR* pNMHDR, LRESULT* pResult) { TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR; *pResult = 0; //如果正在进行拖拽 if(IsDraging) { //终止鼠标捕获 ReleaseCapture(); this->IsDraging=0; //清除拖动图像 m_tree.Invalidate(); }} 增减功能:void CTreeDemoDlg::OnDelnode() { //得到当前选择的节点 HTREEITEM item=m_tree.GetSelectedItem(); if(m_tree.ItemHasChildren(item)) if(MessageBox("该节点下还有其他子节点\r\n是否要删除?","确认",MB_YESNO)==IDNO) return; //删除节点 m_tree.DeleteItem(item);}void CTreeDemoDlg::OnAddnode() { //得到当前选择的节点 HTREEITEM item=m_tree.GetSelectedItem(); //在当前节点下增加子节点 m_tree.InsertItem("新增节点",0,1,item); } 对不起,这两天出差,上网不方便,没有看到。节点位置:一个节点由节点的父节点名,自身节点名组成(要求节点名不重复)在树上找到父节点,然后把当前节点挂上就行了。HTREEITEM hItem = m_tree.GetSelectedItem();//得到当前节点CString strItemText = m_TreeCtrl.GetItemText(hItem);//得到节点名称 BHO生成一个ie的子窗口 ActiveX控件中使用CreateOleObject创建其他COM对象时出错。请高手赐教。 线程中调用窗体控件为何需要激活? 动态链接库为什么不能加载? 请问SDK编程的好书(电子的更好,no money)?? 有没有什么文章介绍VC++对文件的操作 CRecordView的问题 从VC6.0转到VC.NET程序运行报错,急需解决!!!! 如何从进程句柄获取主窗口句柄? 怎样修改注册表? 一个关于View类的析构函数的问题! 一个关于gethostbyname的问题
void CTreeDemoDlg::OnBegindragTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
*pResult = 0;
CImageList* test;
drag=pNMTreeView->itemNew.hItem;
//从节点信息建立拖动的图像
test=m_tree.CreateDragImage(drag);
//如果无法建立拖动的图像
if(test==NULL)
return;
test->BeginDrag(0,CPoint(0,0));
//IsDraging:开进行拖拽的标记
this->IsDraging=1;
POINT pt=pNMTreeView->ptDrag;
ClientToScreen(&pt);
test->DragEnter(NULL,pt);
//开始捕获鼠标
SetCapture();
}void CTreeDemoDlg::OnMouseMove(UINT nFlags, CPoint point)
{
HTREEITEM tmp;
UINT flag;
if(this->IsDraging)
{
POINT pt=point;
ClientToScreen(&pt);
CImageList::DragMove(pt);
//判断鼠标是否在节点区域
if((tmp=m_tree.HitTest(point,&flag))!=NULL)
{
//隐藏拖动图像
CImageList::DragShowNolock(0);
//记录新的放置节点
m_tree.SelectDropTarget(tmp);
drop=tmp;
//显示拖动图像
CImageList::DragShowNolock(1);
}
}
CDialog::OnMouseMove(nFlags, point);
}void CTreeDemoDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
//如果正在进行拖拽
if(this->IsDraging)
{
IsDraging=0;
//解除在拖拽过程中对树的锁定,隐藏拖拽图像
CImageList::DragLeave(this);
CImageList::EndDrag();
//结束鼠标捕获
ReleaseCapture();
m_tree.SelectDropTarget(NULL);
//如果拖、放的节点一致
if(drag==drop)
return;
//展开目标节点
m_tree.Expand(drop,TVE_EXPAND);
//设置新节点信息
TVINSERTSTRUCT temp;
temp.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
temp.item.hItem=drag;
temp.hParent=drop;
temp.item.iImage=0;//正常图标
temp.item.iSelectedImage=1;//选中时图标
//设置节点标题
CString text=m_tree.GetItemText(drag);
temp.item.cchTextMax=text.GetLength();
temp.item.pszText=text.LockBuffer();
//在目标节点下插入被拖动的节点
m_tree.InsertItem(&temp);
//删除源节点
m_tree.DeleteItem(drag);
}
CDialog::OnLButtonUp(nFlags, point);
}void CTreeDemoDlg::OnKeydownTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
*pResult = 0;
//如果正在进行拖拽
if(IsDraging)
{
//终止鼠标捕获
ReleaseCapture();
this->IsDraging=0;
//清除拖动图像
m_tree.Invalidate();
}
}
void CTreeDemoDlg::OnDelnode()
{
//得到当前选择的节点
HTREEITEM item=m_tree.GetSelectedItem();
if(m_tree.ItemHasChildren(item))
if(MessageBox("该节点下还有其他子节点\r\n是否要删除?","确认",MB_YESNO)==IDNO)
return;
//删除节点
m_tree.DeleteItem(item);
}
void CTreeDemoDlg::OnAddnode()
{
//得到当前选择的节点
HTREEITEM item=m_tree.GetSelectedItem();
//在当前节点下增加子节点
m_tree.InsertItem("新增节点",0,1,item);
}
节点位置:一个节点由节点的父节点名,自身节点名组成(要求节点名不重复)
在树上找到父节点,然后把当前节点挂上就行了。
HTREEITEM hItem = m_tree.GetSelectedItem();//得到当前节点
CString strItemText = m_TreeCtrl.GetItemText(hItem);//得到节点名称