右键菜单的实现(类)

原创 2007年10月05日 18:59:00
HTREEITEM m_hItem;
 CXMLView* m_hWnd;
 void DisplayMenu();
private:
 CBitmap m_AddMap;
 CBitmap m_DelMap;
void CRightClick::DisplayMenu()
{
 m_hWnd = (CXMLView*)(((CMainFrame*)AfxGetMainWnd())->GetActiveView());
 
 CPoint pt;
 CPoint pt1;
 GetCursorPos(&pt); //读取滑鼠的坐标
 GetCursorPos(&pt1);
 m_hWnd->ScreenToClient(&pt); //将给定点或显示器上矩形的屏幕坐标转换为客户坐标

 CMenu PopMenu;
 PopMenu.CreatePopupMenu();

 UINT uFlags;
 m_hItem = m_hWnd->GetTreeCtrl().HitTest(pt, &uFlags);
 
 if ((m_hItem != NULL) && (TVHT_ONITEM &uFlags))
 {
  m_hWnd->GetTreeCtrl().SetFocus(); //要求输入焦点
  //选择,在视中滚动,或重画一个指定的tree view项, TVGN_CARET 设置给定项的选择
  m_hWnd->GetTreeCtrl().Select(m_hItem,TVGN_CARET);
  m_hWnd->GetFocus();

  //设置了4层嵌套
  HTREEITEM ItemRoot, Item1, Item2, Item3, Item4;
  
  ItemRoot = m_hWnd->GetTreeCtrl().GetParentItem(m_hItem);
  Item1 = m_hWnd->GetTreeCtrl().GetParentItem(m_hItem);
  Item2 = m_hWnd->GetTreeCtrl().GetParentItem(Item1);
  Item3 = m_hWnd->GetTreeCtrl().GetParentItem(Item2);
  Item4 = m_hWnd->GetTreeCtrl().GetParentItem(Item3);

  if(!ItemRoot)
  {
   PopMenu.AppendMenu(MF_STRING, ID_MENU_ADD1, "添加区域");
   PopMenu.AppendMenu(MF_STRING, ID_MENU_DELROOT, "删除工程");
  }
  else if(Item4)
  {
   PopMenu.AppendMenu(MF_STRING, ID_MENU_DEL4, "删除计量点");
  }
  else if(Item3)
  {
   PopMenu.AppendMenu(MF_STRING, ID_MENU_ADD4, "添加计量点");
   PopMenu.AppendMenu(MF_STRING, ID_MENU_DEL3, "删除仪表");
  }
  else if(Item2)
  {
   PopMenu.AppendMenu(MF_STRING, ID_MENU_ADD3, "添加仪表");
   PopMenu.AppendMenu(MF_STRING, ID_MENU_DEL2, "删除站场");
  }
  else if(Item1)
  {
   PopMenu.AppendMenu(MF_STRING, ID_MENU_ADD2, "添加站场");
   PopMenu.AppendMenu(MF_STRING, ID_MENU_DEL1, "删除区域");
  }
 }
 else if(m_hItem == NULL && m_flag == TRUE)
 {
  m_hWnd->GetTreeCtrl().SetFocus(); //要求输入焦点
  //选择,在视中滚动,或重画一个指定的tree view项, TVGN_CARET 设置给定项的选择
  m_hWnd->GetTreeCtrl().Select(m_hItem,TVGN_CARET);
  m_hWnd->GetFocus();
  PopMenu.AppendMenu(MF_STRING, ID_MENU_ADDROOT, "创建新工程");
 }
 
 DWORD SelectionMade=PopMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD,
 pt1.x,pt1.y,m_hWnd);

 //实现选中的菜单
 switch(SelectionMade)
 {
  case ID_MENU_ADDROOT:
   m_hWnd->GetTreeCtrl().InsertItem("新工程", 0, 1, m_RoothItem, m_RoothItem);
   m_hWnd->GetTreeCtrl().Expand(m_RoothItem, TVE_EXPAND);
   m_flag = FALSE;
   break;
  case ID_MENU_DELROOT:
   m_hWnd->GetTreeCtrl().DeleteItem(m_hItem);
   m_flag = TRUE;
   break;
  case ID_MENU_ADD1:
   m_hWnd->GetTreeCtrl().InsertItem("新区域", m_hItem, m_hItem);
   m_hWnd->GetTreeCtrl().Expand(m_hItem, TVE_EXPAND);
   break;
  case ID_MENU_DEL1:
   m_hWnd->GetTreeCtrl().DeleteItem(m_hItem);
   break;
  case ID_MENU_ADD2:
   m_hWnd->GetTreeCtrl().InsertItem("新站场",m_hItem, m_hItem);
   m_hWnd->GetTreeCtrl().Expand(m_hItem, TVE_EXPAND);
   break;
  case ID_MENU_DEL2:
   m_hWnd->GetTreeCtrl().DeleteItem(m_hItem);
   break;
  case ID_MENU_ADD3:
   m_hWnd->GetTreeCtrl().InsertItem("新流量计",m_hItem, m_hItem);
   m_hWnd->GetTreeCtrl().Expand(m_hItem, TVE_EXPAND);
   break;
  case ID_MENU_DEL3:
   m_hWnd->GetTreeCtrl().DeleteItem(m_hItem);
   break;
  case ID_MENU_ADD4:
   m_hWnd->GetTreeCtrl().InsertItem("新计量点",m_hItem, m_hItem);
   m_hWnd->GetTreeCtrl().Expand(m_hItem, TVE_EXPAND);
   break;
  case ID_MENU_DEL4:
   m_hWnd->GetTreeCtrl().DeleteItem(m_hItem);
   break;
 }
}

 

Flex 实现右键菜单

  • 2014年09月22日 11:13
  • 684KB
  • 下载

自定义treeview控件,实现右键菜单编辑功能

试过用复合控件包含treeview控件,但是失败,这次在右键菜单调用tree的回发js成功可以在页面后台绑定被编辑的节点,后台3个函数都可以编辑用c#传的参数e.mynode就是右键菜单的选中的节点 ...

右键菜单添加与实现

  • 2013年06月06日 18:12
  • 330KB
  • 下载

VC++任务栏托盘图标及右键菜单实现

Windows 95以及后来的Windows版本允许你将程序图标放入系统托盘。所谓系统托盘,通常指的是屏幕右下方显示时间,音量等图标的那个区域。托盘图标通常可以执行一些快捷操作,如窗口隐藏时通常最小化...

HTML中实现右键菜单功能

  • 2008年04月14日 13:08
  • 512KB
  • 下载

SDK实现的右键菜单例子

  • 2012年11月07日 13:00
  • 2KB
  • 下载

jQuery实现右键菜单+遮罩+弹出层(适应管理系统界面)

最近要做个某管理系统的界面,然后涉及到右键菜单,因为之前没有做过所以就做了一下~感觉还可以,不过我个人不是很喜欢右键菜单的这种形式。 操作:在固定区域内点击鼠标右键出现菜单,然后选择任意一项后...

js实现右键菜单效果

  • 2013年05月23日 11:51
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:右键菜单的实现(类)
举报原因:
原因补充:

(最多只允许输入30个字)