天天看点

MFC TreeCtrl树形控件中限定右键点击节点弹出菜单

一、创建3个菜单,ID分别为IDR_MENU2,IDR_MENU3,IDR_MENU4,这些菜单必须要有子菜单项。

二、在树形控件右键-》属性-》事件-》添加右键点击处理。

MFC TreeCtrl树形控件中限定右键点击节点弹出菜单

三、在消息处理函数中添加代码

void CGar3Dlg::OnRclickTreePhase(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	//动态加载菜单
	CMenu menu[3];
	menu[0].LoadMenu(IDR_MENU2);
	menu[1].LoadMenu(IDR_MENU3);
	menu[2].LoadMenu(IDR_MENU4);
	CPoint pt;
	//pt = GetCurrentMessage()->pt;   //获取当前鼠标点击消息的坐标点
	GetCursorPos(&pt);
	m_maintree.ScreenToClient(&pt);   //将鼠标的屏幕坐标,转换成树形控件的客户区坐标
	UINT uFlags = 0;
	HTREEITEM hItem = m_maintree.HitTest(pt, &uFlags); //然后做点击测试
	if ((hItem != NULL) && (TVHT_ONITEM & uFlags))     //如果点击的位置是在节点位置上面
	{
		m_maintree.SelectItem(hItem);
		//根据不同类型的节点弹出菜单
		CMenu *psubmenu;
		int nData = m_maintree.GetItemData(hItem);
		m_maintree.ClientToScreen(&pt);
		switch (nData)
		{
		case 0:
			psubmenu=menu[0].GetSubMenu(0);
			break;
		case 1:
			psubmenu=menu[1].GetSubMenu(0);
			break;
		case 2:
			psubmenu=menu[2].GetSubMenu(0);
			break;
		default:
			break;
		}
		psubmenu->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
	}
	
	*pResult = 0;
}