listbox+plus实现鼠标拖拽排序
By
admin
at 2017-11-20 • 0人收藏 • 1758人看过
import win.ui; /*DSG{{*/ var winform = win.form(text="listbox实现鼠标拖拽排序功能";right=408;bottom=362;parent=...) winform.add( listbox={cls="listbox";left=15;top=12;right=398;bottom=337;bgcolor=16777215;db=1;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(name='Verdana');hscroll=1;items={};vscroll=1;z=1} ) /*}}*/ //设置字体大小来调整listbox每行的高度 winform.listbox.setFont(point=40;name="宋体"); for(i=1;50;1){ winform.listbox.add("abcd"++ i ) } import gdip; import mouse; var mouseLeftdown,mouseDragmove,bx,by;//鼠标左键按下,鼠标拖拽移动 var plusAkeydownPosX,plusAkeydownPosY;//拖动时候鼠标在plus上面的位置 var preItem;//存储拖拽的序号 winform.listbox.wndproc = function(hwnd,message,wParam,lParam){ select( message ) { case 0x205/*_WM_RBUTTONUP*/{ var x,y = win.getMessagePos(); var item = winform.listbox.hitTest(x,y,true); if( item ){ winform.listbox.selIndex = item; winform.popmenu.popup(x,y,true) } } case 0x201/*_WM_LBUTTONDOWN*/{ //鼠标左键按下了 mouseLeftdown = true; //记录下此时的xy plusAkeydownPosX,plusAkeydownPosY = mouse.getPos(); } case 0x202/*_WM_LBUTTONUP*/ { //鼠标左键松开了 mouseLeftdown = false; if(mouseDragmove){ mouseDragmove = false; winform.listbox.plusA.hide = true; //获取当前选中项 if(winform.listbox.selIndex != preItem){ winform.listbox.delete(preItem); winform.listbox.add(winform.listbox.plusA.text,winform.listbox.selIndex); } } } case 0x200/*_WM_MOUSEMOVE*/{ if(mouseLeftdown){ if(!mouseDragmove){ //先判断是否在有效行上点击 var item = winform.listbox.hitTest(x,y,true); if(item){ preItem = item; //获取点击行的尺寸 var rc = winform.listbox.getItemRect(item); //给listbox添加一个plus winform.listbox.addCtrl( plusA ={ cls="plus";left=0;top=0;right=50;bottom=50;autoResize=false;align="left";hide=1;bgcolor=14466531;edge=1;clip=1;notify=1;z=10; } ) //设置plus的大小和位置 winform.listbox.plusA.setRect(rc); //设置plus的字体 winform.listbox.plusA.setFont(winform.listbox.getFont()); //设置plus的文本 winform.listbox.plusA.text = winform.listbox.getItemText(item); //显示 winform.listbox.plusA.show(); mouseDragmove = true; //格式化鼠标位置为相对于被点击的按钮的位置坐标 bx,by = win.toClient(winform.listbox.plusA.hwnd,plusAkeydownPosX,plusAkeydownPosY); } }else { var x,y = mouse.getPos(); //格式化鼠标当前位置为相对于软件窗口位置坐标 var fx,fy = win.toClient(winform.listbox.hwnd,x,y) //设置按钮位置为相对于软件窗口的位置 winform.listbox.plusA.setPos(fx-bx,fy-by); winform.listbox.plusA.redraw(); } } } } } winform.show() win.loopMessage();
以上代码是利用plus上面画原来listbox行字体来实现的,
我以前还写过一个Plus+capture 实现拖拽功能,二楼就用这种方式.
1 个回复 | 最后更新于 2017-11-20
登录后方可回帖
这次就以Plus + capture抓拍来实现拖拽
这里要注意,一楼那个是直接在plus中设置字体和字体样式,这样拖拽结束可以直接把plus里面的文字赋值给listbox所在行.
但是,这里用抓拍的话,就应该像listview一样,采用曲线救国,设置一个变量保存拖拽文字值.
于是,其实这个办法对于listbox这种单一的应用来说,有点大材小用了...
推荐一楼那种方式.
这个可以学下,但是就不要应用在实际中了....