listbox+plus实现鼠标拖拽排序
By
admin
at 2017-11-20 • 0人收藏 • 1877人看过
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这种单一的应用来说,有点大材小用了...
推荐一楼那种方式.
这个可以学下,但是就不要应用在实际中了....
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;//存储拖拽的序号 var pretext; 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(pretext,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); //抓拍 var picture = com.picture.snapClient(winform.listbox.hwnd,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top); //给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); //保存拖拽行文字 pretext = winform.listbox.getItemText(item); //设置抓拍为背景 winform.listbox.plusA.setBackground(picture.Handle); //显示 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();