大家一起用gtk編程5(視窗布局初探)轉載請註明出處:http://lvjinhua.cublog.cn
作者:lvjinhua at gmail dot com
2006.09.24
上回說到如何使用gdb來調試我們的程式,這回簡單地介紹下如何有效地進行視窗布局,這也將是gtk編程基礎入門的最後一部分;在接下來的日子裡,筆者將針對gtk中的所有內容分專題,對每一部分都進行詳細並且深入的描述,好了,進入今天的主題。
運行:
| hello_box.c |
/* 本例的主要目的是在主視窗中旋轉一個box控制項,再在box控制項中 * 放置一個單行編輯框和一個按鈕 * 並且單擊按鈕退出程式 */ #include<gtk/gtk.h>//按鈕“button”的回呼函數 void cb_button(GtkWidget *widget, gpointer data) {//cb = call back g_print("你單擊了按鈕/n"); gtk_main_quit(); } int main(int argc, char *argv[]) { GtkWidget *main_window; //主視窗對象 GtkWidget *hbox, *button, *editor; gtk_init(&argc, &argv); main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_set_title(GTK_WINDOW(main_window), "Hello,Dubuntu2!"); gtk_window_set_default_size(GTK_WINDOW(main_window), 200,50); button = gtk_button_new_with_label("退出程式"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button),NULL); editor = gtk_entry_new(); hbox = gtk_hbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(hbox), editor, TRUE, TRUE, 10); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 10); gtk_container_add(GTK_CONTAINER(main_window), hbox); gtk_widget_show_all(main_window); gtk_main(); return 0; |
編程程式:gcc -o hello_box hello_box.c `pkg-config --cflags gtk+-2.0` -g -Wall 運行程式:./hello_box |
組件之間的關係:
程式注釋:
1)幾個新增函數:
- g_print("你單擊了按鈕/n"); :這是 glib 庫提供的面向控制台的輸出函數,其功能同標準C的 printf() 差不多,但在gtk程式中使用g_print()更具可移值性。
- gtk_entry_new():構造一個“單行文本輸入框” 對象並返回此對象的指標。
- gtk_hbox_new():構造一個“水平”的盒子,用來裝 單行輸入框和按鈕“
- gtk_box_pack_start():往盒子中”裝“東西(這裡是 enter 和 button)
- gtk_widget_show_all(main_window):顯示 main_window 中的所有對象。
| 小道訊息:在gtk中,所有建立對象的函數都是 ”gtk_對象名_new()“ 的形式 |
2)什麼是 box?
box是一種不可視(就是看不見)的對象,為什麼會有box呢?
Gtk 在對待控制項大小這點上,同 VC/VB/Delphi/PB/Qt 等都是不一樣的,在前邊這幾個語言中,一般情況下,介面設計好後,其所有對象的大小都是固定的,也就是說不會因為螢幕解析度或視窗大小發生變化而自動適應 這些變化(要實現自適應的功能也很麻煩)。而在 gtk 或者 Java 中,控制項在視窗中的位置是個相對值,程式將根據當前環境自動調整控制項的新位置,具體的調整方法是可以通過程式預設的。
box是一種”長條 形“的盒子,有”垂直”和“水平”兩種,分別使用 gtk_hbox_new() 和 gtk_vbox_new() 來建立,可以往“盒子”裡面放入一個或多個其它的控制項,這是使用gtk_box_pack_start()函數實現的,當然,“盒子”裡面也可以放入其它 的“盒子”,這就是gtk介面布局的關鍵,一般的gtk程式都是這樣盒子套盒子再套盒子,在各個盒子中放入按鈕,輸入框,菜單等控制項,這樣就構成了一個複 雜的介面。
當然,介面布局也可以使用 table ,但用得最多的還是 box。
3)gtk_hbox_new()
GtkWidget* gtk_hbox_new (gboolean homogeneous, gint spacing); 功能:建立一個新的水平 box 控制項 參數: homogeneous:如果值為“TRUE”則所有放進去的控制項都分配相同的大小 spacing:相鄰控制項之間的間距,單位為像素(pixel) 傳回值:新建立的控制項的指標。、
|
與之對應的 gtk_vbox_new() 用法完全相同。
4)gtk_box_pack_start()
void gtk_box_pack_start (GtkBox*box, GtkWidget*child, gboolean expand, gboolean fill, guint padding); 功能:往“box”中放入一個控制項
參數: box:就是往這個“box”中放入新的控制項 child:就是放入這個控制項 expand 和 fill:筆者始終認為這兩個參數只可意會,不可言傳 padding:指示同 "child" 控制項相鄰控制項之間的間距(單位為像素 pixel) |
5)GTK_BOX(object) 宏
這個宏用來將 object 參數強制轉換為 GtkBox 對象(當然,也進行類型檢查),gtk中所有的對象都有相似的宏,比如GtkWindow對象有GTK_WINDOW()宏,GtkButton對象有GTK_BUTTON()宏等。
好了,今天的內容就到這裡,讀者可以自己修改 "gtk_hbox_new 和 gtk_box_pack_start“中的各個參數的值,然後重新編譯運行程式,根據運行效果來體會各個參數的關係吧。
推薦: devhelp 協助,在編程中有不清楚的gtk函數或宏,可隨時通過它查詢。
入 門部分結束,筆者的文筆是很爛的,也不知道前邊的內容寫得怎麼樣,希望大家能夠看明白;在接下來的日子裡,我們會分別詳細地介紹各個 gtk 控制項(可視的與不可視的),並且儘可能寫些小樣本來示範一些控制項或介面函數的功能; 在介紹完控制項後,還有 glib 專題,”國際化/本地華“專題, glade 專題,解析 hypersrc 這個原始碼瀏覽軟體。