用popup实现右键多级菜单

如何编程实现扩展右键菜单之二:使用子菜单       在上一篇教程中,我们已经实现了在资源管理器的右键菜单中增加自己的菜单项。本文中,笔者将介绍如何将自己的菜单项分组到子菜单中。如果需要添加的菜单项比较多,则使用子菜单将有助于提高右键菜单的友好性。      本文中的实例是在上一篇教程的基础上进行修改,在上一篇的基础上,增加一个菜单项用于使用记事本打开所选TXT文件,同时将我们在这两篇教程中添加的菜单项放到一个子菜单中。建议读者先完成 阅读详情

网上已经有很多实现右键菜单的文章,本菜单也是在参考网上的经验之后写成。如有好的意见和建议欢迎留言

本菜单的特点:

1、可动态添加菜单项和子菜单

2、可用css控制菜单表现

菜单样式如下:

 

代码如下:

popmenu.css

 .menuMain {
  font-size: 12p;
  background: #ffffff;
  

  BORDER-RIGHT: gold 1px solid;
  BORDER-TOP: gold 1px solid;
  BORDER-LEFT: gold 1px solid;


 }
 .menuNormal
 {
  valign:middle;
  text-align:center;
  background-color:#ffffff;
  font-size: 12px;
         color:#000000;  
  cursor:default;
  FILTER:0;

  BORDER-BOTTOM: gold 1px solid;
 }
 .menuHot
 {
  valign:middle;
  text-align:center;
  background-color:#ffffff;;
  font-size: 12px;
         color:#ffffff;  
  cursor:default;
  FILTER:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=gold, EndColorStr=#FFFFFF);

  BORDER-BOTTOM: gold 1px solid;
  }

popmenu.js



//p.menuBody.document.styleSheets
//右键菜单
/*
 cssFile:菜单模式css文件
 nomalClass:菜单子项的普通模式
 hotClass:菜单子项获得焦点模式
 menuClass:菜单模式
 menuWidth:菜单宽度
*/
PopMenu=function(cssFile,nomalClass,hotClass,menuClass,menuWidth)
{
 //初始化菜单式样
 this.nomalClass=nomalClass;
 this.hotClass=hotClass;
 this.menuClass=menuClass;
 this.menuWidth=menuWidth;
 this.cssFile=cssFile;
 
 this.menuItems=new Array();
 this.parentMenu=null;
 this.childMenus=new Array();
 this.hotChild=null;
 this.parentIndex=null;
 
 this.menuBody=null;//菜单体
 
 this.top=null;
 this.left=null;
 
}
/*
//创建菜单
PopMenu.prototype.createMenu=function()
{
 this.menuItem=
 
 /*
 if(this.parentMenu!=null)
  this.menuBody=this.parentMenu.menuBody.document.parentWindow.createPopup();
 else
  this.menuBody=window.createPopup();
  
 
 this.menuBody.document.createStyleSheet(this.cssFile);
 
 this.menuTable=createTable(this.menuBody.document,this.menuClass);
    this.menuBody.document.oncontextmenu=function()
    {

            return false;

    }
    var pop=this.menuBody;
    var mt=this;
   this.menuBody.document.onclick=function()

    {
   clearSelMenu(mt);
            pop.hide();

    }

}*/
//创建子菜单
PopMenu.prototype.createChildMenu=function(index,menuWidth)
{
 var newp=new PopMenu(this.cssFile,this.nomalClass,this.hotClass,this.menuClass,menuWidth);
 
 newp.parentMenu=this;
 newp.parentIndex=index;
 
 this.childMenus[this.childMenus.length]=newp;

 return newp;
}
//创建菜单项
PopMenu.prototype.addMenuItem=function(text,clickFunciton,menuId)
{
 var tindex=this.menuItems.length
 var menu={index:tindex,menuId:menuId,text:text,clickF:clickFunciton}
 this.menuItems[tindex]=menu;
}

//显示菜单
PopMenu.prototype.showMenu=function()
{
 this.createMenuBody();
 this.createMenuItem();
 var rowCount=this.menuTable.rows.length

 if(this.parentMenu==null)
  this.menuBody.show(event.clientX-1,event.clientY,this.menuWidth,rowCount*25,document.body);
 else
  this.menuBody.show(this.parentMenu.menuWidth,25*this.parentIndex,this.menuWidth,rowCount*25,this.parentMenu.menuBody.document.body);

 

}

//创建菜单
PopMenu.prototype.createMenuBody=function()
{
 if(this.parentMenu!=null)
  this.menuBody=this.parentMenu.menuBody.document.parentWindow.createPopup();
 else
  this.menuBody=window.createPopup();
  
 
 this.menuBody.document.createStyleSheet(this.cssFile);
 
 this.menuTable=createTable(this.menuBody.document,this.menuClass);
    this.menuBody.document.oncontextmenu=function()
    {

            return false;

    }
    var pop=this.menuBody;
    var mt=this;
   this.menuBody.document.onclick=function()

    {
   clearSelMenu(mt);
   var mtp=mt.parentMenu;
   while(mtp!=null)
   {
    mtp.menuBody.hide();
    mtp=mtp.parentMenu    
   }
            pop.hide();
   

    }

}

PopMenu.prototype.createMenuItem=function()
{

 for(var i=0;i<this.menuItems.length;i++)
 {
  var itemM=this.menuItems[i];
  var t=this.menuBody.document.createElement("tr");
  var td=this.menuBody.document.createElement('td');
  td.className=this.nomalClass;
  td.innerText=itemM.text;

  var pop=this;
  var hc=this.hotClass;
  td.id=i;

  td.onmouseover=function()
  {
         this.className=pop.hotClass;
           
   //显示子菜单
    if(pop.hotChild!=null) pop.hotChild.hide();
    for(var j=0;j<pop.childMenus.length;j++)
    {
    
     if(pop.childMenus[j].parentIndex==this.id)
     {
      window.status=this.id;

      pop.childMenus[j].showMenu();//显示子菜单
      pop.hotChild=pop.childMenus[j];
      return;
     
     }
    }

  } 
     var pop2=this;

  td.onmouseout=function()
  {
   this.className=pop2.nomalClass;

  }
  t.appendChild(td);
  if(itemM.clickF!=null) t.onclick=itemM.clickF;
  this.menuTable.appendChild(t);
 }

}
//菜单隐藏
PopMenu.prototype.hide=function()
{
 this.menuBody.hide();
}

//创建容纳菜单项的表格
function createTable(p,className)
{
 //var t=p.createElement('<table border="1" width="100%" height="100%" bgcolor="#ffffff" style="border:thin;font-size: 12px" cellspacing="0"  bordercolor="#336633" >');
 var t=p.createElement('<table width="100%" height="100%" cellpadding="0" cellspacing="0">');

 t.className=className;
 t.width="100%";
 t.height="100%";
 var tb=p.createElement("TBody");
 if(t!=null&&tb!=null);
  t.appendChild(tb);
  
  
 if(p!=null)
  p.body.appendChild(t);
 return tb;

}
//菜单复原,清除选择
clearSelMenu=function(pop)
{

    //循环设置每行的属性
    var mt=pop.menuTable

    for(var i=0;i<mt.children.length;i++)

    {
  mt.children[i].children[0].className=pop.nomalClass;
 
 }
}
//清除菜单项
PopMenu.prototype.clear=function()
{
 this.menuItem.length=0;
 if(this.menuTable.children.length==0) return;
    for(var i=this.menuTable.children.length-1;i>=0;i--)

    {
  this.menuTable.removeChild(this.menuTable.children[i]);
 
 }

}

/////////////////////////////

 

test.htm:

<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="StyleSheet" href="popmenu.css" type="text/css" >

 


<script type="text/javascript" src="js/popmenu.js"></script>

<script language=javascript>
var popMenu;


function itemClick1(text)
{
 alert('item:'+text);
}
function itemClick2(text,index)
{
 alert('item2:'+text+','+index);
}
function childmenuClick(text,index)
{
 alert('childMenu:'+text+','+index);
}

function initPopmenu()
{
 
 //参数:菜单显示模式的css文件,菜单项普通模式,菜单项获得焦点模式,菜单整体模式,菜单宽度
 popMenu=new PopMenu('popmenu.css','menuNormal','menuHot','menuMain',100);

 //popMenu.createMenu();//创建菜单
 var a='test1';
 var a2='test2';
 var a3=5;
 
 popMenu.addMenuItem('test1',function(){itemClick1(a);},null);
 popMenu.addMenuItem('test2',function(){itemClick2(a2,a3);},null);
 popMenu.addMenuItem('test3  >>',null,null);
 popMenu.addMenuItem('test4  >>',null,null);
 
  //创建第二级菜单
 var childMenu=popMenu.createChildMenu(3,100);//参数:子菜单父亲的index(用于定位),菜单宽度
 var a4='childmenuclick';
 var a5=10;
 childMenu.addMenuItem('test4--1',function(){childmenuClick(a4,a5)},null)
 childMenu.addMenuItem('test4--2',null,null)

  
  //创建第二级菜单
 var childMenu=popMenu.createChildMenu(2,100);//参数:子菜单父亲的index(用于定位),菜单宽度
 var a4='childmenuclick';
 var a5=10;
 childMenu.addMenuItem('test3--1  >>',null,null)//
 childMenu.addMenuItem('test3--2  >>',null,null)


 
 var ddMenu1=childMenu.createChildMenu(0,100);
 ddMenu1.addMenuItem('test3--1--1',function(){childmenuClick(a4,a5)},null)
 ddMenu1.addMenuItem('test3--1--2',function(){childmenuClick(a4,a5)},null)

 var ddMenu=childMenu.createChildMenu(1,100);
 ddMenu.addMenuItem('test3--2--1',null,null)
 ddMenu.addMenuItem('test3--2--2',null,null)

}

function showMenu()

{

 popMenu.showMenu();
}  
  
  //////////

 </script>


</head>


<body leftmargin="0" topmargin="0"   onLoad="initPopmenu()"  oncontextmenu="showMenu(); return false;"  >

</body>
 
</html>

 

 

 

 

 

 

 

 

 

QML弹出多级菜单 RightPopUpMenu.qml import QtQuick 2.5 import QtQuick.Controls 2.5 Menu { id: firstMenu title: qsTr("剪切") Action { text: qsTr("剪切"); onTriggered: { console.log... 阅读详情

相关推荐

PopMenu弹出式窗口

PopMenu弹出式窗口,文章地址:http://write.blog.youkuaiyun.com/postedit/78110175

C# 加载并显示菜单

软件架构师何志丹 1,支持cui和cuix。 2,菜单组重复加载或显示,C#下都会崩溃。所以要判断。 3,菜单加到最后。 public static AcadMenuGroup LoadMenu(AcadMenuGr...

闻缺陷则喜何志丹 760

WPF实现多级菜单(菜单多按钮)

1、利用WPF实现垂直分布的多级菜单 2、按钮模板重定义 3、动画效果 4、重定义后的按钮响应多个command,实现单个按钮多种功能 5、command的定义和使用 6、子类、父类的应用 7、我的环境是XP和vs2010

使用javascript实现一个popup

在前端开发中,实现一个弹出窗口(popup)通常涉及到HTML、CSS和JavaScript。以下是一个简单的示例,展示如何使用JavaScript实现一个基本的弹出窗口。这个简单的示例展示了如何使用HTML、CSS和JavaScript来创建一个基本的弹出窗口。我们将创建一个隐藏的弹出窗口和一个按钮,当点击该按钮时,弹出窗口将显示。最后,我们使用JavaScript来控制弹出窗口的显示和隐藏。当点击“打开弹出窗口”按钮时,我们将删除。接下来,我们为弹出窗口和按钮添加一些基本的CSS样式。

王铁柱666的博客 617

WPF自定义多级菜单功能

采用wpf自定义控件,自定义布局,实现后台动态添加多级菜单功能,菜单构成是一级菜单上层小图片,下层菜单名。二级菜单是左侧小图片,右侧是菜单名称。一级和二级菜单有默认背景图片和选中后的图片。点击一级菜单动态加载二级菜单。菜单有钉子动画功能但此功能有些问题不需要钉子功能可以不用此功能。wpf功底好点的可以自己研究钉子功能。

Winform MenuStrip菜单实现动态生成

C#,VS2015,Winform实现从Xml格式配置中读出数据,并动态生成菜单,有空研究的朋友可以扩展一下功能在分享出来,thanks!

菜单实现之PopupMenu

PopupMenu(弹出菜单):点击view后在view下面弹出的菜单 实现方法: 1.创建popup_menu PopupMenu popupMenu = new PopupMenu(this, button);//button是popupMenu的宿主,也可以是其他任意view popupMenu.getMenuInflater().inflate(R.me

蔷薇_wendy的博客 1174

从Landsat 8到哨兵2号:手把手教你用ENVI处理不同卫星数据的NDVI(附常见错误排查)

本文详细解析了从Landsat 8到哨兵2号的多源遥感数据NDVI计算全流程,包括不同卫星的波段设置差异、ENVI处理步骤及常见错误排查。通过实战指南和代码示例,帮助用户高效处理NDVI数据,特别针对哨兵2号数据的特殊处理提供了专业建议,适用于植被监测和遥感分析。

weixin_27741699的博客 328

wpf多级动态右键菜单ContextmMenu

搞这个右键菜单用了挺长的时间,一是网络上面资料比较少,二是里面有坑,坑就是众所周知,c#程序有两种窗口,一种是Form窗口,另一种是wpf窗口。网上的资料是这两种混合,开始我并没有意识到这两种有多大的差别,但是看了许多资料发现有很多自相矛盾的地方,因为这两种窗口有很多不同的地方: Form:contextmenustrip已经替代了contextmenu,但是contextmenu仍然可以用

重口味码农 9869

嵌入式常用通信协议 #概述

嵌入式通信协议

AFK3060的博客 2116

从JT808/JT1078协议到多端协同:构建高并发北斗车辆监控平台的技术实践

本文详细介绍了基于JT808/JT1078协议构建高并发北斗车辆监控平台的技术实践,包括协议解析、高并发架构设计、多端协同实现及数据持久化策略。通过Netty、Kafka等技术优化,系统成功支撑日均2000万条消息处理,为GPS车辆动态监控系统提供了可靠解决方案。

weixin_28358083的博客 224

PopupMenu控件的使用

1、用PopupMenu控件能进行右键菜单的实现,它的实现还需要绑定到barManager控件上,在barManager的Customize中添加右键所需要显示的功能。 2、PopupMenu属性栏中绑定Manager为barManager; 3、窗体加载事件中创建 this.popupMenu1.AddItems(new BarItem[] { barButtonItem1, bar

面朝大海,春暖花开 7128

Qt Creator菜单栏消失的终极修复指南:从快捷键冲突到设置恢复

本文详细解析了Qt Creator菜单栏消失的常见原因及修复方法,包括快捷键冲突排查、配置文件重置和界面模式切换等解决方案。特别针对Qt开发者遇到的菜单栏显示问题,提供了从简单快捷键操作到深度配置修改的全方位指南,帮助用户快速恢复Qt Creator的正常使用。

weixin_27240351的博客 338

Unity编辑器制作多级下拉菜单

Unity编辑器制作多级下拉菜单

阿赵的博客 3882

OpenV2X 车路协同开源平台 Columbia 版本正式发布!

OpenV2X车路协同开源平台Columbia 版本正式发布!

weixin_65571684的博客 1198

文末含资料链接和视频讲解!YOLOv8集成CoordAtt注意力机制详细教程

本文详细介绍了如何在YOLOv8目标检测框架中集成CoordAtt注意力机制。首先解析了CoordAtt的工作原理,它通过分解式池化将位置信息嵌入到通道注意力中,相比传统注意力机制具有更好的空间信息保持能力。然后提供了PyTorch实现代码解析,包括自适应平均池化、Hard-Swish激活函数等关键实现细节。最后概述了YOLOv8架构,为后续集成CoordAtt提供基础。该教程适合具备深度学习基础的开发者,将理论与实践结合,帮助读者掌握这一目标检测优化技术。

FJN110的博客 266

浏览器扩展V3开发系列之 chrome.contextMenus 右键菜单的用法和案例

chrome.contextMenus 允许开发者向浏览器的右键菜单添加自定义项。

小鱼神1024的博客 4083

Keil uVision5 STM32 startup_stm32f10x_md_vl.s error A3906U Malformed via file target not created..

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2775

PySimpleGUI多级菜单设计终极指南:打造专业级应用导航系统

PySimpleGUI是一款让开发者能够快速构建图形用户界面的Python库,其多级菜单系统为应用程序提供了直观且高效的导航方式。本文将详细介绍如何使用PySimpleGUI创建功能丰富的多级菜单,从基础结构到高级定制,帮助你打造专业级的应用导航体验。 ## 一、菜单基础:理解PySimpleGUI菜单结构 PySimpleGUI的菜单系统采用直观的列表嵌套结构定义,所有菜单类型都遵循这一核心

gitblog_00826的博客 1103

【软件系统架构】系列十一:面向对象技术—sysML

摘要: SysML(系统建模语言)是UML的扩展,专为复杂系统工程设计,支持硬件、软件、人员等跨领域建模。其核心包括9种图:4种结构图(如块定义图BDD、内部块图IBD)、4种行为图(如活动图AD、序列图SD)和需求图(REQ),覆盖需求、结构、行为及参数约束。相比UML(面向软件),SysML精简图表(9 vs 13),强化需求追踪与性能分析(如参数图PD),并支持MBSE(基于模型的系统工程)。需求关系(如满足、验证、派生)在需求图中明确关联设计实现,形成闭环管理。SysML是UML的子集与系统工程扩展

moton2017的博客 1908

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Electron for 鸿蒙pc项目实战之右键菜单组件

/ 显示自定义右键菜单// 设置菜单位置${// 显示自定义右键菜单 function showCustomContextMenu(x , y) {// 设置菜单位置 customContextMenu . style . left = ` ${ x } px `;// 检查边界,确保菜单不会超出视口 const rect = customContextMenu . getBoundingClientRect();

风中追风 1028

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Reactjs-popup菜单组件深度解析:构建现代化下拉菜单和上下文菜单

Reactjs-popup是一个功能强大的React弹出组件库,能够帮助开发者轻松创建现代化的下拉菜单和上下文菜单。本文将为您提供一份全面指南,教您如何利用这个组件库快速构建美观且交互友好的菜单界面。 ## 为什么选择Reactjs-popup菜单组件? Reactjs-popup作为一款集模态框、工具提示和菜单于一体的React组件库,具有以下显著优势: - **轻量级设计**:体积小巧但

gitblog_00868的博客 477

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

js 模拟右键菜单

使用右键事件 在需要右键的地方加上  onmousedown="if(event.button == 2) alert('点击右键了!');即可   不经意地被一位同事问起在javascript里面如何检测右键事件,并且屏蔽原来的右键菜单,上网查找一翻之后发现一些比较简单的方法。 如设置onmousedown,检查其event.button的值是不是2(代表右键)。 这个方法在FF和IE

coding... 8636

HTML中实现右键菜单功能

HTML中实现右键菜单功能我们使用的应用系统很多都有右键菜单功能。但是在网页上面,点击右键一般显示的却是IE默认的右键菜单,那么我们如何实现自己的右键菜单呢?下面将讲解右键菜单功能的实现原理和实现代码。实现原理在HTML语言中,基本上每个对象都有一个oncontextmenu事件,这个事件就是鼠标的右键单击事件(onclick事件是鼠标的左键单击事件),那么我们就可以在鼠标右击的时

bear的个人专栏 1691

JavaScript实现右键菜单(三)

BSRightMenu/** * 标题: BSRightMenu * 功能描述: BS右键菜单对象。装载所有的右键菜单块 * 作者: BinaryStar原创B/S框架 * 版本: 0.1 * 创建日期: 2005-12-21 */ function BSRightMenu(id)...{  this.id = id||"BSRightMenu_1";//ID  this.item

Binarystar 之家 1847
上一篇: 电影金刚
下一篇: 长尾理论
adayfly
博客等级 码龄20年 0粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值