MFC树形控件CTreeCtrl——点击右键弹出不同菜单

 

1、添加右键点击消息处理函数,根据不同的节点弹出不同的菜单

void CKingSchedulView::OnNMRClickTreeAddTask(NMHDR *pNMHDR, LRESULT *pResult)
{
	

	CPoint pt;  
	//pt = GetCurrentMessage()->pt;   //获取当前鼠标点击消息的坐标点  
	GetCursorPos(&pt);  
	m_TreeCtrol.ScreenToClient(&pt);   //将鼠标的屏幕坐标,转换成树形控件的客户区坐标  
	UINT uFlags = 0;  
	HTREEITEM hItem = m_TreeCtrol.HitTest(pt, &uFlags); //然后做点击测试  
	//int nData = m_TreeCtrol.GetItemData(hItem);  
	if ((hItem != NULL) && (TVHT_ONITEM & uFlags))     //如果点击的位置是在节点位置上面  
	{  
		m_TreeCtrol.SelectItem(hItem);  
		//根据不同类型的节点弹出菜单  
 
		m_TreeCtrol.ClientToScreen(&pt);  

		//有父节点 但父节点不为根节点
		if((m_TreeCtrol.GetParentItem(m_TreeCtrol.GetSelectedItem())))//任务节点
		{
			if(((m_TreeCtrol.GetParentItem(m_TreeCtrol.GetSelectedItem())))!=(m_TreeCtrol.GetRootItem()))
			{
				CMenu popMenu;
				CMenu *pPopup;
				popMenu.LoadMenu(IDR_MENU_TASKSET_TASKNODE);
				pPopup = popMenu.GetSubMenu(0);

				if(m_hTreeItem_CurrentCopy == NULL)
				{
					pPopup->EnableMenuItem(ID_TASKSETTASKNODE_PASTETASK,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
				}
				pPopup->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);  

			}

		}
		//有父节点且父节点为根节点 站点节点
		if(((m_TreeCtrol.GetParentItem(m_TreeCtrol.GetSelectedItem()))==(m_TreeCtrol.GetRootItem())) /*&&(!(m_TreeCtrol.ItemHasChildren(m_TreeCtrol.GetSelectedItem())))*/)
		{

			CMenu popMenu;
			CMenu *pPopup;
			popMenu.LoadMenu(IDR_MENU_TASKSET_STATIONNODE);
			pPopup = popMenu.GetSubMenu(0);
			pPopup->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);  


		}//无父节点
		if(!(m_TreeCtrol.GetParentItem(m_TreeCtrol.GetSelectedItem())))//根节点
		{

			CMenu popMenu;
			CMenu *pPopup;
			popMenu.LoadMenu(IDR_MENU_TASKSET_ROOTNODE);
			pPopup = popMenu.GetSubMenu(0);
			pPopup->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);  


		}

	} 
	//add 2018/5/22 展开根节点下的所有子节点
	HTREEITEM hroot = m_TreeCtrol.GetRootItem();
	if(hroot != NULL)
	{
		ExpandAllItem(hroot,true);//add 2018/5/22

	}//end 2018/5/22
	
	*pResult = 0;
}

2、添加菜单的消息处理函数(以复制任务为例)

消息处理函数实现:

void CKingSchedulView::OnTreeCopy()
{
	HTREEITEM hItem = m_TreeCtrol.GetSelectedItem();
	if(hItem == NULL)
		return;

	m_hTreeItem_CurrentCopy = hItem;

	DWORD_PTR pCopyItemData = m_TreeCtrol.GetItemData(hItem);
	CkxTask* pCopyTask = reinterpret_cast<CkxTask*>(pCopyItemData);
	std::map<CkxTask*,long>::iterator iterMap = m_mapTaskCopy.find(pCopyTask);
	if (iterMap != m_mapTaskCopy.end())
	{
		m_IndexCopy = iterMap->second;
	}
	else
	{
		m_IndexCopy = 0;
	}

}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值