天天看點

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;
}