TC官方合作论坛

标题: 选项卡右键菜单 开源 [打印本页]

作者: kevinqq    时间: 2016-2-24 23:48
标题: 选项卡右键菜单 开源
论坛上有不少同学问过关于选项卡 右键菜单实现的问题

因为选项卡设计的原因,选项卡的消息是不能进入消息路由,很多同学没有找到实现的方式,最后放弃了!今天给大家讲的就是如何实现这个功能

我们先看效果图,所谓有图有真相
[attach]22844[/attach][attach]22845[/attach][attach]22846[/attach][attach]22847[/attach]

下面给大家提供一个方法以及源码

我们可以采用取巧的方式来实现,利用消息过程中的 123 消息,来**到右键在窗口上点击的消息

查看msdn 对123消息的描述是 当用户某个窗口中点击了一下右键就发送此消息给这个窗口

于是我们在消息过程中,监 听123这个消息,并判断鼠标当前位置的窗口句柄,做匹配,最后弹出我们的菜单

下面直接看源码,同时我们上传附件
  1. var 右键控件句柄数组 = array()
  2. var 表格句柄
  3. //消息过程功能
  4. 功能 选项卡与表格右键菜单开源_消息过程(消息,w参数,l参数)
  5.     if(消息 == 123)
  6.         
  7.         var now_hwnbd = windowgetpointhwnd()
  8.         traceprint(now_hwnbd)
  9.         var key = arrayfindvalue(右键控件句柄数组,now_hwnbd)
  10.         if(strlen(key))
  11.             var menuinfo ,index
  12.             if(key == "表格")        //表格有个缺点 只有得到焦点才能获取内容,但是右键菜单会在得到焦点之前弹出,所以要先单击一次,然后右键
  13.                 var row,col,str
  14.                 表格获取焦点选项("表格0",row,col)
  15.                 str = 表格获取内容("表格0",row,col)
  16.                 index = PopuMenu("|"&str&"|抖动窗口|√任务栏隐藏|_|最小化|离开",menuinfo)
  17.             else
  18.                 index = PopuMenu("|"&key&"|抖动窗口|√任务栏隐藏|_|最小化|离开",menuinfo)
  19.             end
  20.             RunFun(index,menuinfo)
  21.         end
  22.         
  23.     end
  24. 结束


  25. 功能 选项卡与表格右键菜单开源_初始化()
  26.     //这里添加你要执行的代码
  27.     右键控件句柄数组["表格"] = controlgethandle("表格0")
  28.     var len =tabgetcount("选项卡0")
  29.     for(var i = 0; i < len; i++)
  30.         右键控件句柄数组["选项卡分页"&i] = tabgetpagehandle("选项卡0",i)
  31.     end
  32.    
  33.     for(var i = 0; i < 5; i++)
  34.         for(var j = 1; j < 5; j++)
  35.             gridsetcontent("表格0",j,i,"第"&j&"行,第"&i&"列")
  36.         end
  37.     end
  38. 结束
复制代码
右键菜单部分

  1. var m_hwnd
  2. var WS_EX_LAYERED                =#80000//让窗口有透明属性
  3. var WS_BORDER                        =#00800000//无边框属性
  4. var WS_CAPTION                        =#00C00000

  5. var WS_CLIPSIBLINGS                =#04000000
  6. var WS_CLIPCHILDREN                =#02000000
  7. var TRANSPARENT                        =1

  8. //让无边框的窗口可以,鼠标点击拖动
  9. function NoBorderWindowMove()
  10.     dllcall("user32.dll","Long","ReleaseCapture")
  11.     dllcall("user32.dll","Long","SendMessageA","Long",m_hwnd,"Long",161,"Long",2,"Long",1)   
  12. end


  13. //更新窗口扩展风格
  14. function UdateWindowStyleEx(hwnd,Style)
  15.     var  GWL_STYLE=-20
  16.     var style=dllcall("user32.dll","int","GetWindowLongA","int",m_hwnd,"int",GWL_STYLE)
  17.     dllcall("user32.dll","int","SetWindowLongA","int",m_hwnd,"int",GWL_STYLE,"int",style+Style)
  18. end


  19. //更新窗口风格
  20. function UdateWindowStyle(hwnd,Style)
  21.     var GWL_STYLE=-16
  22.     var style=dllcall("user32.dll","int","GetWindowLongA","int",m_hwnd,"int",GWL_STYLE)
  23.     dllcall("user32.dll","int","SetWindowLongA","int",m_hwnd,"int",GWL_STYLE,"int",style+Style)
  24. end

  25. //透明度
  26. //hwnd:窗口句柄
  27. //color:要透明的颜色
  28. //Alpha:透明度 0-255
  29. //dwFlags:1,color有效;2,Alpha;3color、Alpha都有效
  30. function Transparency(hwnd,color,Alpha,dwFlags)
  31.     return dllcall("user32.dll","int","SetLayeredWindowAttributes","int",hwnd,"int",color,"int",Alpha,"int",dwFlags)
  32. end

  33. //对窗口的裁剪
  34. function 异型窗体(hwnd)
  35.     //获取窗口要裁剪的范围
  36.     var hr=dllcall("gdi32.dll","int","CreateRectRgn","int",10,"int",10,"int",110,"int",110)
  37.     //对窗口进行裁剪,对裁剪过的区域不显示
  38.     var dl=dllcall("user32.dll","int","SetWindowRgn","int",hwnd,"int",hr,"bool",true)
  39.    
  40. end


  41. var isCheck=array() //用来记录单选框状态的
  42. function PopuMenu(title,&array_PopuMenuInfo)
  43.    
  44.     var TPM_LEFTBUTTON                =#0000
  45.     var TPM_RIGHTBUTTON                =#0002
  46.     var TPM_RETURNCMD                =#0100   
  47.    
  48.     var TPM_LEFTALIGN                =#0000
  49.     var TPM_CENTERALIGN                =#0004
  50.     var TPM_RIGHTALIGN                =#0008   
  51.    
  52.     var TPM_TOPALIGN                =#0000
  53.     var TPM_VCENTERALIGN        =#0010
  54.     var TPM_BOTTOMALIGN                =#0020
  55.    
  56.     var MF_SEPARATOR                =#00000800//分割线
  57.     var MF_CHECKED                        =#00000008//选中
  58.     var MF_POPUP                        =#00000010
  59.     var MF_STRING                        =#00000000
  60.     var MF_BITMAP           =#00000004
  61.     var MF_OWNERDRAW                   =#00000100  
  62.    
  63.     var IMAGE_BITMAP                =#0
  64.     var LR_LOADFROMFILE     =#00000010   
  65.    
  66.     var MF_BYCOMMAND        =#00000000
  67.     var MF_BYPOSITION       =#00000400
  68.    
  69.     var title_array
  70.     var array1
  71.     var count = strsplit(title,"|",title_array)   
  72.    
  73.     var h_Menu=dllcall("user32.dll","int","CreatePopupMenu")
  74.     if(h_Menu==0)
  75.         return 0 //菜单创建失败就直接返回0
  76.     end
  77.    
  78.     for(var i=1;i<count;i++)
  79.         //下面是增加菜单的item(理解成选项吧)
  80.         select(title_array[i])
  81.             case "-" //表示使用分割线
  82.             dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",MF_SEPARATOR,"int",0,"char *","fff")  
  83.             isCheck[i]=false
  84.             case "_"//表示使用分割线
  85.             dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",MF_SEPARATOR,"int",0,"char *","fff")  
  86.             isCheck[i]=false
  87.             default
  88.             var t = title_array[i]
  89.             //表示要使用复选框
  90.             if(strsub(title_array[i],0,1)=="√")
  91.                 //截取√符号不显示
  92.                 title_array[i]=strsub(title_array[i],1,strlen(title_array[i]))
  93.                 if(isCheck[i])
  94.                     //选中状态
  95.                     dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",MF_CHECKED,"int",i,"char *",title_array[i])
  96.                     isCheck[i]=true
  97.                 else
  98.                     //未选中状态
  99.                     dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",0,"int",i,"char *",title_array[i])
  100.                     isCheck[i]=false
  101.                 end
  102.             else
  103.                 //正常的
  104.                 dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",0,"int",i,"char *",title_array[i])
  105.                 isCheck[i]=false
  106.             end
  107.             
  108.         end
  109.         
  110.     end  
  111.    
  112.     var x,y
  113.     mousegetpoint(x,y)   
  114.     //弹出生成好的菜单,并返回你点击的选项,返回选项id.从上往下从1开始递增
  115.     var ret=dllcall("user32.dll","int","TrackPopupMenu","int",h_Menu,"int",TPM_RIGHTALIGN+TPM_TOPALIGN+TPM_LEFTBUTTON+TPM_RIGHTBUTTON + TPM_RETURNCMD,"int",x,"int",y,"int",0,"int",windowgetmyhwnd(),"int",0)
  116.     //销毁菜单(菜单点击完成后都是要关闭的)
  117.     dllcall("user32.dll","int","DestroyMenu","int",h_Menu)
  118.    
  119.     //设置选择中项的状态
  120.     if(isCheck[ret])
  121.         isCheck[ret]=false
  122.     else
  123.         isCheck[ret]=true
  124.     end
  125.    
  126.     //这里没有对 非复选框做过滤,不影响正常显示
  127.     array_PopuMenuInfo = stringtoarray("array(1,2,3)")
  128.     arraysetcache(array_PopuMenuInfo,count)
  129.     for(var i=0;i<count;i++)
  130.         var tmp = array(i,isCheck[i],title_array[i])
  131.         array_PopuMenuInfo[i] = tmp
  132.     end
  133.     return ret   
  134. end

  135. //根据菜单返回的ID执行指定的函数
  136. function RunFun(index,menuinfo)
  137.    
  138.     var SC_MINIMIZE=#F020
  139.     var SC_MAXIMIZE=#F030
  140.     var WM_SYSCOMMAND=#112
  141.     select(index)
  142.         case 0
  143.         JitterWindow(m_hwnd,2,3)
  144.         
  145.         case 1
  146.         if(menuinfo[2][1])//ID=2是复选框,所以要判断一下菜单信息里面的一些属性//下面是一个隐藏任务栏图标的dll
  147.             dllcall(getrcpath("rc:dlltest.dll"),"int","ShowInTaskbar","int",m_hwnd,"int",0)
  148.         else
  149.             dllcall(getrcpath("rc:dlltest.dll"),"int","ShowInTaskbar","int",m_hwnd,"int",1)
  150.         end
  151.         
  152.         case 2
  153.         windowsendmessage(m_hwnd,WM_SYSCOMMAND,SC_MINIMIZE,0)//向TC窗口自身发送最小化的消息  
  154.         
  155.         case 3
  156.         exit()
  157.         
  158.     end   
  159.    
  160. end

  161. //窗口抖动
  162. //hwnd:要抖动的窗口句柄

  163. //count:抖动的次数

  164. //nWidth: 抖动的范围
  165. function JitterWindow(hwnd,count,nWidth)
  166.     //这个函数就不详细注释了 代码很简单,就是改变窗口位置
  167.     var x,y
  168.     windowgetpos(hwnd,x,y)
  169.     for(var i=0;i<count;i++)
  170.         windowsetpos(hwnd,x+nWidth,y)
  171.         sleep(10)
  172.         windowsetpos(hwnd,x+nWidth,y-nWidth)
  173.         sleep(10)
  174.         windowsetpos(hwnd,x,y-nWidth)        
  175.         sleep(10)
  176.         windowsetpos(hwnd,x-nWidth,y-nWidth)
  177.         
  178.         sleep(10)
  179.         windowsetpos(hwnd,x-nWidth,y)
  180.         sleep(10)
  181.         windowsetpos(hwnd,x-nWidth,y+nWidth)
  182.         sleep(10)
  183.         windowsetpos(hwnd,x,y+nWidth)
  184.         sleep(10)
  185.         windowsetpos(hwnd,x+nWidth,y+nWidth)
  186.         sleep(10)
  187.         
  188.     end
  189.     windowsetpos(hwnd,x,y)
  190.    
  191. end
复制代码


最后源码在附件中下载






作者: lidongxu    时间: 2016-2-24 23:55
收藏了
作者: 个人神话    时间: 2016-2-25 00:08
个人神话,如果您要查看本帖隐藏内容请回复
作者: 言术    时间: 2016-2-25 00:56
看看
作者: good    时间: 2016-2-25 03:29

作者: cjxdn    时间: 2016-2-25 05:56
看看
作者: qwe1063422121    时间: 2016-2-25 09:03
....................
作者: datunhao    时间: 2016-2-25 12:51
学习 学习
作者: djzlove129    时间: 2016-2-25 13:53
kankan
作者: tempbb1234    时间: 2016-2-25 23:34
111111111111111
作者: 420130    时间: 2016-2-26 11:32
牛逼的代码。哈,好东西~!
作者: axy1543    时间: 2016-2-27 13:02
kgkhgkh
作者: jodon27    时间: 2016-3-2 08:49
学习一下!!
作者: jodon27    时间: 2016-3-2 08:49
学习一下!!
作者: jodon27    时间: 2016-3-2 08:49
学习一下!!
作者: jodon27    时间: 2016-3-2 08:50
学习一下!!
作者: jodon27    时间: 2016-3-2 08:50
学习一下!!
作者: YGV    时间: 2016-3-6 20:44
学习学习
作者: hahayzl    时间: 2016-3-7 14:15
kkkkkkkkkkkkkkkkkkk
作者: seeye    时间: 2016-3-9 09:29
挺好的啊啊
作者: gaowen9304    时间: 2016-3-9 21:08
dddddddddddddddddddddddd
作者: 东月山    时间: 2016-3-10 10:11
学习学习,楼主辛苦了~
作者: q947926078    时间: 2016-4-3 08:42
fka;lshfl h
作者: 88979825    时间: 2016-4-8 22:16
DDDDDD
作者: wwkiqpl    时间: 2016-5-19 14:58
RE: 选项卡右键菜单 开源 [修改]
作者: ===    时间: 2016-6-12 09:49
11111111111
作者: 250366688    时间: 2016-6-14 03:36
111111111111
作者: mic3158    时间: 2016-6-21 16:54
RE: 选项卡右键菜单 开源 [修改]
作者: 2857989310    时间: 2016-7-11 01:57
学习学习下下
作者: ybc178    时间: 2016-7-31 16:12
顶                  
作者: 794601399    时间: 2016-8-5 17:49
选项卡右键菜单
作者: zhuhh2000    时间: 2016-9-6 08:08
牛人  谢谢
作者: tbmbx2017    时间: 2016-9-9 19:42
喜闻乐见的帖子呀!
作者: aoaoawei    时间: 2016-9-22 22:25
感谢楼主分享
作者: 15131240422    时间: 2016-9-22 23:02
我们可以采用取巧的方式来实现,利用消息过程中的 123 消息,来**到右键在窗口上点击的消息
作者: wsq1397551    时间: 2016-9-25 20:41
学习
作者: 2105029625    时间: 2016-10-3 08:50
sssssssssssssssss
作者: asdhkjhjk    时间: 2016-10-6 22:08
看看大神
作者: sxw005    时间: 2016-10-14 14:47
很给力的管理员
作者: 199110lxq    时间: 2016-10-15 15:26

作者: a7053846    时间: 2016-10-23 18:59
谢谢楼主
作者: karl223    时间: 2016-11-3 19:52
看看
作者: zhx1124    时间: 2016-11-5 19:58
看看 系诶些

作者: laowantong    时间: 2016-11-7 10:20

作者: kexuejia12    时间: 2016-11-21 23:39
先拜谢 辛苦  看看是不是自己需要的
作者: alanlty520    时间: 2016-11-28 10:07
111111111111111
作者: fuxiaojun185    时间: 2016-12-22 23:15
事实上是事实是事实
作者: zhujiacheng1992    时间: 2016-12-28 12:59
学习下

作者: guert2013    时间: 2017-1-2 17:59
委曲求全群群群群群群群群群
作者: baigq1    时间: 2017-1-11 13:27
感谢楼主的分享,学习一下

作者: bylove    时间: 2017-1-11 20:39
好快好快乐好了好了很快
作者: 无啦啦    时间: 2017-1-15 15:10
1111
作者: 774297414    时间: 2017-1-25 16:27
谢谢分享
作者: kgg666    时间: 2017-2-17 15:57
000000000000
作者: 493318448    时间: 2017-3-2 16:16
666666666666666666666666666666666666666666666666666666
作者: 450520925    时间: 2017-3-8 22:15
恢复看看
作者: yaobin    时间: 2017-4-7 14:25

....
作者: sclgame    时间: 2017-4-24 01:10
2333333333333333333333
作者: jushunhe    时间: 2017-4-25 00:11
选项卡右键菜单
作者: xhaoyi    时间: 2017-5-2 21:02
不错 支持一下
作者: xie0080    时间: 2017-5-4 17:52
选项卡右键菜单 开源 [修改]
作者: 天天一学    时间: 2017-5-5 16:10
110
作者: dragon07zn    时间: 2017-5-16 10:48
这个要看一下
作者: a889877    时间: 2017-5-16 17:51
很实用,谢谢

作者: somyyy    时间: 2017-6-20 20:31
谢谢

作者: rqsjsx    时间: 2017-8-24 13:35
这个是真的好
作者: overzees    时间: 2017-9-3 22:54
选项卡右键菜单 开源 [修改]
高级模式

作者: koieno    时间: 2017-10-24 22:58
11111111111111111111
作者: saina6281    时间: 2017-10-29 23:24
项卡右键菜单
作者: wypmke    时间: 2017-11-1 15:46
111111111111111111111111111
作者: zhuxianqq    时间: 2017-11-25 15:29
看看
作者: tiantianwangji1    时间: 2017-11-26 00:30
3215321
作者: qyz    时间: 2017-11-30 17:13
收藏了
作者: a520happy    时间: 2017-12-4 17:24
好长啊
作者: zcyzcy    时间: 2017-12-14 14:43
料。。。依旧适合新手 [修改]料。。。依旧适合新手 [修改]料。。。依旧适合新手 [修改]料。。。依旧适合新手 [修改]料。。。依旧适合新手 [修改]料。。。依旧适合新手 [修改]料。。。依旧适合新手 [修改]
作者: 285514823    时间: 2018-1-3 01:52
好东西
作者: q765758576    时间: 2018-4-19 10:52
选项卡右键菜单
作者: q979033318    时间: 2018-4-19 11:33

作者: dahua2    时间: 2018-6-28 15:34
11111111111111111
作者: SQT辅导员    时间: 2018-8-24 18:10
正需要这个东西 下载下来看看

作者: 小小飞飞    时间: 2018-9-16 13:27
宝宝宝宝




欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1