Listview+plus+capture实现鼠标抓拍拖拽排序功能
By
admin
at 2017-11-20 • 2人收藏 • 2441人看过
import win.ui;
/*DSG{{*/
var winform = win.form(text="listview拖拽排序功能演示";right=614;bottom=300;parent=...)
winform.add(
listview={cls="listview";left=26;top=23;right=575;bottom=274;bgcolor=16777215;db=1;dl=1;dr=1;dt=1;edge=1;fullRow=1;gridLines=1;msel=false;z=1}
)
/*}}*/
//import console;
//console.open();
//鼠标流程1:按下--拖拽--松开了
//鼠标流程2:按下--单击(按松一次)--移动
import mouse;
var mouseLeftdown,mouseDragmove,bx,by;//鼠标左键按下,鼠标拖拽移动
var plusAkeydownPosX,plusAkeydownPosY;//拖动时候鼠标在plus上面的位置
var preItem,newItem;//存储拖拽的序号
import win.imageList;
var imaglist = win.imageList(1,40);
winform.listview.setImageList( imaglist,2/*_LVSIL_STATE*/ )
winform.listview.insertColumn("测试项1",80)
winform.listview.insertColumn("测试项2",100)
winform.listview.insertColumn("测试项4",100)
winform.listview.insertColumn("测试项3",-1)
for(i=1;33;1){
winform.listview.addItem({tostring(i);"点我"++tostring(i)++"1";"点我"++tostring(i)++"2";"点我"++tostring(i)++"3"});
}
winform.listview.wndproc = function(hwnd,message,wParam,lParam){
select( message ) {
case 0x201/*_WM_LBUTTONDOWN*/
{
//console.log("左键按下")
//鼠标左键按下了
mouseLeftdown = true;
//记录下此时的xy
plusAkeydownPosX,plusAkeydownPosY = mouse.getPos();
}
case 0x202/*_WM_LBUTTONUP*/
{
//console.log("左键松开了")
mouseLeftdown = false;
if(mouseDragmove){
mouseDragmove = false;
winform.listview.plusA.hide = true;
if(newItem != preItem){
var tabtext = {};
for(i=1;winform.listview.columnCount;1){
table.push(tabtext,winform.listview.getItemText(preItem,i));
}
//注意这里!!!
//会导致一个问题:
//向上拖动后,会在选中行上部添加
//向下拖动后,会在选中后下部添加
//其实仔细想想这样也符合常理....于是不改了...
winform.listview.delItem(preItem);
winform.listview.addItem(tabtext,newItem);
}
}
}
case 0x200/*_WM_MOUSEMOVE*/{
//console.log("鼠标移动111111")
if(mouseDragmove){
var x,y = mouse.getPos();
var fx,fy = win.toClient(winform.listview.hwnd,x,y)
newItem = winform.listview.hitTest();
winform.listview.selIndex = newItem;
winform.listview.plusA.setPos(fx-bx,fy-by);
winform.listview.plusA.redraw();
//winform.listview.redraw();
}
}
}
}
import gdip;
winform.listview.onnotify = function(id,code,ptr){
select( code ) {
case 0xFFFFFFFE/*_NM_CLICK*/ {
//console.log("左键单击(按松一次)")
mouseLeftdown = false;
}
case 0xFFFFFF93/*_LVN_BEGINDRAG*/{
//console.log("拖拽22222")
//先判断是否在有效行上点击
if(mouseLeftdown){
winform.listview.setFocus()
var item = winform.listview.hitTest(plusAkeydownPosX,plusAkeydownPosY,true);
if(item){
preItem = item;
var rc = winform.listview.getItemRect(item);
var picture = com.picture.snapClient(winform.listview.hwnd,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top);
winform.listview.addCtrl(
plusA ={ cls="plus";left=0;top=0;right=50;bottom=50;autoResize=false ;bgcolor=12639424;hide=1;edge=1; clip=1;z=10; }
)
winform.listview.plusA.setRect(rc);
var bmp = gdip.bitmap(picture);
winform.listview.plusA.setBackground(bmp);
winform.listview.plusA.show();
mouseDragmove = true;
bx,by = win.toClient(winform.listview.plusA.hwnd,plusAkeydownPosX,plusAkeydownPosY);
}
}
}
}
}
winform.show()
win.loopMessage();
3 个回复 | 最后更新于 2021-01-09
2021-01-03
#2
你好,可否帮忙实现一下,拖放到要插入项上方时,不要亮显原位置的项,而是在其上方画一条表示插入位置的指示线。
另外,还想请教两个问题:
1、是否可以实现在不同控件间拖放项目?
2、是否可以实现除文件拖放外的系统拖放?如文本、浏览器拖出来的url之类。
谢谢。
登录后方可回帖
以上代码还可以精简,不用gdip进行再次包装,可以直接使用pic.handle
所以可以将gdip.bitmap()注释掉...
实现的功能和上面的一样.