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