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)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 分享4款.NET开源、免费、实用的商城系统