1. 程式人生 > 實用技巧 >aardio listview可編輯可改色增強庫

aardio listview可編輯可改色增強庫

專案需要,功能需要實現列表編輯,輸入判斷,背景色修改,通過查詢論壇程式碼: http://bbs.aardio.com/forum.php?mod=viewthread&tid=22568

獲得了大神實現的庫,但發現一些問題,比如

1.背景色修改之後無法恢復到原來的狀態, 得手動記錄修改前的值

2.無法獲知編輯通知

3.無法限制輸入是數字還是字串

所以根據需要修改了下庫程式碼

效果圖

使用方法:

lvGrid.ctrl( listview ); //開啟改色編輯, listview 必須有 fullRow=1 屬性
listview.preventEtidCol(1,3); //阻止指定例編輯, 示例 阻止第1與第3列編輯
listview.nthChild(隔的行數, 隔行色值, 其它行色值); //隔行變色, 第一第二引數要設定, 第三是可選
listview.setItemColor(行號, 色值); //設定行的文字顏色 ,不給顏色值就是恢復原本顏色
listview.setItemColorBk(行號, 色值); //設定行的背景顏色,不給顏色值就是恢復原本顏色
listview.editChanged(原來的文字,更新的文字,行號,列號)//回撥函式

庫程式碼:

//lvGrid 可編輯列表檢視
/***********************************************************************
	改色的 是 lujjjh  的程式碼 論壇帖子 http://www.aau.cn/thread-7601-1-1.html
	原地編輯 是 adsadss 的程式碼 論壇帖子 http://www.aau.cn/thread-5446-1-1.html
	整合上述程式碼的帖子:http://bbs.aardio.com/forum.php?mod=viewthread&tid=22568
	
	在上述基礎上根據自己的專案添加了恢復顏色, 變更回撥,和輸入型別判斷
	lvGrid.ctrl( listview ); //開啟改色編輯, listview 必須有 fullRow=1 屬性
	listview.preventEtidCol(1,3); //阻止指定例編輯, 示例 阻止第1與第3列編輯
	listview.nthChild(隔的行數, 隔行色值, 其它行色值); //隔行變色, 第一第二引數要設定, 第三是可選
	listview.setItemColor(行號, 色值); //設定行的文字顏色 ,不給顏色值就是恢復原本顏色
	listview.setItemColorBk(行號, 色值); //設定行的背景顏色,不給顏色值就是恢復原本顏色
    listview.editChanged(原來的文字,更新的文字,行號,列號)//回撥函式,注意在回撥這個的時候,listview可能還未重新整理,直接獲取list專案值需要延遲一下

***********************************************************************/
import win;
import util;
import win.imageList;
import win.util.tray;
import key.ime;
import mouse;
import win.ui;
namespace lvGrid;

ctrl = (function () {
    var NMLVCUSTOMDRAW = class {
        struct nmcd = {
            struct hdr = ..win.ui.NMHDR();
            INT dwDrawStage;
            pointer hdc;
            struct rc = ::RECT();
            int dwItemSpec;
            INT uItemState;
            int lItemlParam;
        };
        INT clrText;
        INT clrTextBk;
        INT font;
        int iSubItem;
        INT dwItemType;
        INT clrFace;
        int iIconEffect;
        int iIconPhase;
        int iPartId;
        int iStateId;
        struct rcText = ::RECT();
        INT uAlign;
    }
	var LVITEM = class { /* 項 */
		INT		mask; 
		int		iItem; 
		int		iSubItem; 
		INT		state; 
		INT		stateMask; 
		string	text; 
		int		cchTextMax; 
		int		iImage; 
		int		lParam;
		int		iIndent;
		int		iGroupId;
		INT		cColumns;
		struct	puColumns = ::POINT();
	}
	
	var LVCOLUMN = class { /* 列 */
		INT		mask;
		int		fmt; 
		int		cx; 
		string	text; 
		int		cchTextMax; 
		int		iSubItem; 
		int		iImage;
		int		iOrder;
	}
	
    return function (listview) {
    	listview.preventetidcols = {};
    	listview.nthchilds = {};
    	listview.setsorttab = {};
    	listview.onlynum = {};
    	listview.currEditCol = {};
        listview._colors1 = ..table.array(listview.count, 0);
        listview._colors2 = ..table.array(listview.count, 0);
       // listview.capture = true;
        listview._colors1old = ..table.array(listview.count, 0);
        listview._colors2old = ..table.array(listview.count, 0);
        
        listview.setExtended(0x10000/*_LVS_EX_DOUBLEBUFFER*/);//啟用雙緩衝,避免閃爍

		

        listview._prenotify = function (id,code,ptr) {
            
        	select(code) {
        		
        		case 0xFFFFFFF4/*_NM_CUSTOMDRAW*/ {
                	var nmlvcd = NMLVCUSTOMDRAW();
                	..raw.convert(ptr, nmlvcd);
                	..raw.mixin(ptr, nmlvcd, { clrText = owner._colors1[nmlvcd.nmcd.dwItemSpec +1 ] });
                        	..raw.mixin(ptr, nmlvcd, { clrTextBk = owner._colors2[nmlvcd.nmcd.dwItemSpec +1 ] });
                	select (nmlvcd.nmcd.dwDrawStage) {
                    	case 0x1/*_CDDS_PREPAINT*/ {
                        	return 0x20/*_CDRF_NOTIFYITEMDRAW*/
                    	} 
                	}
        		}
        		case 0xFFFFFF94/*_LVN_COLUMNCLICK*/ {
        			var nmlvw = ..win.ui.ctrl.listview.NMLISTVIEW();
        			..raw.convert(ptr, nmlvw);
					var ind = nmlvw.iSubItem + 1;
					if( owner.setsorttab[ind] )
						owner.sort(ind, owner.setsorttab[ind]);

    			}
        		case (0xFFFFFFFE/*_NM_CLICK*/||0xFFFFFFFC/*_NM_RETURN*/ ){
        			
        			var notifyMessage = owner.getNotifyMessage(code,ptr);
        			for(k,v in owner.preventetidcols)
        				if( notifyMessage.iSubItem == v) return ;
        			if( ! notifyMessage.iItem && notifyMessage.iSubItem ) return ;
        			var edit = owner.editlable
        			if( ! edit ){
        				
            			owner.addCtrl(
                			editlable = { 
                    			cls="edit";font = LOGFONT( h = 15 );left = 0;top = 0;border=1;
                    			right = 50;bottom = 50;autoResize = false ;hide = 1;
                    			wndproc = function( hwnd, message, wParam, lParam ){
                    				var update;
                        			if( ( message = 0x8/*_WM_KILLFOCUS*/)  || message == 0x101/*_WM_KEYUP*/ && wParam == 0xD/*_VK_RETURN*/  ) {
                            			update = true;
                            			
                        			}
                        			elseif(message == 0x201/*_WM_LBUTTONDOWN*/ || message == 0x202/*_WM_LBUTTONUP*/ ){
                        				var x,y = ..win.getMessagePos(lParam)
                        				var rc = edit.clientRect;  
                        				if( ! ::PtInRect(rc,x,y) ){
                        					update = true;
                        					edit.capture = false;
                        				}
                        				else{
                        					edit.capture = true;//是否捕獲全域性滑鼠訊息
                        				}
                        			} 
                        			//更新了
                        			if( update&&owner.parent.editChanged ){
                        					if(edit.oldText!=owner.text){
                        						owner.parent.editChanged(edit.oldText,owner.text, owner.listViewNotifyMessage.iItem
                                										, owner.listViewNotifyMessage.iSubItem);
                                				edit.oldText = owner.text;
                        					}	
                            			owner.parent.setItemText( owner.text, owner.listViewNotifyMessage.iItem
                                			, owner.listViewNotifyMessage.iSubItem );
                            			 owner.show(false);
                        			}
                    			}
                    			
								oncommand = function(id,event){
										if(event==0x0400&&edit.onlyNum==1&&edit.text!=null){
											if(edit.text=="-"){
												edit.text="-0";
												edit.setFocus(2, -1); 
											}elseif(edit.text=="0x"){
												edit.text="0x0";
												edit.setFocus(3, -1); 	
											}elseif(edit.text==""||tonumber(edit.text)==null){
													edit.showErrorTip("非法輸入","只能輸入實數")
													edit.text="0";
													edit.setFocus(0, -1);
											}
											
											
										}
								}	
                			}
            			)  
            			edit = owner.editlable;
            			
        			}else {
        				edit.onlyNum=0;
        			}
        			
        			edit.listViewNotifyMessage = notifyMessage; 
        			edit.text = owner.getItemText(notifyMessage.iItem,notifyMessage.iSubItem);
        			var rc = owner.getItemRect( notifyMessage.iItem,notifyMessage.iSubItem,,2/*_LVIR_LABEL*/ );
        			edit.setRect(rc);
        			edit.oldText = edit.text;
        			edit.setFocus(0, -1); //例行
        			edit.capture = true;
        			
        			for(k,v in owner.onlynum){
						if( notifyMessage.iSubItem == v){edit.onlyNum=1;break;}
        			}
        			if(edit.onlyNum==0){
						..key.ime.setOpenStatus(1);	//開啟中文輸入法
        			}else {
        				..key.ime.setOpenStatus(0);	//關閉中文輸入法
        			}
        			
        			edit.show();	
        		}
        	}
        }
        listview.preventEtidCol = function(...){ //阻止編輯例..讓某例不能編輯
        	owner.preventetidcols = {...};
        }
        
        listview.nthChild = function(...){ //隔行變色
        	owner.nthchilds = {...};
        }
        listview.onlyNum = function(...){
        	 owner.onlynum= {...};
        }
        
        listview.setItemColor = function (item, col) {
            if(col){
            	owner._colors1[item] = col;
            }else {
            	owner._colors1[item] = owner._colors1old[item];
            }
            
            
        }
        listview.setItemColorBk = function (item, col) {
             if(col){
            	owner._colors2[item] = col;
            }else {
            	owner._colors2[item] = owner._colors2old[item];
            }
        }
        listview.addItem = ..util.connect(listview, listview.addItem,
            function (text, ind, ...) {
                if (ind){
                    ..table.insert(owner._colors1, 0, ind);
                    ..table.insert(owner._colors1old, 0, ind);
                }else{
                	..table.push(owner._colors1, 0);
                    ..table.insert(owner._colors1old, 0);
                }
                    
                
                if( #owner.nthchilds > 1 ){
                	var index = owner.count+1;
                	if( index % owner.nthchilds[1] == 0){
                		owner._colors2[index] = owner.nthchilds[2];
                		owner._colors2old[index]  = owner.nthchilds[2];
                	}else{
                		owner._colors2[index] = owner.nthchilds[3];
                		owner._colors2old[index]  = owner.nthchilds[3];
                	}
                }
            }
        );
        
        listview.delItem = ..util.connect(listview, listview.delItem,
            function (item) {
                ..table.remove(owner._colors1, item);
            }
        );
    	
    }
})();

/**intellisense(lvGrid)
ctrl(__/*listview*/) = 使列表檢視可編輯
ctrl() = !listview.
end intellisense**/