大家肯定還記得上次我給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、排版靈活?,F在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) 閱讀(5079)
評論(14) 編輯 收藏 引用 所屬分類:
GacUI