随笔-341  评论-2670  文章-0  trackbacks-0
    大家肯定还记得上次我给NativeX开发IDE(参见这里这里)的事情。IDE使用C#进行开发,然后遇到了一个瓶颈,其中的一个问题就是GDI+渲染那么多各种颜色的文字实在是太慢了。再加上我也一直很想用C++开发界面,但是又找不到一个可以跟WinForm或者WPF一样既简单易用又灵活的东西,所以决定自己写。名字就叫GacUI好了,GPU Accelerated C++ User Interface。

    当然这并不是我第一次开发GUI了,开发GUI是一个惨痛的历史。在我还在读高中的时候,为了做一个RPG游戏就用Delphi开发了一套基于GDI的GUI。高三的时候升级了它。大一的时候使用OpenGL为了同样的目的开发了一次,大三的时候封装了API但是发现API真是超级复杂结果无法封装所有必须的功能,去年试图抄WPF但是由于我处理得不好性能太慢失败了。因此现在总结了之前开发GUI的所有经验教训,重新开发一套C++的GUI系统。

    这个系统的特征如下:
    1、排版灵活。现在Left, Top, Width, Height已经不是控件的属性了,转而放在了另一个层次里面。简单来说就是,GacUI支持在一个窗口上放很多的排版线,可以做各种复杂的排版,最后一个控件必须依附在排版线的矩形区域上面。可想而知,并不是所有的控件都是按照Left, Top, Width, Height来确定位置的。不过大家也不用害怕,只是这些属性已经被封装到特定的一组对象。
    2、样式灵活。简单来说就是换皮肤,但是这并不像VCLSkin那样只是重绘,这里的样式允许你把整个控件的外观都换掉(譬如说跟MacOS一样滚动条的两个方向按钮都挨在一起),就跟WPF更换控件的template一样。
    3、支持多渲染器。目前我内置了GDI和Direct2D渲染,大家根据需要可以开发自己的渲染器——不过我觉得一般都用不上。
    4、跨平台。这里指的是我把CreateWindow那样子的东西给隔离了,转而去实现一个INativeWindow(包括创建删除打开绘图设备等)。我默认提供了一个基于CreateWindow的实现,然后可选创建GDI或者Direct2D绘图设备。哪怕是将来大家想将GUI移植到Windows8 Metro设备(因为直接支持DirectX渲染,把控件的样式改成MetroUI那种感觉就行了)、在游戏里面创造虚拟窗口、或者干脆放到Linux上,仅需提供一套INativeWindow并挂载Linux上的高性能绘图设备(我知道linux上面的某些绘图api性能巨差,应该避免使用,个人推荐OpenGL)。
    5、渲染方便。渲染的方法是,我提供了很多预定义图元,可以将图元绑定到排版线上来决定其尺寸,最后每一个图元都会有渲染器安排一个图元渲染算法来渲染出来。如果你需要的外观刚好可以用预定义的图元表达的话,那可以直接拼装。否则,开发新的图元即可。

    控件的逻辑、样式、排版、渲染四套工序已经完全隔离。举个例子,我们都知道GroupBox和Panel除了是容器以外没有任何区别,因此我给GuiControl类编写了Win7GroupBoxStyle和Win7WindowStyle两套样式,使用不同的组合就可以创造出不同的外观,不需要所有的东西都因为外观有一点点变化就写成两个控件了。因此我们可以知道,如果你需要特别的外观,那么就写一个自己的Style。GacUI是开源的(不过暂时没有自己的项目首页,我把代码放在了Vczh Library++ 3.0的Candidate\GUI\GUI\下面),因此开发样式的时候还可以借鉴我预定义提供的Win7外观样式包的代码。

    因为没开发完,所以先贴个图。下面的图因为“可编辑文本元素”的Direct2D渲染代码还没写,所以只给出GDI得结果。Direct2D因为自带全屏幕去锯齿,所以比这个要好看很多。下一个IDE我就用GacUI来开发了,C#开发IDE难度很高啊,膜拜Mono开发SharpDevelop那帮人,我还是用C++就好了。



posted on 2011-10-22 19:34 陈梓瀚(vczh) 阅读(5021) 评论(14)  编辑 收藏 引用 所属分类: GacUI

评论:
# re: GacUI项目正式启动 2011-10-22 19:40 | 飞雪
前排表示支持。  回复  更多评论
  
# re: GacUI项目正式启动 2011-10-22 22:22 | 邱震钰(zblc)
纯支持  回复  更多评论
  
# re: GacUI项目正式启动 2011-10-23 01:32 | phoenixbing
gac 表示什么  回复  更多评论
  
# re: GacUI项目正式启动 2011-10-23 03:26 | phoenixbing
@phoenixbing
ok 我知道了  回复  更多评论
  
# re: GacUI项目正式启动 2011-10-24 07:28 | right
浮动的元素怎么搞,比如右键菜单,停靠面板,像ribbon那样的浮动面板  回复  更多评论
  
# re: GacUI项目正式启动[未登录] 2011-10-24 18:14 | 姚冬
我觉得没必要自己再造个轮子了,可以考虑用 Qt。 c++,跨平台,自带2d渲染引擎比GDI+快,丰富的基础类库和算法库,天生的Java Script脚本绑定。  回复  更多评论
  
# re: GacUI项目正式启动[未登录] 2011-10-24 18:15 | 姚冬
对了,可以去看看新版本的 WPS和YY语音,都是用Qt写的客户端。  回复  更多评论
  
# re: GacUI项目正式启动 2011-10-24 19:35 | 陈梓瀚(vczh)
@姚冬
1:QT渲染远远没有WPF在一台好显卡的电脑快,而且不能直接嵌入在游戏里。而我是考虑了这一点的。而且qt那种结构还不能使用在win8的MetroUI里面,这将来会成为一个问题——而我也考虑了这一点。
2:造轮子还能用来锻炼自己造福他人,就像明明有了那么多操作系统google还要折腾个android一样。  回复  更多评论
  
# re: GacUI项目正式启动 2011-10-25 18:09 | iloveprogramme
支持造这个轮子,到目前都没发现简洁好用的C++ UI库。  回复  更多评论
  
# re: GacUI项目正式启动 2011-10-26 04:39 | 装配脑袋
单选按钮和复选框的效果好山寨。。  回复  更多评论
  
# re: GacUI项目正式启动 2011-10-26 05:46 | yrj
C++ 版 WPF  回复  更多评论
  
# re: GacUI项目正式启动 2011-10-26 09:13 | 陈梓瀚(vczh)
@装配脑袋
Direct2D版本要好看很多……  回复  更多评论
  
# re: GacUI项目正式启动 2011-11-03 03:34 | Voyaging-Mk
Clanlib的GUI貌似挺好,而且是3D的····有没捣鼓过?  回复  更多评论
  
# re: GacUI项目正式启动 2011-11-03 06:44 | 陈梓瀚(vczh)
@Voyaging-Mk
那个太难操作了  回复  更多评论
  

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