随笔-341  评论-2670  文章-0  trackbacks-0
    圣诞节人山人海啊,根本不能出去玩什么的,妹纸第二天还要考试,所以就在家里呆着,顺便把TreeView给做了。源代码都在Vczh Library++ 3.0(Candidate\GUI\GUIDemo\GUIDemo.sln)。下面是Direct2D渲染出来的带反锯齿的TreeView。





    这个TreeView是通过把ListView进行扩展,替换IItemProvider和IItemStyleProvider而完成的。在这里TreeView仍然使用Virtual List模式。程序员将有机会在用户展开某个TreeNode的时候才开始加载里面的内容。这次仍然可以修改template(控件皮肤)。当程序员提供了一个INodeProvider之后,GacUI已经准备了两个现成的类,将INodeProvider转成IItemProvider,将INodeItemStyleProvider转成IItemStyleProvider,从而将树形结构转换成列表结构而使用ListView进行显示和操作。这个过程也封装成了一个GuiVirtualTreeListControl。如果不需要提供自己的虚拟化算法的话,直接提供INodeProvider和INodeItemStyleProvider将可以直接使用GuiVirtualTreeListControl显示树形结构。

    将一个虚拟化的树形结构转换成一个虚拟化的列表结构是比较复杂的,特别是当需要高性能的情况下。因此GacUI内置了这个算法的支持。一般情况下程序员不需要修改这个过程,直接使用GuiVirtualTreeListControl就可以实现。这一次内置的Windows7皮肤同时实现了跟Windows7资源管理器非常相似的外观(特别是那些三角形)。DirectX版本有反锯齿,而GDI版本则没有。

    现在要完成的功能已经剩下下面所示(顺序与优先级无关):
    1、Ribbon
    2、Visual Studio那样子的Dock Panel
    3、Canvas
    4、完善键盘操作
    5、提供类似简化后的XAML一样的结构来保存界面
    6、基于XML(见5)的界面编辑器,类似简化后的Expression Blend
    7、具有跟XML内一样外观的,封装在DLL里的接口(带反射,以便实现XML,但是被设计成C++使用时将没有有性能损失)
    8、内置FreeScript3.0的支持,用于方便实现各种高级的皮肤,并且如果愿意的话,可以将整个程序用FreeScript3.0写
    9、UIAutomation
posted on 2011-12-25 06:08 陈梓瀚(vczh) 阅读(3338) 评论(15)  编辑 收藏 引用 所属分类: GacUI

评论:
# re: 圣诞节完成ListView和TreeView 2011-12-25 07:09 | 春秋十二月
建议陈兄将自己的基础库部分,分成include,src,lib,bin,doc等几个目录进行管理分发,对于源码的编译提供好make脚本,包括(windows)vc和(linux)gcc,这样就能让更多的人分享你的成果,并提出测试bug反馈   回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-25 09:03 | 陈梓瀚(vczh)
@春秋十二月
等这个搞定了,会直接出dll,连make你都不用操心了……  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-25 17:38 | 春秋十二月
@陈梓瀚(vczh)
同时也要开源呀
  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-25 18:52 | ooseven
5、提供类似简化后的XAML一样的结构来保存界面

要实现这个就需要提供类的自动生成的支持。
比如 TreeView MyTreeView;
那么通过xaml保存并读取后变成字符串的"MyTreeView", 然后通过自动生成机制实现类似 CreateObject("MyTreeView");
  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-25 20:44 | 陈梓瀚(vczh)
@春秋十二月
难道我那么大个开源的链接放在那里,你不点吗……不要浮躁啊……

至于没有make的问题,我相信勤劳的、智慧的、勇敢的linux排程序员,肯定几秒钟就可以用它喜爱的脚本写出一个小软件来parse我那个存放了代码文件目录的xml的(Candidate\GUI\GUIDemo\GUIDemo\GUIDemo.vcxproj),然后生成make脚本的。  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-25 20:46 | 陈梓瀚(vczh)
@ooseven
因为C++不支持反射,所以我目前的想法是,我把需要反射的东西全部写在一个xml里面,然后我写一个C#程序去生成C++代码,分别包含C++的dll接口,C的dll接口,还有内部的整个反射的框架。这样虽然你改代码的时候还要把你的method名字加进xml,但已经是相当省力了。  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-25 22:00 | 空明流转
Parse你妹,肯定是根据你的工程设置直接逆向一个跨平台的Project出来。  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-26 00:01 | ooseven
@陈梓瀚(vczh)

类的动态生成机制不一定需要语言具有反射机制,当然,如果语言本身有的话是最优雅的解决方案,但是,如果没有的话,还是可以有替代方案的。比如MFC就是通过一个存放着字符串对应函数指针的结构的链表来实现的。该函数指针指向一个直接返回new MyTreeView的函数;MFC对于这个机制设计了最简单的接口,只需要调用两个宏就可以实现,DECLARE_DYNCREATE与IMPLATEMENT_DYNCREATE。只要用户调用了这两个宏,如何让类名加入到类名链表,在类里定义一个CreateObject的静态函数,等繁文缛节都自动搞定。  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView[未登录] 2011-12-26 00:31 | 春秋十二月
@陈梓瀚(vczh)
我还没有专门时间看过你的代码  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-26 00:35 | 陈梓瀚(vczh)
@空明流转
勤劳的,智慧的,勇敢地linux派程序员是肯定不会在意这些问题的!(逃  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-26 00:38 | 空明流转
@陈梓瀚(vczh)
擦擦,干你。
  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-26 00:39 | 陈梓瀚(vczh)
@ooseven
主要是我现在的C++代码并不作为dll的接口,而且里面会有一些模板啊factory什么的,所以那么简单的方法自然是不能用了。到时候你接触到的C++接口肯定是通过C的dll接口包装过的。因此反射也做在这上面。  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-26 00:51 | 空明流转
@春秋十二月
大哥你真幽默。  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2011-12-29 21:35 | phoenixbing
我是经常看这货的代码,可惜我发现我看的没他写的快,很悲催,这种感觉,你们懂的.  回复  更多评论
  
# re: 圣诞节完成ListView和TreeView 2012-01-10 22:54 | 蔡东赟
兄弟 开始捣鼓界面库了?  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理