listbox+plus实现鼠标拖拽排序

By admin at 2017-11-20 • 0人收藏 • 805人看过
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行字体来实现的,

gifTest.gif

我以前还写过一个Plus+capture 实现拖拽功能,二楼就用这种方式.


1 个回复 | 最后更新于 2017-11-20
2017-11-20   #1

这次就以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();


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
Htmlayout界面在线学习文档
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...