日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Windows平臺(tái)下Glade GTK開發(fā)環(huán)境的搭建

 瞻云軒 2016-03-28

【@.1 MVVM設(shè)計(jì)模式與Glade】

做上層軟件開發(fā)的程序員可能對(duì)于MVVM模式比較熟悉,這是一種經(jīng)典的軟件設(shè)計(jì)模式,很好的將用戶界面與后臺(tái)處理之間分層開,通過屬性、事件綁定這種統(tǒng)一的'接口'將軟件重新組裝起來,將原本看上去很混亂很冗余的軟件開發(fā)流程抽象出來,以一種統(tǒng)一而又合理的思想來組織軟件開發(fā)。下面截自wiki的一幅圖簡(jiǎn)單說明了MVVM模式的組織結(jié)構(gòu)。image

View層提供了人機(jī)交互界面,Model層則是處理實(shí)際邏輯操作、數(shù)據(jù)操作的核心,二者之間由ViewModel層來進(jìn)行協(xié)調(diào),即綁定(Binding)View層的操作和屬性,請(qǐng)求Model執(zhí)行并得到反饋結(jié)果。

MVVM模式在Windows平臺(tái)下的WPF開發(fā)得到了很好的體現(xiàn),而WPF開發(fā)中View層并不是用C代碼,而是用XAML來描述的,這是以前的傳統(tǒng)軟件開發(fā)或是MFC開發(fā)中所沒有的。在實(shí)際使用這種WPF開發(fā)時(shí)可以用Expression Blend來進(jìn)行UI設(shè)計(jì),這個(gè)軟件專門而且僅僅生成一個(gè)XAML文件用于界面描述,而底層的邏輯代碼直接連到Visual Studio中進(jìn)行編寫。通過Blend畫出的界面可以很好的釋放你的創(chuàng)造力想象力,而其跟Visual Studio之間的無(wú)縫連接將MVVM模式演繹的淋漓盡致。因此我開始考慮有沒有一種更通用的工具,不僅僅局限于Windows平臺(tái),能在多數(shù)平臺(tái)下用MVVM模式進(jìn)行開發(fā)。于是我發(fā)現(xiàn)了Glade與GTK的配合。

GTK是一個(gè)以純C語(yǔ)言開發(fā)的圖形庫(kù),同樣適用于跨平臺(tái)開發(fā)中。對(duì)于做底層開發(fā)比較多的人來說看到純C代碼比較親切,我也一直想用純C,而不是Visual Studio中提倡的C#,進(jìn)行軟件開發(fā)。單獨(dú)使用GTK非常棒,但是一個(gè)問題就在于,需要手寫的代碼太多了。畫一個(gè)按鍵,按鍵的布局,按鍵的事件,這些都需要自己一行行手寫,而且還得留意代碼的順序。而其中一個(gè)我覺得是很大的門檻在于,布局需要盲打,即,你只能先在腦中有個(gè)界面的想法,寫好代碼后才能看到界面的結(jié)果。當(dāng)然對(duì)于嵌入式設(shè)計(jì)中的很多界面設(shè)計(jì)都是盲打,比如uCGUI,但是如果有一個(gè)工具能像Visual Studio之類的集成開發(fā)環(huán)境一樣能畫界面,再生成代碼,那開發(fā)的速度將大大提升。Glade就很好的解決了這一問題。

Glade很像Expression Blend的作用,它僅僅生成一個(gè)xml文件,描述了界面是怎樣布局的,界面上需要綁定那些事件(Signal)。通過Glade+GTK開發(fā)的程序每次在運(yùn)行時(shí)都會(huì)解析這個(gè)xml文件生成一個(gè)界面(是不是跟WPF一樣~),main函數(shù)里的代碼量大大減少,所需要的就是新建一個(gè)builder,解析這個(gè)xml,傳給gtk中的窗口類型,再顯示這個(gè)窗口,之后進(jìn)入Gtk的主循環(huán)即可。

但是,Glade+GTK劣勢(shì)于Blend的一個(gè)關(guān)鍵特性是,不支持屬性綁定。雖然GTK中的Glib在2.26以后就增加了GBinding,也就是屬性綁定的支持,但是在Glade中卻并沒體現(xiàn)出屬性綁定的設(shè)置,至少不能像Blend一樣,每一個(gè)屬性都可以方便的設(shè)置綁定。在C代碼中手動(dòng)編寫代碼來進(jìn)行綁定或許可以實(shí)現(xiàn)(有待測(cè)試),但是官方教程上并沒有這一特性介紹,也沒有像Blend中那樣強(qiáng)調(diào)屬性綁定的重要性。這一特性的缺失導(dǎo)致Glade+GTK實(shí)現(xiàn)的MVVM有所殘缺。這篇文章的作者在進(jìn)行向Glade和GTK中增加Binding的實(shí)現(xiàn),可以參考他對(duì)于binding的描述。不知道現(xiàn)在進(jìn)展如何了。

不過話說回來,就算沒有屬性綁定也能寫出一個(gè)好的界面出來不是?

【@.2 軟件準(zhǔn)備】

開發(fā)時(shí)所需的工具很簡(jiǎn)單,下面分開說明(也可以參考文章末尾打包好的所有模塊下載):

1.Gtk。由于Gtk是跨平臺(tái)的圖形界面庫(kù),因此對(duì)于windows下的Gtk不見得是最新版本的,但是其功能也足夠我們使用了。在這個(gè)頁(yè)面中可以找到Windows平臺(tái)下的Gtk庫(kù),我下載的時(shí)候windows版本的gtk只有2.24版本。除開源代碼,每個(gè)模塊有兩個(gè)下載分支,一個(gè)是Dev也就是開發(fā)時(shí)所需庫(kù)和頭文件,另一個(gè)是Run-time的動(dòng)態(tài)鏈接庫(kù)。編譯好的Gtk程序僅需將run-time的庫(kù)解壓到運(yùn)行程序相同文件夾(或者可自己配置),即可將程序發(fā)布。如果覺得一個(gè)個(gè)模塊下載麻煩,可以下載all-in-one bundle,包含了Run-time和Dev版本。下載后解壓到任意位置即可,比如c:\gtk\下,編譯時(shí)需要向環(huán)境變量中的PATH添加c:\gtk\bin就可以了。

2.Glade。在官方網(wǎng)站可以下載到windows平臺(tái)下的glade。需注意下載的glade版本與gtk版本是否匹配,我下載時(shí)glade3.8.x版本支持gtk 2版本,3.14.x支持gtk 3版本。由于前面下的gtk版本是2.24,這里下載glade需3.8.3版本。

3.需要一個(gè)在windows下的GNU編譯器,也就是MinGW。我在這篇博客中詳細(xì)介紹了Windows下配置MinGW的方法,同樣也有配置完整的打包下載,可以參考自行配置這里不再累述。

4.一個(gè)文本編輯器。系統(tǒng)自帶的文本編輯器就可以了,不過為了編輯代碼方便,windows下我還是推薦Notepad++來編輯,請(qǐng)自行g(shù)oogle下載最新版本即可。當(dāng)然為了有一個(gè)完整的IDE,可以使用Eclipse配置一個(gè)完善的開發(fā)環(huán)境,不過這里為了保持問題的簡(jiǎn)潔性暫且不考慮采用Eclipse。

【@.3 程序?qū)嵗?/strong>

保證所有軟件下載安裝完成,即

   Gtk解壓,比如解壓到C:\gtk\。

   Glade安裝結(jié)束。

   MinGW配置可用。如果你采用前面提到我自行配置的MinGW注意僅需解壓即可,比如解壓到C:\MinGW\

關(guān)于Glade的教程,可以參考下面鏈接:

GTK+ and Glade3 GUI Programming Tutorial

但是需注意的是,這篇教程中的源代碼在Windows下編譯后不能很好的運(yùn)行(也就是所有的事件不能正常綁定),并且其中的Glade版本比較低,用Glade生成的界面文件與我們的主程序代碼聯(lián)系在一起的步驟有變,所以僅僅參考其Glade的界面設(shè)計(jì)步驟即可。

打開glade,在左側(cè)的Toplevels中新建一個(gè)Window,右側(cè)的屬性中將name改為mainWindow。一般在GTK設(shè)計(jì)中需要新增一個(gè)Container來進(jìn)行布局的調(diào)整,這里為了演示方便,就簡(jiǎn)單的拖動(dòng)一個(gè)按鈕在界面上就好了。將按鈕名字改為button_Click。

image

下面新建兩個(gè)事件(Signal)。在mainWindow中右側(cè)屬性欄切換到Signals一欄,找到GtkObject下的destroy,在Handler下選擇on_mainWindow_destroy,這將作為這個(gè)控件銷毀,也就是窗口關(guān)閉時(shí)的發(fā)出的信號(hào)。

image

另外一個(gè)按鍵的類似,切換到右側(cè)屬性欄的Signals,找到GtkButton中的clicked,選擇Handler為on_button_Click_clicked。這個(gè)作為點(diǎn)擊按鈕發(fā)送的信號(hào)。

image

保存這個(gè)界面設(shè)計(jì)為,比如Tutor1.glade,在任意目錄下。

在同一目錄下新建一個(gè)main.c文件,輸入如下代碼

#include //Add G_MODULE_EXPORT to signal function prototype is important in Windows!!!//#define  G_MODULE_EXPORT   __declspec(dllexport)static unsigned int clkcount;G_MODULE_EXPORT void on_mainWindow_destroy(GtkObject *object, gpointer user_data){   g_print('Quit Here!');   gtk_main_quit();}//G_MODULE_EXPORT must be add!!G_MODULE_EXPORT void on_button_Click_clicked(GtkObject *object, gpointer user_data){   clkcount++;   g_print('  **Button Clicked!**  %d\n',clkcount);}int main (int argc, char *argv[]){   GtkBuilder    *builder;   GtkWidget     *window;   //   clkcount=0;   //   gtk_init(&argc, &argv);   builder = gtk_builder_new();   gtk_builder_add_from_file(builder, 'Tutor1.glade', NULL);   //   window = GTK_WIDGET(gtk_builder_get_object(builder, 'mainWindow'));   //add the top window in the glade code   gtk_builder_connect_signals(builder, NULL);   g_object_unref(G_OBJECT(builder));   //   gtk_widget_show(window);   gtk_main();   return 0;}

這既是運(yùn)行一個(gè)Glade+GTK設(shè)計(jì)出的界面程序的最小代碼,可以看到主函數(shù)里面的代碼量相比于單純用Gtk來編寫少了許多。

注意到前面新建的兩個(gè)信號(hào),on_mainWindow_destroy和on_button_Click_clicked前面都加了G_MODULE_EXPORT進(jìn)行修飾。這是一個(gè)宏,在代碼注釋中寫出了這個(gè)宏的展開。如果不加它,則最后編譯出的運(yùn)行程序?qū)?huì)找不到對(duì)應(yīng)的事件(handler)。之后需要編譯。同文件夾下新建一個(gè)build.bat,輸入如下代碼(假設(shè)gtk安裝在c:\gtk\bin下,并且MinGW的路徑為c:\MinGW\bin)

@echo off
::Set GTK for compile and runtime libs
set PATH=C:\gtk\bin;%PATH%
set PATH=c:\MinGW\bin;%PATH%
(pkg-config --cflags --libs gtk+-2.0 )>temp
set /p pkg=
del temp
::gcc -Wall -mwindows -g -o main main.c %pkg%
gcc -Wall -g -o main main.c %pkg%

編譯成功后,如果不在同文件夾下放置所有的運(yùn)行庫(kù),則程序?qū)o(wú)法運(yùn)行。這時(shí)候最簡(jiǎn)單的就是將所有運(yùn)行庫(kù)dll解壓到同文件夾下即可運(yùn)行(文章末尾打包文件中有),另一種方法是寫一個(gè)腳本設(shè)置運(yùn)行庫(kù)的路徑之后再運(yùn)行程序??梢孕陆ㄒ粋€(gè)launch.bat,輸入如下代碼

@echo off
set PATH=c:\gtk\bin;%PATH%
start main.exe

即可運(yùn)行。

下面是所用到程序的打包,其中包含了例程以及必要腳本

gtk2-glade3-win32.7z

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多