Listview+plus+capture实现鼠标抓拍拖拽排序功能
By
admin
at 2017-11-20 • 2人收藏 • 2316人看过
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()注释掉...
实现的功能和上面的一样.