自己构造一个Tree类,当鼠标移动到树的节点上的时候用提示框显示该节点的信息

6 篇文章 0 订阅

新建一个类CMyTree继承自CTreeCtrl

MyTree.h中添加函数声明:

afx_msg BOOL OnToolTipText(UNIT id, NMHDR *pNMHDR, LRESULT *pResult);

virtual INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const;

在MyTree.cpp中添加消息映射

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTTA, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolHitTest)

 

添加函数实现

INT_PTR CMyTree::OnToolHitTest(CPoint point, TOOLINFO *pTI) const
{   
	RECT rect;
  	UNIT nFlags;
 	HTREEITEM hItem = this->HitTest(point, &nFlags);
  	if(hItem && (nFlags & TVHT_TEXTCALLBACK))
   	{     
 		this->GetItemTect(hItem, &rect, TRUE);     
		pTI->hwnd = m_hWmd;</p><p>      
 		pTI->uId = (UNIT_PTR)hItem;      
		pTI->lpszText = LPSTR_TEXTCALLBACK;    
		 pTI->rect = rect;
      		return pTI->uId;
   	}
    	return -1;
}

INT_PTR CMyTree::OnToolTipText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
 	TOOLTIPTEXTA *pTTA = (TOOLTIPTEXTA *)pNMHDR;
 	TOOLTIPTEXTW *pTTW = (TOOLTIPTEXTW *)pNMHDR;
 	CString strTip;</p><p>  UINT nID = (UINT)pNMHDR->idForm;
	if((nID == (UINT)m_hWnd) &&  
		(((pNMHDR->code == TTN_NEEDTEXTA) && (pTTA->uFlags & TTF_IDISHWND)) ||   
 		((pNMHDR->code == TTN_NEEDTEXTW) && (pTTW->uFlags & TTF_IDISHWND))))  
	{      
		return FALSE;
 	}
   	const MSG* pMessage;
 	CPoint pt;  
	pMessage = GetCurrentMessage(); 
	ASSERT (pMessage);
	pt = pMessage->pt; 
  	ScreenToClient(&pt);  
 	UINT nFlags;
	HTREEITEM hItem = this->HitTest(pt, &nFlags); 
	// 下面是要显示的内容,看自己要显示什么了,我这里显示的就是建立树的时候SetItemData放上的一个数字
	DWORD dw = (DWORD)this->GetItemData(hItem);
	strTip.Format("0x%04x", dw);
#ifndef _UNICODE    
 	if(pNMHDR->code == TTN_NEEDTEXTA)        
 		lstrcpyn(pTTA->szText, strTip, 80); //  这里可以注意一下szText就是80个字节    
	else        
		_mbstowcsz(pTTW->szText, strTip, 80);
#else        
	if(pNMHDR->code == TTN_NEEDTEXTA)     
 		_wcstombsz(pTTA->szText, strTip, 80); // 这里可以注意一下szText就是80个字节
	else 
		lstrcpyn(pTTW->szText, strTip, 80);
#endif
	*pRestlt = 0;
 	return TRUE;
}

 

添加全局变量

CRITICAL_SECTION g_TreeSection;


修改CMyTree的构造函数和析构函数

CMyTree::CMyTree()
{
	InitializeCriticalSection(&g_TreeSection);
	EnableToolTips(TRUE);
	long lStyle = GetWindowLong(this->m_hWnd, GW_SYTLE);
	lStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS;
	SetWindowLong(this->m_hWnd, GW_STYLE, lStyle);
}

CMyTree::~CMyTree()
{
	DeleteCriticalSection(&g_TreeSection);
}

用CTreeCrl的时候,直接声明一个CMyTree的变量就可以了,当鼠标移动到树上的节点的时候,就可以看到一个弹出框,显示节点的信息啦

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的需求,我向您提供以下解决方案: 1. 弹窗代码及添加位置 您可以在zm-tree-org组件中的删除节点方法中添加弹窗代码。具体来说,您可以在删除节点前,先弹出一个确认框,询问用户是否确认删除。如果用户点击了确认按钮,则执行删除节点的操作,包括删除该节点及其所有子节点信息;如果用户点击了取消按钮,则不执行删除操作。 以下是一个示例代码: ```vue <template> <zm-tree-org :tree-data="treeData" :options="options" @delete-node="onDeleteNode" ></zm-tree-org> </template> <script> export default { data() { return { treeData: [...], // 形结构数据 options: {...}, // 组件配置参数 }; }, methods: { onDeleteNode(node) { // 弹出确认框 this.$confirm("确定要删除该节点及其子节点吗?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }) .then(() => { // 用户点击了确认按钮,执行删除节点及子节点的操作 this.deleteNodeAndChildren(node); }) .catch(() => { // 用户点击了取消按钮,不执行删除操作 }); }, deleteNodeAndChildren(node) { // TODO: 执行删除节点及子节点的操作 }, }, }; </script> ``` 在上面的代码中,我们在zm-tree-org组件的`@delete-node`事件中调用了`onDeleteNode`方法,该方法用于弹出确认框。如果用户点击了确认按钮,则执行`deleteNodeAndChildren`方法,该方法用于删除节点及其所有子节点。 2. 删除节点的实现方法或调用方法 zm-tree-org组件提供了`deleteNode`方法,用于删除节点。如果您想要删除节点及其所有子节点,可以使用递归的方式实现。以下是一个简单的示例代码: ```javascript deleteNodeAndChildren(node) { // 查找当前节点的父节点 const parentNode = this.treeData.find((item) => item.id === node.parentId); if (parentNode) { // 从父节点的子节点中删除当前节点 const index = parentNode.children.findIndex((item) => item.id === node.id); if (index !== -1) { parentNode.children.splice(index, 1); } // 递归删除当前节点的所有子节点 if (node.children) { node.children.forEach((child) => { this.deleteNodeAndChildren(child); }); } } } ``` 在上面的代码中,我们首先查找当前节点的父节点,然后从父节点的子节点中删除当前节点。接着递归删除当前节点的所有子节点。 希望以上解决方案能够对您有所帮助。如果您还有其他问题或疑问,请随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值