aardio实现树形记事本

最近发现一个编程助手程序如图,用着挺不错可惜没有开放源码,于是就想着利用aardio尝试复制一个出来。

 项目完整源码地址:链接: https://pan.baidu.com/s/1B-zAP29ZyX9OfJNB0katzg?pwd=edvi 提取码: edvi 

下面分模块解析代码:

1.窗口靠边吸附效果

class dock{
    ctor(winform, acts=10/*每过程动作次数*/, isTop=false/*置顶*/, isDock=true/*吸附*/, margin=false/*留边*/){
        assert(winform[["hwnd"]], "参数@1必须是窗体对象");
        acts = ..math.abs(tonumber(acts) : 1);
        
        //this = win.form(); this.messageOnly();
        this = winform;
        this.site, this.msIn = "", 0;
        var scrw, scrh = win.getScreen();
        
        var wndGdi, alSign = _wndGdi();
        var wndAlpha = function(v = false, w, h){
            alSign = !!v;
            if(!alSign){
                this.transparent(false);
                //this.hide = 1; this.hide = 0;
                //this.redraw();
                _redrawWindow(this.hwnd, , , 0x400/*_RDW_FRAME*/ | 0x1/*_RDW_INVALIDATE*/ | 0x4/*_RDW_ERASE*/)
                return;
            }
            this.transparent(true);
            var col = margin ? 0xaad2d2d2 : 0x01d2d2d2
            wndGdi(this.hwnd, w, h, function(mdc, w, h){
                var gph = gdip.graphics(mdc)
                var gBru = gdip.solidBrush(col)
                gph.fillRectangle(gBru, 0, 0, w, h)
                gBru.delete()
                gph.delete()
                gdi.updateLayeredWindow(this.hwnd, mdc, ::SIZE(w, h), gdi.blendFunction(255/*透明度*/))
            })
        }
        
        var ap = {}; //aTimer动作定时器运行时参数
        var aTimer = win.timer(, 10);
        aTimer.onTimer = function(hwnd,msg,id,tick){
            var c = true;
            if(ap[["site"]] == "top"){
                ap.y += ap.v;
                c = ap.msIn ? !(ap.y<0) : !(ap.y>4-ap.h);
                if(c) ap.y = !ap.msIn ? 4-ap.h : 0;
            }
            elseif(ap[["site"]] == "left"){
                ap.x += ap.v;
                c = ap.msIn ? !(ap.x<0) : !(ap.x>4-ap.w);
                if(c) ap.x = !ap.msIn ? 4-ap.w : 0;
            }
            elseif(ap[["site"]] == "right"){
                ap.x -= ap.v;
                c = ap.msIn ? !(ap.x>scrw-ap.w) : !(ap.x<scrw-4);
                if(c) ap.x = ap.msIn ? scrw-ap.w : scrw-4;
            }
            this.setPos(ap.x, ap.y);
            if(c){
                if(#ap[["site"]] && !ap.msIn){
                    wndAlpha(1, ap.w, ap.h);
                    if(!isTop) win.setTopmost(this.hwnd);
                }
                elseif(!isTop) win.setTopmost(this.hwnd, false);
                owner.disable();
            }
            elseif(alSign) wndAlpha(, ap.w, ap.h);
        }
        
        var msPos = ::POINT();
        var mTimer = win.timer(, 10);
        mTimer.onTimer = function(hwnd,msg,id,tick){
            var x, y, w, h = this.getPos();
            if(w >= scrw) return;
            
            //**判断窗口停靠位置
            var site = ""
            if(x <= 0) site = "left";
            elseif(x+w >= scrw) site = "right";
            elseif(y <= 0) site = "top";
            
            if(this.site != site){
                this.site = site
                ::PostMessage(this.hwnd, 0x503, 0, 0)
            }
            //**/
            
            //**检测鼠标进出窗口 左键状态 判断是否动作
            _getMsPos(msPos)
            var msIn = _msIn(msPos.x, msPos.y) ? 1 : 0
            var v = _getAsyncKeyState(1)
            if(this.msIn != msIn){
                this.msIn = msIn
                ::PostMessage(this.hwnd, 0x5A3, 0, 0)
            }
            elseif(!v) return;
            if(!#site || v) return;
            //**/
            
            //**执行动作
            v = (site == "top") ? ..math.ceil(h/acts) : ..math.ceil(w/acts);
            v = msIn ? v : -v;
            ap.site,ap.msIn,ap.x,ap.y,ap.w,ap.h,ap.v = site,msIn,x,y,w,h,v;
            aTimer.enable();
            //**/
        }
        
        this.wndMargin = function(v = false){
            margin = !!v
        }
        
        //**窗口呼出
        this.wndDisplay = function(){
            var x, y, w, h = owner.getPos();
            if(x<0) x = 0
            elseif(x+w>scrw) x = scrw-w
            if(y<0) y = 0
            elseif(y+h>scrh) y = scrh-h
            owner.setPos(x, y)
            owner.transparent(false)
        }
        this.wndDisplay()
        //**/
        
        //**窗口置顶 避免与aTimer里的win.setTopmost冲突
        this.wndTopmost = function(v){
            isTop = !!v
            win.setTopmost(owner.hwnd, isTop)
            return isTop;
        }
        this.wndTopmost(isTop)
        //**/
        
        //**窗口吸附
        this.wndDock = function(v = true){
            isDock = !!v
            if(isDock) mTimer.enable();
            else { mTimer.disable(); owner.wndDisplay() }
            return isDock;
        }
        this.wndDock(isDock)
        //**/
        
        this.wndproc = {
            [0x7E/*_WM_DISPLAYCHANGE 屏幕分辨率改变*/] = function(hwnd,message,wParam,lParam){
                scrw, scrh = win.getScreen();
                owner.wndDisplay()
            }
        }
        ::PostMessage(this.hwnd, 0x5A3, 0, 0);
    };
}
namespace dock{
    import win.timer;
    import gdip.graphics;
    import gdip.solidBrush;
    import gdi;
   
    _getMsPos = ::User32.GetCursorPos;
    _redrawWindow = ::User32.RedrawWindow;
    _fromPoint = ::User32.WindowFromPoint;
    _getAsyncKeyState = ::User32.GetAsyncKeyState;
    _getWindowThreadProcessId = ::User32.GetWindowThreadProcessId;
    _msIn = function(x, y){
        var hwnd = _fromPoint(x, y);
        return _getWindowThreadProcessId(hwnd, 0) == ..thread.getId();
    }
    _wndGdi = function(){
        var hdc, mdc, hbmp;
        var create = function(hwnd, w, h){
            hdc = ::GetWindowDC(hwnd);
            mdc = ::CreateCompatibleDC();
            hbmp = ::CreateCompatibleBitmap(hdc, w, h);
            ::SelectObject(mdc, hbmp);
        }
        var delete = function(hwnd){
            ::ReleaseDC(hwnd, hdc);
            ::DeleteDC(mdc);
            ::DeleteObject(hbmp);
        }
        return function(hwnd, w, h, draw, ...){
            create(hwnd, w, h);
            if(type(draw) == "function") draw(mdc, w, h, ...);
            delete(hwnd);
        }
    }
}

/*}}*/



//拷贝吸附
var wndObj = dock(mainForm, 30);
wndObj.wndDock();
//留边
mainForm.wndMargin(true)

2.treeview控件事件监听

mainForm.treeview.onnotify = function(id,code,ptr){
    
    select( code ) { 
        case 4294967284/*_NM_CLICK*/ {
        //case 0xFFFFFFFE/*_NM_CLICK*/ {
            //console.log("左键单击(按松一次)")
            mouseLeftdown = false;    
        }
        case 4294967279/*_LVN_BEGINDRAG*/{
        //case 0xFFFFFF93/*_LVN_BEGINDRAG*/{
            //console.log("拖拽22222")
            //先判断是否在有效行上点击
            if(mouseLeftdown){
                mainForm.treeview.setFocus()
                   var item = mainForm.treeview.hitTest(plusAkeydownPosX,plusAkeydownPosY,true);
                if(item){
                    preItem = item;
                    var rc = mainForm.treeview.getItemRect(item);
                    var picture = com.picture.snapClient(mainForm.treeview.hwnd,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top);
                    mainForm.treeview.addCtrl(
                        plusA ={ cls="plus";left=0;top=0;right=50;bottom=50;autoResize=false ;bgcolor=12639424;hide=1;edge=1; clip=1;z=10; }
                    
                    )
                    mainForm.treeview.plusA.setRect(rc);
                      //设置plus的字体
                    mainForm.treeview.plusA.setFont(mainForm.treeview.getFont());
                    //设置plus的文本
                    mainForm.treeview.plusA.text = mainForm.treeview.getItemText(item);
                    mainForm.treeview.plusA.show();
                    mouseDragmove = true;
                    bx,by = win.toClient(mainForm.treeview.plusA.hwnd,plusAkeydownPosX,plusAkeydownPosY);
                    
                }
            }
        }
    }
      if( code == 0xFFFFFE3D/*_TVN_SELCHANGEDW*/ ){ //改变选项
          
      }
      if(code == 0xFFFFFE35){
          return false; //允许编辑项
      }
      if(code == 0xFFFFFFFD){//双击
          //mainForm.treeview.editLabel(mainForm.treeview.getSelection())
      }
    if(code == 0xFFFFFE34){//编辑完成
          var dispInfo = mainForm.treeview.getNotifyDispInfo(code,ptr)
         if( dispInfo[["item"]][["text"]] && dispInfo[["item"]][["text"]] != "") { //取消为空
             var itemdata = mainForm.treeview.getItemData(dispInfo.item.hItem);
             //验证重名
             var result  = sqlConnection.stepQuery("select gr_id from 内容表 where gr_tag<>'未命名' and gr_pid=@gr_pid and gr_tag=@gr_tag and gr_id<>@gr_id limit 1;",{
                gr_pid = itemdata.gr_pid;
                gr_id = itemdata.gr_id;
                gr_tag = dispInfo.item.text;
            })
            if(result){
                mainForm.msgbox("同层类目节点名称重复")
                return false;
            }
             mainForm.treeview.setItemText( dispInfo.item.hItem, dispInfo.item.text ) ;
             //更新数据库
             sqlConnection.exec("UPDATE 内容表 SET gr_tag = @gr_tag WHERE gr_id = @gr_id;",{
                gr_tag = dispInfo.item.text;
                gr_id = itemdata.gr_id;
            } );
         } else {
             mainForm.msgbox("类目名称不能为空")
         }
      }
    if( code == 0xFFFFFFFE/*_NM_CLICK*/ ){ 
        if(child != null){
            //销毁原窗口
              child.close();
              child = null;
          }
        var hItem = mainForm.treeview.hitTest() 
        //当前选中节点 
        if(hItem){ 
             //mainForm.treeview.getItemText(hItem);
             var data =  mainForm.treeview.getItemData(hItem);
             //获取当前鼠标位置
             var mx,my = mouse.getPos();
             //判断是否是子节点
             if(data != null && data.gr_sonnum == 0 && data.hascontent == 1){
                 //展示内容
                //依附当前主窗口的子窗口实现
                mainForm.iseditmode = false;//预览模式
                child = mainForm.loadForm("\res\frmChild.aardio");
                child.width = tonumber(540);
                child.height = tonumber(358);
                //wbLayout.go("\res\skin\showcode.htm");//显示
                //使用aardio模板渲染
                var result  = sqlConnection.stepQuery("select * from 内容表 where gr_id=@gr_id;",{
                    gr_id = data.gr_id;
                })
                wbLayout.loadcode(string.load("\res\skin\showcode.htm"),result);
                //wbLayout.go("\res\skin\editcode.html");//编辑
                child.show();
                var x,y,cx,cy = mainForm.getPos();
                var xOther,yOther,cxOther,cyOther = child.getPos();
                mainForm.xSave,mainForm.ySave = x,y;
                child.setPos(mainForm.xSave + mainForm.width - 1,my,cxOther,cyOther);
            
             }
        }
    }
    elseif(code = 0xFFFFFFFB/*_NM_RCLICK*/){ 
        mouseLeftdown = false;
        if(mainForm.treeview.plusA){
            //隐藏拖拽控件
            mainForm.treeview.plusA.hide = true;
        }
        var x,y = win.getMessagePos();
        var hItem,tvht = mainForm.treeview.hitTest(x,y,true);
        var menu = win.ui.popmenu(mainForm);
        menu.add("添加主类目",
            function(){
                //获取当前父级节点
                var pdata = mainForm.treeview.getParentItemData(hItem);
                //没有父节点情况
                if(pdata == null){
                    pdata = {gr_pid=0;gr_sonnum=0;};
                }
                
                var result  = sqlConnection.stepQuery("select max(gr_seq) as max_gr_seq from 内容表 where gr_pid = @gr_pid;",{
                    gr_pid = pdata.gr_pid;
                } );
                var newgr_seq = result && result.max_gr_seq ? result.max_gr_seq + 1 : 1;
                var tm = time.now();
                var addtime  = tostring(tm,"%Y年%m月%d日 %H时%M分%S秒","chs")
                var command = sqlConnection.prepare('INSERT INTO 内容表
                                                            ( gr_pid ,
                                                              gr_sonnum ,
                                                              gr_tag ,
                                                              gr_seq,
                                                              gr_times
                                                            )
                                                     VALUES ( @gr_pid ,
                                                              @gr_sonnum ,
                                                              @gr_tag ,
                                                              @gr_seq,
                                                              @gr_times
                                                            );'
                        ) ;
                command.bind.parameterByNames(
                        ['@gr_pid'] = pdata.gr_pid;        //分类ID
                        ['@gr_sonnum'] = 0;        //子类目数量
                        ['@gr_tag'] = "未命名";        //名称
                        ['@gr_seq'] = newgr_seq;
                        ['@gr_times'] = addtime;        //时间
                );
                       
                command.step();        //执行命令
                command.finalize();
                var result  = sqlConnection.stepQuery("select last_insert_rowid() AS id from 内容表 LIMIT 1;")
                   if(result.id){
                       //新增一条类目
                       var newhItem = mainForm.treeview.insertItem("未命名",hItem);
                       mainForm.treeview.setItemData(newhItem,{
                       gr_id=result.id;
                       gr_sonnum=0;
                       gr_pid=pdata.gr_pid;
                       gr_tag="未命名";
                       text="未命名";
                       });
                       //设置当前节点编辑
                       mainForm.treeview.setSelected(newhItem);
                        mainForm.treeview.editLabel(newhItem);
                       //更新父类节点sonnum
                       if(hItem != null){
                           pdata.gr_sonnum = pdata.gr_sonnum + 1;
                           mainForm.treeview.setItemData(hItem,pdata);
                           sqlConnection.exec("UPDATE 内容表 SET gr_sonnum = @gr_sonnum WHERE gr_id = @gr_id;",{
                            gr_sonnum =  pdata.gr_sonnum;
                            gr_id = pdata.gr_id;
                        } );
                            //父节点展开
                            mainForm.treeview.expand(hItem);
                       }
                   }
            }
        )
        menu.add("添加子类目",
            function(){
                //获取当前父级节点
                var pdata = mainForm.treeview.getItemData(hItem);
                if(pdata == null){
                    return false;
                }
                var result  = sqlConnection.stepQuery("select max(gr_seq) as max_gr_seq from 内容表 where gr_pid = @gr_pid;",{
                    gr_pid = pdata.gr_id;
                } );
                var newgr_seq = result && result.max_gr_seq ? result.max_gr_seq + 1 : 1;
                
                var tm = time.now();
                var addtime  = tostring(tm,"%Y年%m月%d日 %H时%M分%S秒","chs")
                var command = sqlConnection.prepare('INSERT INTO 内容表
                                                            ( gr_pid ,
                                                              gr_sonnum ,
                                                              gr_tag ,
                                                              gr_seq,
                                                              gr_times
                                                            )
                                                     VALUES ( @gr_pid ,
                                                              @gr_sonnum ,
                                                              @gr_tag ,
                                                              @gr_seq,
                                                              @gr_times
                                                            );'
                        ) ;
                command.bind.parameterByNames(
                        ['@gr_pid'] = pdata.gr_id;        //分类ID
                        ['@gr_sonnum'] = 0;        //子类目数量
                        ['@gr_tag'] = "未命名";        //名称
                        ['@gr_seq'] = newgr_seq;        //排序
                        ['@gr_times'] = addtime;        //时间
                );
                       
                command.step();        //执行命令
                command.finalize();
                var result  = sqlConnection.stepQuery("select last_insert_rowid() AS id from 内容表 LIMIT 1;")
                   if(result.id){
                       //新增一条类目
                        var newhItem = mainForm.treeview.insertItem("未命名",hItem);
                        mainForm.treeview.setItemData(newhItem,{
                            gr_id=result.id;
                            gr_sonnum=0;
                            gr_pid=pdata.gr_id;
                            gr_tag="未命名";
                            text="未命名";
                        });
                        
                        //设置当前节点编辑
                        mainForm.treeview.setSelected(newhItem);
                        mainForm.treeview.editLabel(newhItem);
                        
                        //更新父类节点sonnum
                        pdata.gr_sonnum = pdata.gr_sonnum + 1;
                        mainForm.treeview.setItemData(hItem,pdata);
                        sqlConnection.exec("UPDATE 内容表 SET gr_sonnum = @gr_sonnum WHERE gr_id = @gr_id;",{
                            gr_sonnum =  pdata.gr_sonnum;
                            gr_id = pdata.gr_id;
                        } );
                        //父节点展开
                        mainForm.treeview.expand(hItem);
                   }
            }
        )
        menu.add("排序上移",
            function(){
                //同级节点排序
                var citem = mainForm.treeview.getSelection();
                var cdata = mainForm.treeview.getItemData(citem);
                //获取上传相邻节点
                var result  = sqlConnection.stepQuery("select gr_id,gr_seq,gr_tag from 内容表 where gr_pid=@gr_pid and gr_seq<@gr_seq order by gr_seq desc LIMIT 1;",{
                    gr_pid=cdata.gr_pid;
                    gr_seq=cdata.gr_seq;
                })
                   if(result){
                        sqlConnection.exec("UPDATE 内容表 SET gr_seq = @gr_seq WHERE gr_id = @gr_id;",{
                        gr_seq =  result.gr_seq;
                        gr_id = cdata.gr_id;
                    } );
                    
                    sqlConnection.exec("UPDATE 内容表 SET gr_seq = @gr_seq WHERE gr_id = @gr_id;",{
                        gr_seq =  cdata.gr_seq;
                        gr_id = result.gr_id;
                    } );
                    //重新渲染父类节点下所有子节点
                    var pcItem = mainForm.treeview.getParentItem(citem);
                    var pcItemData = mainForm.treeview.getItemData(pcItem);
                    var childs = {};
                    mainForm.treeview.enum(                                        
                            function(hItem,parent){
                                    phItem = mainForm.treeview.getParentItem(hItem)
                                    while(phItem){
                                        if(tostring(phItem) = tostring(pcItem)){
                                            table.push(childs,hItem);
                                        }
                                        phItem = mainForm.treeview.getParentItem(phItem)
                                    }        
                            }
                    )
                    //删除子节点
                    for(i=1;#childs;1){
                         mainForm.treeview.delItem(childs[i]);
                    }
                    if(pcItem == null){
                        mainForm.treeview.clear();//清空
                    }
                    renderChildItems(pcItem,pcItemData);    
                   }
            }
        )
        menu.add("排序下移",
            function(){
                var citem = mainForm.treeview.getSelection();
                var cdata = mainForm.treeview.getItemData(citem);
                //获取上传相邻节点
                var result  = sqlConnection.stepQuery("select gr_id,gr_seq,gr_tag from 内容表 where gr_pid=@gr_pid and gr_seq>@gr_seq order by gr_seq asc LIMIT 1;",{
                    gr_pid=cdata.gr_pid;
                    gr_seq=cdata.gr_seq;
                })
                   if(result){
                       sqlConnection.exec("UPDATE 内容表 SET gr_seq = @gr_seq WHERE gr_id = @gr_id;",{
                        gr_seq =  result.gr_seq;
                        gr_id = cdata.gr_id;
                    } );
                    
                    sqlConnection.exec("UPDATE 内容表 SET gr_seq = @gr_seq WHERE gr_id = @gr_id;",{
                        gr_seq =  cdata.gr_seq;
                        gr_id = result.gr_id;
                    } );
                    //重新渲染父类节点下所有子节点
                    var pcItem = mainForm.treeview.getParentItem(citem);
                    var pcItemData = mainForm.treeview.getItemData(pcItem);
                    var childs = {};
                    mainForm.treeview.enum(                                        
                            function(hItem,parent){
                                    phItem = mainForm.treeview.getParentItem(hItem)
                                    while(phItem){
                                        if(tostring(phItem) = tostring(pcItem)){
                                            table.push(childs,hItem);
                                        }
                                        phItem = mainForm.treeview.getParentItem(phItem)
                                    }        
                            }
                    )
                    //删除子节点
                    for(i=1;#childs;1){
                         mainForm.treeview.delItem(childs[i]);
                    }
                    if(pcItem == null){
                        mainForm.treeview.clear();//清空
                    }
                    renderChildItems(pcItem,pcItemData);
                   }
            }
        )
        menu.add("删除",
            function(){
                var isok = win.msgboxTest("是否确认删除?")
                if(isok){
                    var cdata = mainForm.treeview.getItemData(hItem);
                    sqlConnection.exec("UPDATE 内容表 SET gr_deleted = 1 WHERE gr_id = @gr_id;",{
                        gr_id = cdata.gr_id;
                    } );
                    mainForm.treeview.delItem(hItem)
                }
            }
        )
        
        menu.add("重名命",
            function(){
                mainForm.treeview.editLabel(hItem)
            }
        )
        
        menu.add("编辑内容",
            function(){
                if(child != null){
                    child.close();
                }
                var citem = mainForm.treeview.getSelection();
                var data =  mainForm.treeview.getItemData(citem);
                //使用aardio模板渲染
                cInfo  = sqlConnection.stepQuery("select * from 内容表 where gr_id=@gr_id;",{
                    gr_id = data.gr_id;
                })
                
                //todo 弹出内容编辑窗口
                child ,webkit= mainForm.loadForm("\res\editForm.aardio",cInfo,sqlConnection,citem);
                child.width = tonumber(597);
                child.height = tonumber(730);
                //webkit.go("\res\skin\editcode.html");
                child.show();
                var x,y,cx,cy = mainForm.getPos();
                var xOther,yOther,cxOther,cyOther = child.getPos();
                mainForm.xSave,mainForm.ySave = x,y;
                child.setPos(mainForm.xSave + mainForm.width - 1,mainForm.ySave,cxOther,cyOther);    
            }
        )
        menu.popup(x,y,true);
    } 
}
mainForm.treeview.wndproc = function(hwnd,message,wParam,lParam){
    select( message ) { 
        case 0x201/*_WM_LBUTTONDOWN*/
        { 
            
            //console.log("左键按下")
            //鼠标左键按下了
            mouseLeftdown = true;
            mouseDragmove = false;
            //记录下此时的xy
            plusAkeydownPosX,plusAkeydownPosY = mouse.getPos();

        }
        case 0x202/*_WM_LBUTTONUP*/
        { 
            //console.log("左键松开了")
            mouseLeftdown = false;
            if(mouseDragmove){
                mouseDragmove = false;
                mainForm.treeview.plusA.hide = true;
                if(newItem != preItem){
                    var nextItemData = mainForm.treeview.getItemData(newItem);
                    var preItemData = mainForm.treeview.getItemData(preItem);
                    if(newItem == null){//没有目标层时默认根目录
                        nextItemData = {gr_id=0;gr_tag="根目录";};
                        if(preItemData.gr_pid == 0){//原有层已是根目录不处理
                            return false;
                        }
                    }
                    //更新数据库
                    //变更子项数目
                    if(preItemData.gr_pid != 0){
                        sqlConnection.exec("UPDATE 内容表 SET gr_sonnum = gr_sonnum - 1 WHERE gr_id = @gr_id;",{
                            gr_id = preItemData.gr_pid;
                        } );
                    }
                    if(nextItemData.gr_id != 0){
                        sqlConnection.exec("UPDATE 内容表 SET gr_sonnum = gr_sonnum + 1 WHERE gr_id = @gr_id;",{
                            gr_id = nextItemData.gr_id;
                        } );
                    }
                    //更新父类编号
                    sqlConnection.exec("UPDATE 内容表 SET gr_pid = @gr_pid,gr_seq=0 WHERE gr_id = @gr_id;",{
                        gr_id = preItemData.gr_id;
                        gr_pid = nextItemData.gr_id;
                    } );
                    //修改排序
                    var result  = sqlConnection.stepQuery("select max(gr_seq) as max_gr_seq from 内容表 where gr_pid = @gr_pid;",{
                            gr_pid = nextItemData.gr_id;
                        } )
                    var newgr_seq = result && result.max_gr_seq ? result.max_gr_seq + 1 : 1;    
                       sqlConnection.exec("UPDATE 内容表 SET gr_seq = @gr_seq WHERE gr_id = @gr_id;",{
                            gr_id = preItemData.gr_id;
                            gr_seq = newgr_seq;
                        } );
                    //查询
                    var newPreData = sqlConnection.stepQuery("SELECT gr_id,
                                                   gr_pid,
                                                   gr_sonnum,
                                                   gr_isexpand,
                                                   gr_tag,
                                                   gr_seq,
                                                   case gr_content when '' then 0 else 1 end as hascontent
                                              FROM 内容表
                                              WHERE gr_deleted=0
                                              AND gr_id=@gr_id",{
                                                  gr_id=preItemData.gr_id;
                                              });
                    var newNextData = sqlConnection.stepQuery("SELECT gr_id,
                                                   gr_pid,
                                                   gr_sonnum,
                                                   gr_isexpand,
                                                   gr_tag,
                                                   gr_seq,
                                                   case gr_content when '' then 0 else 1 end as hascontent
                                              FROM 内容表
                                              WHERE gr_deleted=0
                                              AND gr_id=@gr_id",{
                                                  gr_id=nextItemData.gr_id;
                                              });    
                      mainForm.treeview.delItem(preItem);
                      var newhItem = null;//新节点位置
                      if(newItem == null){//搬移到根目录
                          newhItem = mainForm.treeview.insertItem(newPreData.gr_tag);
                          mainForm.treeview.setItemData(newhItem,newPreData);    
                      } else {
                          mainForm.treeview.setItemData(newItem,newNextData);    
                          newhItem = mainForm.treeview.insertItem(newPreData.gr_tag,newItem);
                          mainForm.treeview.setItemData(newhItem,newPreData);    
                      }
                      renderChildItems(newhItem,newPreData);            
                }
            }
        }
        case 0x200/*_WM_MOUSEMOVE*/{
            //console.log("鼠标移动111111")
            if(mouseDragmove){
                mouseLeftdown = false;
                var x,y = mouse.getPos();
                var fx,fy = win.toClient(mainForm.treeview.hwnd,x,y)
                newItem = mainForm.treeview.hitTest();
                //mainForm.treeview.selIndex = newItem;
                mainForm.treeview.plusA.setPos(fx-bx,fy-by);
                mainForm.treeview.plusA.redraw();
                //mainForm.treeview.redraw();
            }
        }
    }
}

3.窗口间参数传递

//主窗口传递参数
var citem = mainForm.treeview.getSelection();
                var data =  mainForm.treeview.getItemData(citem);
                //使用aardio模板渲染
                cInfo  = sqlConnection.stepQuery("select * from 内容表 where gr_id=@gr_id;",{
                    gr_id = data.gr_id;
                })
                
                //todo 弹出内容编辑窗口
                child ,webkit= mainForm.loadForm("\res\editForm.aardio",cInfo,sqlConnection,citem);
                child.width = tonumber(597);
                child.height = tonumber(730);
                //webkit.go("\res\skin\editcode.html");
                child.show();

//子窗口接收参数

var args = {...};//接收全部参数
var mainForm = args[1];
var cInfo = args[2];
var sqlConnection = args[3];
var citem = args[4];

4.富文本内容赋值和获取

webkit.external = {
    hitmin = function(){
        return winform.hitmin();   
    }
    hitmax = function(){
        return winform.hitmax()
    }
    hitCaption = function(){
        return winform.hitCaption()
    }
    close = function(){
        return winform.close()  
    }
    getLangDirect = cInfo ? cInfo.gr_direct : "";
    saveLangDirect = "";
};

if(cInfo){
    winform.text = "编辑【" + cInfo.gr_tag + "】内容";
}

//文档加载完成时触发
webkit.onDocumentReady = function(url,mainFrameJSState,frameJSState){
    if( mainFrameJSState == frameJSState ){
        if(cInfo != null){
            webkit.querySelector("#langName").value = cInfo.gr_tag;
            webkit.querySelector("#langContent").value = cInfo.gr_content;
            webkit.doScript("setSource()")
        }
    }
}

winform.enableDpiScaling();
winform.show();
winform.onClose = function(hwnd,message,wParam,lParam){
     child = null;
}

winform.button.oncommand = function(id,event){
    var gr_tag = webkit.querySelector("#langName").value;
    var gr_content = webkit.querySelector("#langContent").value;
    webkit.doScript("getSource()")
    var gr_direct = webkit.external.saveLangDirect;
    if(gr_tag == ""){
        winform.msgbox("名称不能为空")
        return false;
    }
    //验证重名
    var result  = sqlConnection.stepQuery("select gr_id from 内容表 where gr_tag<>'未命名' and gr_pid=@gr_pid and gr_tag=@gr_tag and gr_id<>@gr_id limit 1;",{
        gr_pid = cInfo.gr_pid;
        gr_id = cInfo.gr_id;
        gr_tag = gr_tag;
    })
    if(result){
        winform.msgbox("同层类目节点名称重复")
        return false;
    }
    sqlConnection.exec("UPDATE 内容表 SET gr_tag = @gr_tag,gr_content = @gr_content,gr_direct = @gr_direct 
                        WHERE gr_id = @gr_id;",{
                        gr_id = cInfo.gr_id;
                        gr_tag = gr_tag;
                        gr_content = gr_content;
                        gr_direct = gr_direct;
                    } );
    winform.msgbox("信息保存成功")
    mainForm.treeview.setItemText(citem,gr_tag);
    winform.close();
    
}

5.窗口置顶

//父窗口置顶
    import win;
    win.setTopmost(mainForm.hwnd)

 

posted @ 2022-02-17 12:42  HALDW  阅读(500)  评论(0编辑  收藏  举报