TC官方合作论坛

 找回密码
 立即注册
查看: 28634|回复: 111

[TC5.0源码] 选项卡右键菜单 开源

  [复制链接]
发表于 2016-2-24 23:48:56 | 显示全部楼层 |阅读模式
论坛上有不少同学问过关于选项卡 右键菜单实现的问题

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

我们先看效果图,所谓有图有真相


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

我们可以采用取巧的方式来实现,利用消息过程中的 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
复制代码


最后源码在附件中下载
游客,如果您要查看本帖隐藏内容请回复





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 3威望 +21 金币 +11 收起 理由
tan0360 + 10 很给力!
言术 + 10 + 10 赞一个!
lidongxu + 1 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2016-2-24 23:55:05 | 显示全部楼层
收藏了
回复

使用道具 举报

发表于 2016-2-25 00:08:28 | 显示全部楼层
个人神话,如果您要查看本帖隐藏内容请回复
回复 支持 反对

使用道具 举报

发表于 2016-2-25 00:56:29 | 显示全部楼层
看看
回复

使用道具 举报

发表于 2016-2-25 03:29:39 | 显示全部楼层
回复

使用道具 举报

发表于 2016-2-25 05:56:46 | 显示全部楼层
看看
回复

使用道具 举报

发表于 2016-2-25 09:03:24 | 显示全部楼层
....................
回复

使用道具 举报

发表于 2016-2-25 12:51:58 | 显示全部楼层
学习 学习
回复

使用道具 举报

发表于 2016-2-25 13:53:19 | 显示全部楼层
kankan
回复

使用道具 举报

发表于 2016-2-25 23:34:15 | 显示全部楼层
111111111111111
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-3-29 21:26 , Processed in 0.038074 second(s), 24 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表