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行字体来实现的,

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();


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...