TC官方合作论坛
标题:
选项卡右键菜单 开源
[打印本页]
作者:
kevinqq
时间:
2016-2-24 23:48
标题:
选项卡右键菜单 开源
论坛上有不少同学问过关于选项卡 右键菜单实现的问题
因为选项卡设计的原因,选项卡的消息是不能进入消息路由,很多同学没有找到实现的方式,最后放弃了!今天给大家讲的就是如何实现这个功能
我们先看效果图,所谓有图有真相
[attach]22844[/attach][attach]22845[/attach][attach]22846[/attach][attach]22847[/attach]
下面给大家提供一个方法以及源码
我们可以采用取巧的方式来实现,利用消息过程中的 123 消息,来**到右键在窗口上点击的消息
查看msdn 对123消息的描述是 当用户某个窗口中点击了一下右键就发送此消息给这个窗口
于是我们在消息过程中,监 听123这个消息,并判断鼠标当前位置的窗口句柄,做匹配,最后弹出我们的菜单
下面直接看源码,同时我们上传附件
var 右键控件句柄数组 = array()
var 表格句柄
//消息过程功能
功能 选项卡与表格右键菜单开源_消息过程(消息,w参数,l参数)
if(消息 == 123)
var now_hwnbd = windowgetpointhwnd()
traceprint(now_hwnbd)
var key = arrayfindvalue(右键控件句柄数组,now_hwnbd)
if(strlen(key))
var menuinfo ,index
if(key == "表格") //表格有个缺点 只有得到焦点才能获取内容,但是右键菜单会在得到焦点之前弹出,所以要先单击一次,然后右键
var row,col,str
表格获取焦点选项("表格0",row,col)
str = 表格获取内容("表格0",row,col)
index = PopuMenu("|"&str&"|抖动窗口|√任务栏隐藏|_|最小化|离开",menuinfo)
else
index = PopuMenu("|"&key&"|抖动窗口|√任务栏隐藏|_|最小化|离开",menuinfo)
end
RunFun(index,menuinfo)
end
end
结束
功能 选项卡与表格右键菜单开源_初始化()
//这里添加你要执行的代码
右键控件句柄数组["表格"] = controlgethandle("表格0")
var len =tabgetcount("选项卡0")
for(var i = 0; i < len; i++)
右键控件句柄数组["选项卡分页"&i] = tabgetpagehandle("选项卡0",i)
end
for(var i = 0; i < 5; i++)
for(var j = 1; j < 5; j++)
gridsetcontent("表格0",j,i,"第"&j&"行,第"&i&"列")
end
end
结束
复制代码
右键菜单部分
var m_hwnd
var WS_EX_LAYERED =#80000//让窗口有透明属性
var WS_BORDER =#00800000//无边框属性
var WS_CAPTION =#00C00000
var WS_CLIPSIBLINGS =#04000000
var WS_CLIPCHILDREN =#02000000
var TRANSPARENT =1
//让无边框的窗口可以,鼠标点击拖动
function NoBorderWindowMove()
dllcall("user32.dll","Long","ReleaseCapture")
dllcall("user32.dll","Long","SendMessageA","Long",m_hwnd,"Long",161,"Long",2,"Long",1)
end
//更新窗口扩展风格
function UdateWindowStyleEx(hwnd,Style)
var GWL_STYLE=-20
var style=dllcall("user32.dll","int","GetWindowLongA","int",m_hwnd,"int",GWL_STYLE)
dllcall("user32.dll","int","SetWindowLongA","int",m_hwnd,"int",GWL_STYLE,"int",style+Style)
end
//更新窗口风格
function UdateWindowStyle(hwnd,Style)
var GWL_STYLE=-16
var style=dllcall("user32.dll","int","GetWindowLongA","int",m_hwnd,"int",GWL_STYLE)
dllcall("user32.dll","int","SetWindowLongA","int",m_hwnd,"int",GWL_STYLE,"int",style+Style)
end
//透明度
//hwnd:窗口句柄
//color:要透明的颜色
//Alpha:透明度 0-255
//dwFlags:1,color有效;2,Alpha;3color、Alpha都有效
function Transparency(hwnd,color,Alpha,dwFlags)
return dllcall("user32.dll","int","SetLayeredWindowAttributes","int",hwnd,"int",color,"int",Alpha,"int",dwFlags)
end
//对窗口的裁剪
function 异型窗体(hwnd)
//获取窗口要裁剪的范围
var hr=dllcall("gdi32.dll","int","CreateRectRgn","int",10,"int",10,"int",110,"int",110)
//对窗口进行裁剪,对裁剪过的区域不显示
var dl=dllcall("user32.dll","int","SetWindowRgn","int",hwnd,"int",hr,"bool",true)
end
var isCheck=array() //用来记录单选框状态的
function PopuMenu(title,&array_PopuMenuInfo)
var TPM_LEFTBUTTON =#0000
var TPM_RIGHTBUTTON =#0002
var TPM_RETURNCMD =#0100
var TPM_LEFTALIGN =#0000
var TPM_CENTERALIGN =#0004
var TPM_RIGHTALIGN =#0008
var TPM_TOPALIGN =#0000
var TPM_VCENTERALIGN =#0010
var TPM_BOTTOMALIGN =#0020
var MF_SEPARATOR =#00000800//分割线
var MF_CHECKED =#00000008//选中
var MF_POPUP =#00000010
var MF_STRING =#00000000
var MF_BITMAP =#00000004
var MF_OWNERDRAW =#00000100
var IMAGE_BITMAP =#0
var LR_LOADFROMFILE =#00000010
var MF_BYCOMMAND =#00000000
var MF_BYPOSITION =#00000400
var title_array
var array1
var count = strsplit(title,"|",title_array)
var h_Menu=dllcall("user32.dll","int","CreatePopupMenu")
if(h_Menu==0)
return 0 //菜单创建失败就直接返回0
end
for(var i=1;i<count;i++)
//下面是增加菜单的item(理解成选项吧)
select(title_array[i])
case "-" //表示使用分割线
dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",MF_SEPARATOR,"int",0,"char *","fff")
isCheck[i]=false
case "_"//表示使用分割线
dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",MF_SEPARATOR,"int",0,"char *","fff")
isCheck[i]=false
default
var t = title_array[i]
//表示要使用复选框
if(strsub(title_array[i],0,1)=="√")
//截取√符号不显示
title_array[i]=strsub(title_array[i],1,strlen(title_array[i]))
if(isCheck[i])
//选中状态
dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",MF_CHECKED,"int",i,"char *",title_array[i])
isCheck[i]=true
else
//未选中状态
dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",0,"int",i,"char *",title_array[i])
isCheck[i]=false
end
else
//正常的
dllcall("user32.dll","int","AppendMenuA","int",h_Menu,"int",0,"int",i,"char *",title_array[i])
isCheck[i]=false
end
end
end
var x,y
mousegetpoint(x,y)
//弹出生成好的菜单,并返回你点击的选项,返回选项id.从上往下从1开始递增
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)
//销毁菜单(菜单点击完成后都是要关闭的)
dllcall("user32.dll","int","DestroyMenu","int",h_Menu)
//设置选择中项的状态
if(isCheck[ret])
isCheck[ret]=false
else
isCheck[ret]=true
end
//这里没有对 非复选框做过滤,不影响正常显示
array_PopuMenuInfo = stringtoarray("array(1,2,3)")
arraysetcache(array_PopuMenuInfo,count)
for(var i=0;i<count;i++)
var tmp = array(i,isCheck[i],title_array[i])
array_PopuMenuInfo[i] = tmp
end
return ret
end
//根据菜单返回的ID执行指定的函数
function RunFun(index,menuinfo)
var SC_MINIMIZE=#F020
var SC_MAXIMIZE=#F030
var WM_SYSCOMMAND=#112
select(index)
case 0
JitterWindow(m_hwnd,2,3)
case 1
if(menuinfo[2][1])//ID=2是复选框,所以要判断一下菜单信息里面的一些属性//下面是一个隐藏任务栏图标的dll
dllcall(getrcpath("rc:dlltest.dll"),"int","ShowInTaskbar","int",m_hwnd,"int",0)
else
dllcall(getrcpath("rc:dlltest.dll"),"int","ShowInTaskbar","int",m_hwnd,"int",1)
end
case 2
windowsendmessage(m_hwnd,WM_SYSCOMMAND,SC_MINIMIZE,0)//向TC窗口自身发送最小化的消息
case 3
exit()
end
end
//窗口抖动
//hwnd:要抖动的窗口句柄
//count:抖动的次数
//nWidth: 抖动的范围
function JitterWindow(hwnd,count,nWidth)
//这个函数就不详细注释了 代码很简单,就是改变窗口位置
var x,y
windowgetpos(hwnd,x,y)
for(var i=0;i<count;i++)
windowsetpos(hwnd,x+nWidth,y)
sleep(10)
windowsetpos(hwnd,x+nWidth,y-nWidth)
sleep(10)
windowsetpos(hwnd,x,y-nWidth)
sleep(10)
windowsetpos(hwnd,x-nWidth,y-nWidth)
sleep(10)
windowsetpos(hwnd,x-nWidth,y)
sleep(10)
windowsetpos(hwnd,x-nWidth,y+nWidth)
sleep(10)
windowsetpos(hwnd,x,y+nWidth)
sleep(10)
windowsetpos(hwnd,x+nWidth,y+nWidth)
sleep(10)
end
windowsetpos(hwnd,x,y)
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