Listview+plus+capture实现鼠标抓拍拖拽排序功能

By admin at 2017-11-20 • 2人收藏 • 2301人看过
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();

GIF.gif

3 个回复 | 最后更新于 2021-01-09
2017-11-20   #1

以上代码还可以精简,不用gdip进行再次包装,可以直接使用pic.handle

所以可以将gdip.bitmap()注释掉...

//var bmp =  gdip.bitmap(picture);
winform.listview.plusA.setBackground(picture.Handle);

实现的功能和上面的一样.

2021-01-03   #2

你好,可否帮忙实现一下,拖放到要插入项上方时,不要亮显原位置的项,而是在其上方画一条表示插入位置的指示线。

另外,还想请教两个问题:

1、是否可以实现在不同控件间拖放项目?

2、是否可以实现除文件拖放外的系统拖放?如文本、浏览器拖出来的url之类。

谢谢。

2021-01-09   #3

回复#2 @royalxavier :

你这些需求, 不要用winform了, 用sciter或者htmlayout来实现, 会简单很多, 各种跨域拖拽, 还附赠很多过渡动画哦.

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



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

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

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...