win.ui.tracker 输入跟踪器的使用
By
admin
at 2019-01-20 • 0人收藏 • 1453人看过
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系统下会显示为选择的圆圈表示等待