win.ui.tracker 输入跟踪器的使用
By
admin
at 2019-01-20 • 0人收藏 • 1347人看过
aardio作者jacen之前也说,plus的鼠标事件功能就是这个实现的,
有些窗体或者控件需要鼠标事件的话,可以使用这个.
下面利用这个功能实现鼠标拖动摄像头上面的一根线移动
import fonts.fontAwesome; import win.ui; /*DSG{{*/ var winform = win.form(text="aardio form";right=812;bottom=577;bgcolor=16777215) winform.add( picturebox={cls="picturebox";left=22;top=23;right=710;bottom=374;bgcolor=15780518;db=1;dl=1;dr=1;dt=1;notify=1;z=1}; plus={cls="plus";left=370;top=305;right=527;bottom=362;bgcolor=65280;z=3}; plus2={cls="plus";text="预览按钮效果";left=605;top=301;right=747;bottom=356;bgcolor=-8355840;font=LOGFONT(h=-16;name='FontAwesome';charset=0);hide=1;notify=1;z=2}; plus3={cls="plus";left=183;top=19;right=185;bottom=383;bgcolor=255;notify=1;z=4} ) /*}}*/ winform.plus2.skin({ background={ active=0xFFCF8E2D; default=0xFF008080; hover=0xFF00C2C2 }; }) winform.plus.skin({ background={ active=0xFFCF8E2D; default=0xFF008080; hover=0xFF00C2C2 }; }) var VideoCapX1 = winform.picturebox.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}") var cap = VideoCapX1._object cap.GetVideoDeviceCount() cap.GetVideoDeviceName(0) cap.setVideoDeviceIndex(0) cap.setPreviewAudio(0); cap.setPreviewScale(true) cap.setConnected(true) cap.setPreview(true) //自绘plus背景 /* winform.plus3.onDrawBackground = function(graphics,rc,backgroundColor,clr){ var pen = gdip.pen(backgroundColor,2); graphics.drawLine(pen,(rc.right-rc.left)/2,rc.top,(rc.right-rc.left)/2,rc.bottom); pen.delete() return true;//返回true阻止绘制默认背景 } */ winform.plus2.oncommand = function(id,event){ winform.msgbox("点击了") } winform.plus3.setParent(winform.picturebox) winform.plus2.setParent(winform.picturebox) winform.plus.setParent(winform.picturebox) winform.picturebox.setParent(winform) var tack2 = win.ui.tracker(winform.plus3); tack2.onMouseEnter = function(wParam,lParam){ win.ui.waitCursor(true,::User32.LoadCursor(null,0x7F84/*_IDC_SIZEWE*/)); } tack2.onMouseLeave = function(wParam,lParam){ win.ui.waitCursor(false); } import mouse tack2.onMouseDrag = function(wParam,lParam){ //var x,y = win.getMessagePos(lParam); var x,y = mouse.getPos(); var fx,fy = win.toClient(winform.picturebox.hwnd,x,y) //var fx,fy = win.toClient(winform.hwnd,x,y) var xx,yy,cx,cy = winform.plus3.getPos() winform.plus3.setPos(fx,yy); } winform.show() win.loopMessage();
2019-12-1日更新:
其实上面的写法还是有点问题的, 不知道看的人发现了没有....
1, plus控件自带了track功能, 所以没有必要再封装一层, 是可以直接使用onMouse...的
2,可以不用导入mouse库, 既然plus的回调事件里已经获取到了message,那么完全可以直接使用,
可以修改如下:
winform.plus.onMouseEnter = function(wParam,lParam){ win.ui.waitCursor(true,::User32.LoadCursor(null,0x7F85/*_IDC_SIZENS*/)); } winform.plus.onMouseLeave = function(wParam,lParam){ win.ui.waitCursor(false); } winform.plus.onMouseDrag = function(wParam,lParam){ var x,y = win.getMessagePos(lParam); var px,py = winform.plus.getPos(); winform.plus.setPos(px,py+y); }
明显上面的写法更简洁.
1 个回复 | 最后更新于 2019-01-23
登录后方可回帖
IDC_APPSTARTING 标准的箭头和小沙漏
IDC_ARROW 标准的箭头
IDC_CROSS 十字光标
IDC_HAND Windows 98/Me, Windows 2000/XP: Hand
IDC_HELP 标准的箭头和问号
IDC_IBEAM 工字光标
IDC_ICON Obsolete for applications marked version 4.0 or later.
IDC_NO 禁止圈
IDC_SIZE Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL.
IDC_SIZEALL 四向箭头指向东、西、南、北
IDC_SIZENESW 双箭头指向东北和西南
IDC_SIZENS 双箭头指向南北
IDC_SIZENWSE 双箭头指向西北和东南
IDC_SIZEWE 双箭头指向东西
IDC_UPARROW 垂直箭头
IDC_WAIT 沙漏,Windows7系统下会显示为选择的圆圈表示等待