在經歷了一系列失敗的「跨平臺」努力後,獨立工具軟件商 Borland 的最後但願寄託在了 C++BuilderX,這個工業級的重型 C++ 開發環境上。C++BuilderX 與先前的 BC 或 BCB 有着顯著的不一樣。不只僅在於其使用 Java 寫的 IDE,更本質的特徵在於其旗艦級的定位,使它終於得到了人們期待已久的、與「C++」這個詞相稱的特徵:高度標準相容的語法,開放,兼容,獨立於平臺。php
GTK+ 是一個用於構建用戶界面的跨平臺工具箱。與其說是用戶界面,更精確的描述應是一個「框架」,集成了開發一個圖形界面程序所需的全部底層架構,如信號傳遞機制,異步 I/O,字符集與編碼處理等。目前的穩定版是 2.2.4。隨着功能不斷提高,它的應用也日趨普遍。相對於別的商業級應用程序框架,這個庫使用了極其寬鬆且對商業友好的 LGPL 許可證,使它得到了愈來愈多的重視。html
然而,雖然 GTK 架構中有一層又一層的封裝層,來最大限度地實現平臺無關性,但其來自於 Unix 世界的本質使得其要運行於 Windows,仍然須要用戶搭建複雜的環境來編譯和設定。幸虧,半「官方」的 Windows 移植髮布版已經出現,位於 http://www.dropline.net/gtk/index.php。從這個網站上能夠下載到編譯好了的 GTK+ for Windows Runtime Environment 與 Development Environment(對應於 Linux 上 gtk2 及 gtk2-devel 包),以及如何在 VC 中使用此庫的簡單介紹,甚至還有如何製做安裝程序的簡介。linux
今後站上下載到的發行版內置了一個主題引擎 Wimp。當這個主題引擎運行於 Windows XP 時,會調用 Native 的 XP 主題 API,獲取如顏色方案、字體和貼圖等信息,從而得到一個與 XP 徹底一致的 Look and feel。固然,若是不是 XP,就只能用模仿的方式繪製控件,但至少顏色仍是一致的。編程
當 BCBX 1.0於去年末發佈時,一來因爲時間倉促,二來做爲工業級產品,「圖形界面」所佔比重較小,總之其中並未攜帶任何用於協助圖形用戶界面 (GUI) 開發的元素。數據結構
BCBX 的開放性體如今,支持 3 個平臺,5種不一樣編譯器。Intel 及 Microsoft 的編譯器都列爲支持。最讓人意外的是,GNU 的 GCC 也在列表中,而且將隨安裝程序一併自動裝入你的系統,無需任何額外的下載、安裝步驟,便可使用:架構
其版本顯示爲「GNU C++ version 3.2 (mingw special 20020817-1) (mingw32)」框架
這一特徵不由讓咱們產生聯翩浮想。這意味着無數的,GNU 或 非 GNU的,open 的 sources 將有簡單的方法能夠在 Windows 上使用了。GTK+ 固然就是其中之一。異步
咱們如今就安裝上述的 GTK+ Windows 發行版。這個發行版有着漂亮的安裝程序,從哪方面看都是標準的 Windows 應用程序。真正的「跨平臺」,就要作到融入所在的平臺中去,與其餘應用有相同的外觀和行爲特徵,成爲 Native 的應用。那種自成一體,與環境格格不入的程序,不能叫跨平臺,而是本身就是平臺,且只能運行於本身的平臺上而已。工具
首先從這裏下載 Runtime Environment。目前版本 2.2.4.1。測試
裝上後,*.DLL 形式的動態庫裝入了 C:\Program Files\Common Files\GTK\2.0\lib中。爲了讓系統能找到它,咱們須要爲它設定 $PATH 環境變量。在 Windows 2000 上的設定方法是這樣的。按組合鍵 Win+Pause,若是你沒有 104 鍵 Windows 鍵盤(稀有動物)就只好在「個人電腦」(實際上是你的,不是個人)上點右鍵,選屬性。選 Advance 標籤,點擊 Environment Variables... 按鈕。在對話框中尋找 Path 變量,沒有的話新建一個。編輯其內容加入上述路徑。
好,如今咱們下載並安裝 Development Environment。本例中我將它裝到了 D:\GTK2DEV,後面的設定將以此爲準。你能夠自行酌情更改。
裝好後,測試一下是否正常。去到目錄 D:\GTK2Dev\share\gtk-2.0\demo 中,運行 gtk-demo.exe。若是看見界面,那麼安裝成功。
GTK+ for Windows 站點上有很詳細的如何在 Windows 上編譯和運行的指令。但他們太複雜了,我經過在 BCBX 中新建一個項目,來 step by step 地簡要描述一下。
咱們在 BCBX 中新建一個項目,類型選擇 New Console。
別急,我沒搞錯。儘管咱們要開發的東西確實是 GUI的,咱們選的也不是 New GUI Application,不然你就要爲找不到 argc 和 argv 煩惱了。我將項目命名爲 gtkhello。
如今,爲了能編譯這個項目,首先,咱們教編譯器去哪尋找 GTK+ 的頭文件。在左上角項目名上點右鍵,選擇「Build Options Explorer...」。在出現的對話框上部選擇「MinGW GNU C++ Compiler」,在下部 Paths and Defines 標籤中,include path 框裏添加以下字符串:
d:\GTK2DEV\INCLUDE\GTK-2.0; d:\GTK2DEV\LIB\GTK-2.0\INCLUDE; D:\GTK2Dev\include\glib-2.0; d:\GTK2DEV\LIB\GLIB-2.0\INCLUDE; D:\GTK2Dev\include\pango-1.0; d:\GTK2DEV\INCLUDE\ATK-1.0; d:\gtk2dev\include
教咱們的連接器如何連接對 GTK+ 程序的調用。在同一個對話框中,上部選擇「GNU C++ Linker」,底下標籤頁中就會出現 library search path 框。在其中輸入
D:\GTK2Dev\lib
在這個目錄中存放着與每一個 DLL 對應的 LIB 靜態接口庫。而後,咱們轉入 Options 頁,在 Linker Options->Search for library LIBNAME 後面,輸入以下字符串:
glib-2.0;gtk-win32-2.0;gdk-win32-2.0;gobject-2.0;gdk_pixbuf-2.0;gthread-2.0;gmodule-2.0;pango-1.0
這些就是全部接口庫的名字。至此,全部設定完成。咱們打開 2 年前登在 IBM developerWorks 網站上的 《GNOMEnclature: 爲 GNOME 2 做好準備,第 1 部分 》一文,將「清單2」程序貼進咱們剛剛生成的 untitled.cpp 中,從工具欄上點擊 Make。編譯過程應該很快就完成了。
CPU訪問內存時,老是以其整數字長爲單位讀寫。好比 x86 CPU 老是從4字節的整數倍數地址上,讀取4字節數據,它不能爲所欲爲地從任何位置開始讀取任意長度數據。爲了效率考慮,默認狀況下編譯器老是讓整數存放於其長度的整數倍數地址上。在一個結構中,爲了作到這一點,有時不得不浪費幾個字節。
舉個例子,咱們定義一個結構:
struct { char c; int i; };
從字面上看,這個結構的長度是5個字節,但默認狀況下編譯器老是分配8個字節,是爲了讓 i 出如今偏移量 4 地址上。
位域 bitfields 是 C 語言結構中的一個成員,能夠指定該成員所佔內存的位數 bit。然而,在位域的對齊方式上,GCC和MSVC這2個編譯器產生了巨大的分歧。如今,咱們將上面這個結構改爲下面這樣子:
struct { char c; int b: 1; int i; };
咱們在 c 和 i 中插入了一個只佔 1 位內存的整數。在 GCC 中,咱們測試該結構的長度,發現仍然是 8 個字節,就是說 b 利用了 c 和 i 間的空隙,而沒有多佔空間。然而在 VC 中咱們會發現,結構長達 12 字節。也就是說 b 像其餘全部整數同樣,在4倍數地址上對齊了。
若是僅僅這樣還好辦,不幸的是,若是你在b後面再插入一個位域 b2,長度仍是12。而若是插入一個 short 型的位域,長度將變成16!
其緣由在於 VC 使用了一種古怪的對齊方式,且沒有完整的文檔描述。基本上,VC 將結構中相鄰的相同數據結構位域組成位域組,而後每一個位域組都默認要求按其數據類型對齊。另外還有許多不一樣的例外狀況。這樣的狀況與任何一個普通 GCC 支持的 對齊模式都不一樣。對齊方式不一樣意味着什麼呢?考慮一下,Windows 是用 VC 編譯的,也就是說全部 Windows API 都使用 VC 對齊方式。而若是你用 MinGW GCC編譯 Windows 程序,你對全部使用了位域的 Windows API 的調用都將出錯!而咱們的 GTK+ for Windows 顯然也是使用了這種對齊方式。
萬幸的是,Windows 版 GCC 在編譯時補上了一個新的命令行開關,-mms-bitfields,使其使用 VC 兼容的對齊方式。 Borland 所攜帶的這個 MinGW GCC也有。而這個開關別的平臺上的 gcc 則都沒有。加上這個編譯開關後生成的代碼將與 VC 的代碼有相同的行爲特徵。只是 Borland 本身好像尚未意識到包裏的 gcc 有着這麼重要的一個開關,我找遍 Build Options Explorer 也沒有找到有這個選項的勾可打。好在此時 BCBX 的開放性再次救了咱們和它本身一命。在 Options 標籤頁的最下面,有一個 Other options and parameters 選項。填在裏面的參數將被原封不動地拷貝到命令行上。因此咱們在裏面寫上:
-mms-bitfields
OK,如今,激動人心的時刻就要到來了。按下 Run 按鈕,咱們的第一個 GTK 程序將運行了:
這是 Pango 標記的效果,與原文中的圖比較一下。
這是 GTK 多頁記事簿
至此,咱們的 GTK+ for Windows 開發環境已經搭建成功了,剩下的就只需創意加上努力地 coding 了。
在結束本文前,咱們最後看一個例子。《GTK+2.0編程範例》(清華大學出版社出版)一書的做者,宋國偉先生在應用GTK+編程一文中的一個 Helloworld 程序。在這個程序中,有這樣一句語句:
g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(on_button_clicked),(gpointer)"你好!\n自由的世界。");
程序自己並無錯,然而,在一般狀況下,編譯運行之後,並不能看見這句話,相反卻是在控制檯上看見如
** (gtkhello.exe:1236): WARNING **: Invalid UTF8 string passed to pango_layout_set_text()
這樣的字樣。GTK 是一個國際化的工具箱,其內部全部地方都以 Unicode 存儲字符串,亦可同屏顯示任何語言。它要求全部輸入的字符串都爲 UTF-8 編碼。然而「一般狀況下」,咱們編輯的中文文件都將以一個 locale encoding,好比 GB2312 編碼,來保存。因此只要源文件能保存爲 UTF-8,就解決了。BCBX 有這個能力。在cbx項目文件上點右鍵,選擇屬性。切換到 General 標籤,將 Encoding 設爲 UTF8。只有再新建的全部文件都將使用這裏選中的編碼來保存。
咱們新建一個.c文件將內容複製過去。注意文件下方有 UTF8 字樣。
而後再編譯運行。