(Ext)发帖,散分,大家都来讨论讨论

fly_to_sky 2009-04-03 03:13:21
最近一直在学习Ext相关知识,每天都很忙,每天都感觉时间过的很快,虽然每天都有收获每天都有新发现,但是,仔细的想想,其实,也没啥!有点痛苦,有点迷茫,清醒一点点麻木,麻木一点清醒,残酷、孤独、无助,但也有种前所未有的归属、充实与快乐!我真的无法用言语来形容那种“东西” 。好了,下面就开始我们今天的主题吧!今天我要做的是介绍 TreePanel的一些运用。也希望大家多多指教,有什么高招分享一下,

由静态数据生成静态树形菜单:
例1:简单生气树形菜单
代码:
最近一直在学习Ext相关知识,每天都很忙,每天都感觉时间过的很快,虽然每天都有收获每天都有新发现,但是,仔细的想想,其实,也没啥!有点痛苦,有点迷茫,清醒一点点麻木,麻木一点清醒,残酷、孤独、无助,但也有种前所未有的归属、充实与快乐!我真的无法用言语来形容那种“东西” 。好了,下面就开始我们今天的主题吧!今天我要做的是介绍 TreePanel的一些运用。

由静态数据生成静态树形菜单:
例1:简单生气树形菜单
代码:
var root=new Ext.tree.TreeNode({text:"root"}); //声明根节点
var node2=new Ext.tree.TreeNode({text:"根节点2"});//声明一个子节点
var node3=new Ext.tree.TreeNode({text:"根节点3"});//声明一个子节点
var node4=new Ext.tree.TreeNode({text:"根节点4"});//声明一个子节点
var node1=new Ext.tree.TreeNode({text:"根节点1"});//声明一个子节点

node2.appendChild(node3);//节点2添加子节点3
node2.appendChild(node4);
root.appendChild(node2);
root.appendChild(node1);

var tree2=new Ext.tree.TreePanel({
title:"自定义数据", //树形菜单标题
width:300, //树形菜单宽度
height:300, //树形菜单高度
frame:true, //采用渲染
draggable:false, //不允许拖拽
el:"tree" //在 HTML页面中ID为tree的标签中显示
});
tree2.setRootNode(root); //设置TreePanel的根节点为root
tree2.render(); //加载

例2:运用appendChild()方法添加子节点
代码:
var treePanel=new Ext.tree.TreePanel({
applyTo:Ext.get("tree2"),
title:"菜单标题",
frame:true,
width:300,
height:400,
root : new Ext.tree.TreeNode({
id : 'root',
text : '网页查看',
draggable : false, //false默认设置,不能被拖拽
expanded : true //设置菜单展开
})/**/

});
//添加子节点
treePanel.root.appendChild(new Ext.tree.TreeNode({
id : 'htmlPanel',
text : '百度',
listeners : {
'click' : function(node, event) {
event.stopEvent();
window.open("http://www.baidu.com");
}
}
}));
//添加子节点
treePanel.root.appendChild(new Ext.tree.TreeNode({
id:"sinaPage",
text:"新浪",
expanded:true,
listeners:{
"click":function(node,event){
event.stopEvent();
window.open("http://www.sina.com");
}
}
}));
var node=treePanel.getNodeById("sinaPage"); //获取子节点
node.appendChild(new Ext.tree.TreeNode({
id:"page1",
text:"新闻",
listeners:{
"click":function(node,event){
event.stopEvent();
window.open("http://book.sina.com.cn/");
}
}
}));
//添加子节点的子节点
node.appendChild(new Ext.tree.TreeNode({
id:"page2",
text:"影视",
listeners:{
"click":function(node,event){
event.stopEvent();
window.open("http://book.sina.com.cn/");
}
}
}));
//添加子节点的子节点
node.appendChild(new Ext.tree.TreeNode({
id:"page3",
text:"体育",
listeners:{
"click":function(node,event){
event.stopEvent();
window.open("http://book.sina.com.cn/");
}
}
}));


...全文
177 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
readfuture 2009-04-04
  • 打赏
  • 举报
回复
呵呵,学习了
net_flyfox 2009-04-04
  • 打赏
  • 举报
回复
分享快乐
javascript2008 2009-04-04
  • 打赏
  • 举报
回复
学习~~~~
生财 2009-04-04
  • 打赏
  • 举报
回复
ext 很強大啊
chuxue1342 2009-04-04
  • 打赏
  • 举报
回复
只能帮顶!
wuyq11 2009-04-04
  • 打赏
  • 举报
回复
Ext不错
冷月孤峰 2009-04-04
  • 打赏
  • 举报
回复
EXT的界面确实不错,不过个头太魁梧了。
云想慕尘 2009-04-04
  • 打赏
  • 举报
回复
布局好个性~
up
gui0605 2009-04-04
  • 打赏
  • 举报
回复
EXT做的东西很漂亮,如果在局域网使用还是很不错的。但如果需要外网访问,EXT的个头就显得太大了,网络不好的情况下JS文件很久加载不上
Andy__Huang 2009-04-04
  • 打赏
  • 举报
回复
好长的代码
myrroom 2009-04-04
  • 打赏
  • 举报
回复
jf
accplwxlwx 2009-04-04
  • 打赏
  • 举报
回复
JF
01Byte空间 2009-04-04
  • 打赏
  • 举报
回复
学习了
jdbcodbc 2009-04-04
  • 打赏
  • 举报
回复
学习了
jiaojiaoxinzi 2009-04-04
  • 打赏
  • 举报
回复
呵呵。还行,学习下
freewind0521 2009-04-03
  • 打赏
  • 举报
回复
学习了,谢谢
kkun_3yue3 2009-04-03
  • 打赏
  • 举报
回复
很强大!学习了
yiyeqiubo 2009-04-03
  • 打赏
  • 举报
回复
UP
sayoath 2009-04-03
  • 打赏
  • 举报
回复
学习了。。。
terry 2009-04-03
  • 打赏
  • 举报
回复
jf
加载更多回复(10)
本人使用易语言 也有10几年时间,至今留下来的也只是一些怀念和情节,还记得上一次在本论坛发帖是在10年前,期间也只是零星来论坛看看。平常使用也纯属兴趣爱好,并非科班出身,一些见解如若有误,忘大神包含。我们知道目前易语言是支持32位编译,后期估计也不会有所改善了,这似乎已经成为一门被放弃的失败品。既然如此面对如今64位系统的普及,易语言爱好者面对64位程序的操作层面上就显得有些无奈和悲哀。好在有着一些执着的爱好者不想放弃,依然在鼓励解决这些问题,如本论坛的一个开源模块WOW64Ext,就为易语言操作64位模块进程提供了一些基本的封装,本人也借此基础上封装了几个功能,作为进一步扩展,有兴许的朋友可以继续完善。 一:浅谈64位进程远程hook技术 关于HOOK这个话题,网络上铺天盖地并无新鲜,故在此我就不讲述什么是HOOK这些无聊话题了,本文主要阐述一些64位下远程HOOK与32位的主要区别。首先我们来看看要实现一个远程HOOK的构成顺序:1:在目标进程申请内存空间,存放我们截断后的穿插代码与HOOK原代码2:修改HOOK目标位置的指令为跳转至1申请的内存空间中3:穿插代码中把我们需要的寄存器或其他通过通讯手段传达到我们程序的回调接口中去,在这个过程中如果只需要取值,穿插代码不需要等待,如果需要修改生效,穿插代码需要等待回调接口的返回,并把修改内容写回。4:穿插代码最后跳回到HOOK位置长度的下一跳指令,或指定的位置。5:完成整个HOOK过程了解了整个过程看上去似乎很简单,确实要做到这个过程是不难的,只是要做到相对完美要考虑的情况有很多。比如对跳转使用的选择情况:HOOK跳转代码肯定是越短越好,像32位JMP跳转只需要5字节即可,但是在64位进程中情况确截然不同。32位进程寻址能力为4字节,而64位进程寻址能力变成了8字节,然而64位汇编中所有的跳转直接寻址只支持4字节,这在32位中当然不是什么问题,因为32位最大寻址本来就不会超越4字节,不存在超限的说法:但64位中想要达到长转移,必须借用寄存器或地址偏移,那么一般在64位中HOOK的跳转代码在不影响寄存器的情况下一般使用如下办法FFFFFFFFFFFFFFFF作为跳转目标地址:为了不影响寄存器必须提前压入一个寄存器 --------------------------Push raxMov rax, FFFFFFFFFFFFFFFF JMP rax 或 call rax 在内部要取回rax ,这里注意JMP和call的区别,最后平栈 -------------------------- Push rax Mov rax,FFFFFFFFFFFFFFFF Push rax Ret 在内部要取回rax ,最后平栈 有的朋友看到这要问了 我不能直接 JMP FFFFFFFFFFFFFFFF或者 push FFFFFFFFFFFFFFFF 啊,您要这么问,我实在不知如何回答你,表示无语,您还是直接下个源码玩玩算了。 其他类似的列子我就不一一举例了,总结也是差不多形态,以上列子共占用13字节长度,这还是堆栈放在了内部平,否则还要+1个字节长度,如果放弃其中一个寄存器可以-1个字节长度,所以一般网上现有的64位hook一般都在12字节以上,但是一个好用的hook要占用13字节的长度,对我而言无疑无法忍受,难道真的没有其他办法了吗,要保护寄存器且支持长转移,是不是还有其他办法,那么其实是有办法的,就是通过JMP [rip] 机器码形态为 FF 25 00 00 00 00 这句代码占用6字节,那么这是什么意思呢 FF 25 = jmp ,00 00 00 00为偏移长度 对一个支持2G的字节转移长度,JMP [rip]在调试器中可以解释为 jmp qword ptr ds:[0x地址],对了,也就是读取这个偏移位置中的8字节数值作为跳转地址转移过去,如果偏移为00 00 00 00 那么就代表 JMP [rip]的下一条指令处8字节数据。想到这你也许会问  那么这个意思不就是JMP [rip]6字节+8字节长度吗,对如果是连起来确实如此,但是我们可以给他个偏移啊,不就可以分开了吗,我们只需要搜索同模块的其他位置中00或CC等连续8字节无用代码位置,把跳转的地址写入其中,那么JMP [rip]就可以通过偏移读取到跳转地址了。我们也就能实现6字节的HOOK,这个方式的亮点是改写长度小,且不影响寄存器和rsp堆栈指针,也算是达到曲线救国的目的。 比如对穿插代码中数据传递的问题:我们要获得16个通用寄存器RAX—R15的每个值,这些值我们又如何传递过去。一般远程HOOK数据传递使用消息或者远线程,因为这两种方式汇编改写量小一点,相对容易实现,在这我们不讨论远线程,我们来看看消息传递,一般是两个函数的选

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧