右键菜单的实现(类)

原创 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
  • 下载

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

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

右键菜单添加与实现

  • 2013-06-06 18:12
  • 330KB
  • 下载

跨浏览器的网页右键菜单的简单实现

本文主要叙述怎样实现右键菜单,以及跨浏览器的右键菜单的实现。     一般在网页页面按下鼠标右键(这个是在windows平台下,而在MAC中则是CTRL+点击),会显示默认的菜单,要显示自定义的右键菜...

HTML中实现右键菜单功能

  • 2008-04-14 13:08
  • 512KB
  • 下载

SDK实现的右键菜单例子

在QListWidget的item上实现右键菜单 (2009-11-23 16:41)

作者:wangxinus, 来源:http://wangxinus.cublog.cn 说明:原创文章欢迎转载,交流请Email给作者 关于右键菜单的实现,可以参考另一篇我转载的文章,...

js实现右键菜单效果

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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