修改树状控件TreeCtrl的节点名称

本文介绍了如何在MFC中实现TreeCtrl控件的节点名称修改功能,包括开始和结束编辑的处理,防止重复数据的检查,以及对特定节点编辑的限制。同时,还提供了对回车和Esc键的响应处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// PMAgentManageDlg.h
HTREEITEM FindItem(HTREEITEM item,CString strText);
BOOL IsTreeCtrlEditMessage(WPARAM KeyCode); 

virtual void OnOK(); 
virtual void OnCancel(); 
afx_msg void OnMenuitemRevise(NMHDR *pNMHDR,LRESULT *pResult);  //点击修改按钮激活函数
afx_msg void OnBeginlabeleditTree1(NMHDR* pNMHDR, LRESULT* pResult);  //开始编辑
afx_msg void OnEndlabeleditTree1(NMHDR* pNMHDR, LRESULT* pResult);   //结束编辑




 

// PMAgentManageDlg.cpp
ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE, OnBeginlabeleditTree1)  //消息映射
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE, OnEndlabeleditTree1)    //消息映射



//点击修改信息
void CPMAgentManageDlg::OnMenuitemRevise(NMHDR *pNMHDR,LRESULT *pResult) 
{
	// TODO: Add your command handler code here
	UpdateData(true);
	//CString str;
	g_sSelectStr =m_TreeCtrl.GetItemText(m_TreeCtrl.GetSelectedItem());
	//取出strName前4个汉字CString strName;
	char cTem[100],cDest[100];
	strcpy(cTem,g_sSelectStr);
	char *sTem = cTem;
	memcpy(cDest,sTem,8);
	cDest[8]='\0';
	string sCompare;
	sCompare=cDest;
	if ( (sCompare == "矩阵状态") || (sCompare =="平台状态") || (sCompare =="创建时间") )
	{
		MessageBox("此条信息禁止手动修改!");
		return;
	}
	else
	{
		m_TreeCtrl.ModifyStyle(NULL,TVS_EDITLABELS);      //设置编辑风格
		HTREEITEM hItem=m_TreeCtrl.GetSelectedItem();
		m_TreeCtrl.EditLabel(hItem);	
	}
}

void CPMAgentManageDlg::OnBeginlabeleditTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{	
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
	// TODO: Add your control notification handler code here
	m_TreeCtrl.GetEditControl()->LimitText(1024);
	*pResult = 0;
}

void CPMAgentManageDlg::OnEndlabeleditTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{	
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
	// TODO: Add your control notification handler code here
	HTREEITEM m_hInsertItem;
	CString strName; //修改后的数据
	m_TreeCtrl.GetEditControl()->GetWindowText(strName);
	if (strName.IsEmpty())
	{
		MessageBox("数据项名称不能为空,请重新输入!");
		CEdit *pEdit = m_TreeCtrl.EditLabel(m_hInsertItem);
		return;
	}
	if (strName == g_sSelectStr)
	{
		return;
	}
 	HTREEITEM hRoot = m_TreeCtrl.GetRootItem();
 	HTREEITEM hFind = FindItem(hRoot,strName);          //判断数据是否相同
	if (hFind == NULL)
	{
		char msg[64]={0};
		sprintf(msg,"修改信息为%s,确定吗?",strName);
		if (MessageBox(msg,"提示",MB_OKCANCEL) == IDOK)
		{
			CString strText;
			m_TreeCtrl.GetEditControl()->GetWindowText(strText.GetBuffer(200),200);
			m_TreeCtrl.SetItemText(m_TreeCtrl.GetSelectedItem(),strText);//设置编辑后的文本为结点
			*pResult = TRUE;

		}
		else
		{
			m_TreeCtrl.DeleteItem(m_hInsertItem);
		}
	}
	else //找到相同数据
	{
		if ((g_sSelectStr == "北京一区") || (g_sSelectStr =="矩阵地址") || (g_sSelectStr =="服务端口") )
		{
			MessageBox("该数据已存在");
			CEdit *pEdit = m_TreeCtrl.EditLabel(m_hInsertItem);
		}
		else
		{
			char msg[64]={0};
			sprintf(msg,"修改信息为%s,确定吗?",strName);
			if (MessageBox(msg,"提示",MB_OKCANCEL) == IDOK)
			{
				CString strText;
				m_TreeCtrl.GetEditControl()->GetWindowText(strText.GetBuffer(200),200);
				m_TreeCtrl.SetItemText(m_TreeCtrl.GetSelectedItem(),strText);//设置编辑后的文本为结点
				*pResult = TRUE;
				

			}
			else
			{
				m_TreeCtrl.DeleteItem(m_hInsertItem);
			}
		}
	}
	*pResult = 0;
}

//防止修改的数据有相同 嵌套循环
HTREEITEM CPMAgentManageDlg::FindItem(HTREEITEM item,CString strText)
{
	HTREEITEM hFind;
	if (item==NULL)
	{
		return NULL;	
	}
	while(item!=NULL)
	{
		if (m_TreeCtrl.GetItemText(item)==strText)
		{
			return item;
		}
		if (m_TreeCtrl.ItemHasChildren(item))
		{
			item = m_TreeCtrl.GetChildItem(item);
			hFind = FindItem(item,strText);
			if (hFind)
			{
				return hFind;
			}
			else
			{
				item = m_TreeCtrl.GetNextSiblingItem(m_TreeCtrl.GetParentItem(item));
			}
		}
		else
		{
			item = m_TreeCtrl.GetNextSiblingItem(item);
			if (item == NULL)
			{
				return NULL;
			}
		}
	}
	return item;
} 

//判断是否处于编辑状态  传按键进去  然后发送消息
BOOL CPMAgentManageDlg::IsTreeCtrlEditMessage(WPARAM KeyCode) 
{ 
	BOOL rvalue = FALSE; 
	CWnd *pWnd = this; 
	CTreeCtrl *treectrl = (CTreeCtrl *)pWnd->GetDlgItem(IDC_TREE); 
	if(!treectrl)
	{
		return rvalue; 
	}
	CWnd* focus = GetFocus();
	CEdit* edit = treectrl->GetEditControl(); 
	if((CEdit *)focus == edit) 
	{
		if (KeyCode == VK_ESCAPE)  
		{
			edit->SendMessage(WM_UNDO,KeyCode);  //ESC撤销 
		}
		if (KeyCode == VK_RETURN)
		{
			edit->SendMessage(WM_KEYDOWN,KeyCode);   //回车就执行
		}
		rvalue = TRUE; 
	} 
	return rvalue;
} 
//重载回车键
void CPMAgentManageDlg::OnOK() 
{ 
	if(!IsTreeCtrlEditMessage(VK_RETURN)) 
	{
		EndDialog(IDOK); 
	}
} 
//重载退出键
void   CPMAgentManageDlg::OnCancel() 
{ 
 	if(!IsTreeCtrlEditMessage(VK_ESCAPE)) 
	{
		EndDialog(IDCANCEL); 
	}
}   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值