大家肯定还记得上次我给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) 阅读(5054)
评论(14) 编辑 收藏 引用 所属分类:
GacUI