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

By admin at 2017-11-20 • 0人收藏 • 590人看过
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

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

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

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

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

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

登录后方可回帖

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