aardio listview可編輯可改色增強庫
阿新 • • 發佈:2020-11-13
專案需要,功能需要實現列表編輯,輸入判斷,背景色修改,通過查詢論壇程式碼: 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**/