大家肯定還記得上次我給NativeX開(kāi)發(fā)IDE(參見(jiàn)
這里和
這里)的事情。IDE使用C#進(jìn)行開(kāi)發(fā),然后遇到了一個(gè)瓶頸,其中的一個(gè)問(wèn)題就是GDI+渲染那么多各種顏色的文字實(shí)在是太慢了。再加上我也一直很想用C++開(kāi)發(fā)界面,但是又找不到一個(gè)可以跟WinForm或者WPF一樣既簡(jiǎn)單易用又靈活的東西,所以決定自己寫(xiě)。名字就叫GacUI好了,
GPU
Accelerated
C++
User
Interface。
當(dāng)然這并不是我第一次開(kāi)發(fā)GUI了,開(kāi)發(fā)GUI是一個(gè)慘痛的歷史。在我還在讀高中的時(shí)候,為了做一個(gè)RPG游戲就用Delphi開(kāi)發(fā)了一套基于GDI的GUI。高三的時(shí)候升級(jí)了它。大一的時(shí)候使用OpenGL為了同樣的目的開(kāi)發(fā)了一次,大三的時(shí)候
封裝了API但是發(fā)現(xiàn)API真是超級(jí)復(fù)雜結(jié)果無(wú)法封裝所有必須的功能,去年試圖抄WPF但是由于我處理得不好性能太慢失敗了。因此現(xiàn)在總結(jié)了之前開(kāi)發(fā)GUI的所有經(jīng)驗(yàn)教訓(xùn),重新開(kāi)發(fā)一套C++的GUI系統(tǒng)。
這個(gè)系統(tǒng)的特征如下:
1、排版靈活。現(xiàn)在Left, Top, Width, Height已經(jīng)不是控件的屬性了,轉(zhuǎn)而放在了另一個(gè)層次里面。簡(jiǎn)單來(lái)說(shuō)就是,GacUI支持在一個(gè)窗口上放很多的排版線,可以做各種復(fù)雜的排版,最后一個(gè)控件必須依附在排版線的矩形區(qū)域上面。可想而知,并不是所有的控件都是按照Left, Top, Width, Height來(lái)確定位置的。不過(guò)大家也不用害怕,只是這些屬性已經(jīng)被封裝到特定的一組對(duì)象。
2、樣式靈活。簡(jiǎn)單來(lái)說(shuō)就是換皮膚,但是這并不像VCLSkin那樣只是重繪,這里的樣式允許你把整個(gè)控件的外觀都換掉(譬如說(shuō)跟MacOS一樣滾動(dòng)條的兩個(gè)方向按鈕都挨在一起),就跟WPF更換控件的template一樣。
3、支持多渲染器。目前我內(nèi)置了GDI和Direct2D渲染,大家根據(jù)需要可以開(kāi)發(fā)自己的渲染器——不過(guò)我覺(jué)得一般都用不上。
4、跨平臺(tái)。這里指的是我把CreateWindow那樣子的東西給隔離了,轉(zhuǎn)而去實(shí)現(xiàn)一個(gè)INativeWindow(包括創(chuàng)建刪除打開(kāi)繪圖設(shè)備等)。我默認(rèn)提供了一個(gè)基于CreateWindow的實(shí)現(xiàn),然后可選創(chuàng)建GDI或者Direct2D繪圖設(shè)備。哪怕是將來(lái)大家想將GUI移植到Windows8 Metro設(shè)備(因?yàn)橹苯又С諨irectX渲染,把控件的樣式改成MetroUI那種感覺(jué)就行了)、在游戲里面創(chuàng)造虛擬窗口、或者干脆放到Linux上,僅需提供一套INativeWindow并掛載Linux上的高性能繪圖設(shè)備(我知道linux上面的某些繪圖api性能巨差,應(yīng)該避免使用,個(gè)人推薦OpenGL)。
5、渲染方便。渲染的方法是,我提供了很多預(yù)定義圖元,可以將圖元綁定到排版線上來(lái)決定其尺寸,最后每一個(gè)圖元都會(huì)有渲染器安排一個(gè)圖元渲染算法來(lái)渲染出來(lái)。如果你需要的外觀剛好可以用預(yù)定義的圖元表達(dá)的話,那可以直接拼裝。否則,開(kāi)發(fā)新的圖元即可。
控件的邏輯、樣式、排版、渲染四套工序已經(jīng)完全隔離。舉個(gè)例子,我們都知道GroupBox和Panel除了是容器以外沒(méi)有任何區(qū)別,因此我給GuiControl類(lèi)編寫(xiě)了Win7GroupBoxStyle和Win7WindowStyle兩套樣式,使用不同的組合就可以創(chuàng)造出不同的外觀,不需要所有的東西都因?yàn)橥庥^有一點(diǎn)點(diǎn)變化就寫(xiě)成兩個(gè)控件了。因此我們可以知道,如果你需要特別的外觀,那么就寫(xiě)一個(gè)自己的Style。GacUI是開(kāi)源的(不過(guò)暫時(shí)沒(méi)有自己的項(xiàng)目首頁(yè),我把代碼放在了
Vczh Library++ 3.0的Candidate\GUI\GUI\下面),因此開(kāi)發(fā)樣式的時(shí)候還可以借鑒我預(yù)定義提供的Win7外觀樣式包的代碼。
因?yàn)闆](méi)開(kāi)發(fā)完,所以先貼個(gè)圖。下面的圖因?yàn)?#8220;可編輯文本元素”的Direct2D渲染代碼還沒(méi)寫(xiě),所以只給出GDI得結(jié)果。Direct2D因?yàn)樽詭聊蝗ヤ忼X,所以比這個(gè)要好看很多。下一個(gè)IDE我就用GacUI來(lái)開(kāi)發(fā)了,C#開(kāi)發(fā)IDE難度很高啊,膜拜Mono開(kāi)發(fā)SharpDevelop那幫人,我還是用C++就好了。
posted on 2011-10-22 19:34
陳梓瀚(vczh) 閱讀(5079)
評(píng)論(14) 編輯 收藏 引用 所屬分類(lèi):
GacUI