随笔-341  评论-2670  文章-0  trackbacks-0
    (2011.12.5再次更新) 经过了两个星期的开发,GacUI添加了TabControl和ListView的一部分视图。这次的ListView的设计的目标是要跟win7的资源管理器相似,TabControl也是依照win7的本地样式设计的。代码仍然保存在Vczh Library++3.0(Candidate\GUI\GuiDemo\GuiDemo.sln)里,看图:





    Direct2D的对于文字的高级渲染效果还没有实现,除此之外,List、Detail、Tile和Information也还没有做。ListView有两个模式,一个是跟普通的ListView一样可以自行添加ListViewItem的,另一个是virtual list模式,需要自己实现一个支持IListViewItemView的GuiListControl::IItemProvider,然后使用ListView的那六个ContentProvider,就可以做出跟ListView一样的效果,但是性能巨快无比的列表了。因为添加的ListViewItem很多的话,性能的瓶颈会在添加到列表的过程中,而ListView本身丝毫没有区别。因此内容太多的话建议使用virtual list模式,好处是不需要每一个项目都new一个对象,ListView会用一个item index来回调出具体的数据内容。

    根据上一篇文章的评论,我决定以后发布GacUI的时候同时提供dll和一对h/cpp两种选项,其中h/cpp会根据功能提供几个裁剪的结果,而dll总是包含所有功能。使用dll的话,可以做到跟C#的WinForm和WPF一样,把应用程序的插件写在另一个dll里面。而h/cpp因为合并的文件太大,因此需要打开Visual C++的/bigobj选项,好处是可以深入使用到内部的所有功能,还能根据自己的需要进行修改,而不局限于dll所提供的GUI部分。

    为了配合GacUI的使用,跟QT的QML一样,我会升级以前开发的FreeScript2.0,做出一个3.0的版本来跟GacUI配合使用(这个功能是可选的,裁剪的h/cpp文件对将不强制包含脚本代码,但是dll总是包含脚本功能)。关键的功能是直接支持json(合法的json数据即合法的FreeScript3.0代码),容易使用的异步IO功能,还有跟linq一样好用的list comprehension,最后当然是跟javascript的语法想当接近但是直接支持class,不会跟javascript一样曲线救国。相信学习起来的难度非常小。这样就可以把一部分用C++写起来比较麻烦的代码用FreeScript3.0实现,并且这部分代码将可以在GacUI Editor内部编辑。GacUI会跟WPF一样提供两种调用方法,一种是C++自己new那些类,另一种就是使用GacUI Editor产生的xml了。我会尽量让xml方法简单易用,就跟XAML一样,不过因为我的对象模型显然没有XAML(主要是C#)那么复杂,相比会比XAML容易阅读和使用。

=============================
P.S. 经过若干天的艰苦奋斗终于完成了三个View和DirectX的支持,就剩下Detail一种最复杂的View了。放图:









posted on 2011-12-03 07:09 陈梓瀚(vczh) 阅读(3599) 评论(27)  编辑 收藏 引用 所属分类: GacUI

评论:
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-03 07:35 | lwch
Orz....  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-03 07:44 | 陈梓瀚(vczh)
@lwch
真快啊,你是不是订阅了……  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-03 11:07 | ooseven
@陈梓瀚(vczh)
你的这个gui库不是让c++调用的,而是让你的FreeScript调用的?  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-03 15:34 | 空明流转
orz。。。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-03 15:35 | 空明流转
@ooseven
是C++的,free script更多是承担定制的作用。。。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-03 18:56 | ooseven
例子竟然只有vc2010的工程,老大,要考虑一些广大vc2008的开发者吧。vc2010至少目前在中国还只能玩玩而已,无法用它来开发商业软件,因为
在它下面开发的程序无法在winxp sp3以下的版本运行,就条限制完全不符合中国的国情,因此,对中国来说,vc2008已经是到头了。建议增加vc2008的sln文件  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-03 19:56 | 陈梓瀚(vczh)
@ooseven
都行,C++是少不了的  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-03 19:57 | 陈梓瀚(vczh)
@ooseven
现在这个工程只是我开发用的,跟release的sample程序还是不一样的,以后会有的。不过xp sp3的问题,你可以通过在vs里面把编译器10版本降低到9版本来产生跟2008一样的效果,虽然代价就是没有C++0x,而且2010修掉的bug在9版本的编译器上不起作用。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-04 06:17 | zjh
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-04 07:02 | 陈梓瀚(vczh)
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-04 07:05 | 陈梓瀚(vczh)
@zjh
第一次见到有人说dll check manifest,secure stl不好。真是的,软件出了问题就应该直接崩溃,这样程序员才能立刻调试,不然自己写出来的程序里面乱成一团糟都不知道。然后自己的代码就依赖了旧编译器的bug,结果新编译器把bug修了,就怪新编译器了。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-04 07:54 | zjh
@陈梓瀚(vczh)
我也不赞成他后面的话,但是,是不是编译器的bug,说不好,更可能是编译器的增强,标准c c++好像没有规定  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-04 09:16 | 陈梓瀚(vczh)
@zjh
当然这个bug的定义不太严格。举个例子,VC6的for(int i=xxx)的i作用域可以到for后面。当时的C++还没标准也就罢了,不过从今天的眼光看来这种定义是错误的。我把这种东西称为bug。有些人喜欢这么写,等到新编译器(记得是2003开始的)做得更标准了,他的反应就跟那个博主一样了。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-04 17:07 | ooseven
@ooseven
vc2008的编译器披上vs2010的马甲,这样做意义不大吧,基本上没有人会这样折腾。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-04 19:36 | 空明流转
@ooseven
@陈梓瀚(vczh)
我都不懂你们在讨论什么。你要2008的工程自己去export一个不就可以了么?  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-04 21:05 | 陈梓瀚(vczh)
@空明流转
export太高级了,对于那些没装vs2010的人来说……  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-05 00:07 | ooseven
@空明流转
要解决是都很简单,问题是我只想看看demo而已。如果太折腾严重打击看demo的积极性。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-05 00:10 | ooseven
@陈梓瀚(vczh)

嗯,既然我暂时看不了,就在这里先问下,对于UI框架我其实不是很在乎例子里的效果票不漂亮,我在乎的是这个UI框架方不方便用户定制?比如自绘,比如方便的继承。这方面我很佩服xtremetoolkit,他的框架很perfect。在上面定制自己的控件真是信手拈来。
  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-05 02:07 | 陈梓瀚(vczh)
@ooseven
我使用了WPF的模式,而且允许用户自定义renderer(譬如GDI和DirectX和Opengl等),不过一般不需要。

所以所谓的自绘就是给一个控件(譬如说GuiX)写一个类继承自Guix::IStyleController,这就是他的皮肤。然后,在里面你要创建各种图元的对象,然后对他们进行排版。绝大多数排版我都提供了相应的算法,因此基本上你不需要动态计算一些对象的尺寸,配置一下他们如何互相影响就可以了。

这跟GDI时代的DrawXXX不一样了,变成了类似于CreateRectangle(...)之类的操作。IStyleController还可以回调,你可以在这里修改图元的结构和属性(颜色等)。当然,你也可以继承自已有的皮肤,然后写一点小代码去修改他们。现在我内置了一套win7的皮肤,以后有时间还会做更多。当前的demo每创建一个控件都要制定一个皮肤对象,但是以后我会开发一套简单的“缺省皮肤获取机制”来简化这个操作,并且允许你批量修改控件的外观,免去繁琐的制定操作,也为GacUI Editor打下基础。

至于灵活性的问题,其实现在这个框架有很多控件的组成部分都是一个真的按钮,然后通过控件的皮肤给这些子按钮设置了不同的按钮皮肤对象来构成现在多样化的表现形式。因此你自己给控件设计外观的灵活性是足够的。

你暂时只能通过C++代码来开发一个皮肤,不过未来的版本将同时允许你用GacUI Editor制作一个皮肤,并保存成xml让你在运行时使用(要不要生成C++代码暂时还没决定)。GacUI Editor会把所有的东西都打包成一个文件,你到时候把他当成二进制资源编译进你的程序就可以了。

至于那些需要真的执行绘画的部分(譬如说你开发一个windows画图),WPF用renderer independent的canvas和bitmap能解决,我觉得这个方法不错,应该会实现它。

针对每一个图元,具体的renderer都回接管具体的渲染操作,因此现在你不能直接接触到具体的HDC或者ID2D1RenderTarget之类的对象。底层的renderer是可以换的,不过却不是定死的,你可以在程序开始之前用代码指定一个renderer。如果图元不够(现在看来应该不会),系统的架构也是允许你添加新图元的,就是你需要为你喜欢的renderer做一个针对该图元的实现(一般来说是不需要的)

而且性能问题和内存问题也不必担心,这里的和前面几个的demo那么复杂的图,哪怕是debug,直接在explorer打开的时候都奇快无比,非常流畅。足以证明这个做法是高性能的。对于内容很多的列表控件,我采用的是virtual list的模式。就算你一个item是一个按钮,而且同时有1000000个item,我也只会真的创建几十个(看得见的那些,而且有一些回收算法),因此不怕Create太多图元会给内存增加负担,也不怕new太多对象会给性能造成影响(但是如果用VS直接F5一个debug就能看见少数的一点影响,但是如果使用一个release版本的dll,则不会有这个问题)。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-05 05:52 | ooseven
@陈梓瀚(vczh)
收到,谢谢您耐心的解答。我没看到您的例子,所以不知道您的消息机制是怎么传递的,不知道能不能在demo里有所体现。还有我的软件里需要有docking windows机制,不知道能不能加入到您的开发计划中。如果方便的话,希望有qq联系方式,我的qq是147340642,我把我的软件传给您看看。以期能得到您进一步的指导。
  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-05 06:46 | 陈梓瀚(vczh)
@ooseven
docking我会按照vs的规格去做的,相信那个已经够强大了……还有,我的机制里面没有自绘和非自绘的区别的,你可以认为我放的demo是自绘的。消息机制跟WPF和WinForm那一套很类似,不是跟api一样靠一个int和两个指针来回折腾的。

请滚动到页面的最上面获取MSN,那个是16小时在线的。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-05 07:13 | Zblc
飘过~  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-06 01:37 | ooseven
@陈梓瀚(vczh)
已经添加了msn,可是没有回应。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-06 03:55 | 陈梓瀚(vczh)
@ooseven
已连接  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-08 20:10 | Charm
你好,我使用最新版的GUI,使用Direct2D渲染,感觉很卡,是不是没有处理好某些细节导致的?Direct2D应该比GDI流畅才对吧。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-08 20:30 | Charm
再次认真看了下,代码风格很喜欢,哈哈。
Direct2D版本的,刚启动时候会很卡,过一会就好了,还有就是list没做好获取鼠标焦点,导致鼠标滚轮不起作用了,只能拖动滚动条,我也帮忙看看怎么加上去吧。  回复  更多评论
  
# re: GacUI完成TabControl和ListView的一部分视图 2011-12-10 03:08 | 陈梓瀚(vczh)
@Charm
我那个demo的DIrect2D版本的,Release不会卡,Debug的原因还没查明。不过鉴于你发布的程序总是Release的,所以其实这也不是个什么问题。

GDI的话总是不会卡,所以这应该是没用好Direct2D导致的吧。以后找时间解决它。其实我觉得win7自从依赖了显卡之后,GDI都变快了许多……

其实现在我键盘操作和滚轮都没做,所以当然焦点就不起作用了。现在的焦点的用处只有文本框,还有各种变色功能而已……不过其实我已经规划好了。首先要让滚动条支持滚轮,其次要支持把滚轮从一个focus的composition里面传递给滚动条。但是因为滚动条是横的还是竖的只有IStyleController知道,所以这些任务都果断交给IStyleController就好了。CommonStyles里面有一个滚动条的IStyleController的基础设施,就添加在里面。而ScrollView的基类的IStyleController就做好传递给滚动条的动作。

这样的好处是,所有长得像ScrollView的东西(包括list),都会因为使用了ScrollView的IStyleController,从而因为commonstyles里面的动作而自动获得滚轮的支持。  回复  更多评论
  

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