2013-01-20 45 views
7

作爲跨平臺文本編輯器Sublime Text 2的粉絲,我一直在研究它是如何開發的。開發人員已經注意到,它對於Linux的一些GTK具有99%的C++,並且使用他稱之爲「Sublime GUI」的自定義UI工具包。這是來自dev的報價C++自定義UI ToolKit - 跨平臺抽象層的選項

Sublime Text 2本身使用自定義UI工具包。有很多應用程序在這裏可能沒有意義,但對於Sublime Text來說這並不是一個不合理的選擇,在那裏我總是知道很多UI控件將不得不自定義,無論該工具包是什麼(例如,文本控件和選項卡控件)。 UI工具箱位於跨平臺抽象層之上,它更多地是平臺功能的聯合而非最低公分母。

我的問題是,什麼是一個跨平臺的抽象層的一些選項?我認爲這比GTK,QT和SDL要低。我試圖弄清楚如何創建一個跨平臺的自定義UI工具包,並且只需編寫一次代碼。

我很欣賞UI工具包的好處,但如果我想讓自己的手變得骯髒,並且在Windows,Linux,Mac上支持我的應用程序,我不確定從哪裏開始。

回答

4

我想最重要的問題是如何繪製和獲取鍵盤和鼠標事件。

當我看到它有繪圖兩種方法:

  1. 創建OpenGL上下文,並用OpenGL繪製你的部件。像glui
  2. 使用本機繪圖基礎結構。像在windows上的GDI+,在X11上的XLib一樣。

當然,你需要爲每個平臺實現某些東西。使用OpenGL,您需要爲每個平臺編寫上下文(WGL,GLX,..)處理,而使用本機繪圖基礎架構則需要更多的工作。由於所有繪圖基礎架構都是獨一無二的,因此您可能需要爲繪圖編寫抽象,然後使用繪圖抽象層實現您的小部件。

至於事件處理,我認爲你還需要編寫自己的抽象,因爲事件處理對每個平臺都是唯一的。

最後,您還應該有一個抽象層,用於創建繪製窗口小部件的主窗口並從中獲取事件。

使用OpenGL時,您可以從glut開始,它已經處理窗口創建和事件處理。請記住,我從未執行過這樣的任何事情。不過,我可能會嘗試OpenGL方法,因爲我相信達成目標的工作量較小。

+0

基於我所看到的,它可能使用GDI和XLib。使用類似Fraps的東西,如果正在使用gpu,您會看到調試信息,但不存在調試信息。所以我相信它正在做軟件渲染。還運行gDEbugger,有0個OpenGL調用。雖然我只在Windows上進行測試,但是可能在其他平臺上使用OpenGL,儘管我懷疑它。 – leetNightshade

1

有跨平臺工作的許多GUI工具包(TK,QT和GTK僅舉幾例)

如果你想雖然寫自己的,它不會有比GTK一個較低的水平工具箱,QT或類似的。

您可能使類似這樣

void draw_window(mywindow *mw, char *name){ 
    non platform specific code goes here (maybe arg parsing, etc.) 

#IFDEF windows 
    windows specific code goes here 
#ENDIF 
#IFDEF macosx 
    mac specific code goes here 
#ENDIF 
#IFDEF linux 
    linux specific code goes here 
#ENDIF 

    non platform specific code goes here (tidying up, recording state, etc.) 
} 

在每個特定平臺的部分的接口,你可以派遣到該平臺或使用GUI工具包,任何接口可用(即,X11對於Unix) 。

當您編譯您指定的目標平臺的代碼,這決定其IFDEF部分在被編譯。

當然這是過於簡化,並且非常謹慎,必須要採取這樣的接口,你暴露對映射到本地等價物並不太痛苦。

+0

是否有任何教程解釋一個基本的窗口,只有很少的組件創建。只是爲了得到一個想法。 – programmer

+0

#代碼中的#ifdefs很難維護,所以絕不是一個好主意。有一個抽象的繪圖,然後在這裏使用會好得多。當然,這種抽象仍然依賴於操作系統,但最小化爲庫中的小型專用部件。這是順便說一句。正是Qt所做的。如果您查看與平臺相關的部分,您會注意到> 98%的Qt與平臺無關。所以只需使用Qt,這是正確的選擇。 – dhaumann