linux GTK教程(消息機制/標簽/按鈕/圖像/文本/對話框/菜單/容器)


  GTK+(GIMP Toolkit)是一套源碼以LGPL許可協議分發、跨平台的圖形工具包。最初是為GIMP寫的,已成為一個功能強大、設計靈活的一個通用圖形庫,是GNU/Linux下開發圖形界面的應用程序的主流開發工具之一。

1.GTK安裝

2.一個簡單的GTK窗口程序

#include <stdio.h>
#include <gtk/gtk.h>

int main(int argc, char **argv)
{
    GtkWidget *window;
    gtk_init(&argc,&argv);
    
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//參數表示創建主窗口
    
    g_signal_connect(G_OBJECT(window),"delete event",G_CALLBACK(gtk_main_quit),NULL);//空間和消息函數創建關聯
    gtk_window_set_title(GTK_WINDOW(window),"test");
    gtk_widget_show(window);
    
    gtk_main();
    
    return 0;
}

g_signal_connect()函數原型:

gulong g_signal_connect(gpointer object, const gchar* name, GCallback func, gpointer func_data);
//object指向產生消息的控件
//name為消息名稱
//func為發生消息后的回調函數
//func_data是床遞給消息處理函數func的參數

//func
void callback_func(GtkWidget *widget, gpointer func_data);
//widget指向接收消息的控件
//func_data是傳遞的消息

//另外一個connect函數,它不提供消息的傳送
gulong g_signal_connect_swapped(gpointer object,const gchar *name,GCallback func, gpointer slot_object);

3.為窗口增加一個按鈕控件

//一般按鈕的創建函數

GtkWidget* gtk_button_new(void)
//空按鈕

GtkWidget* gtk_button_new_with_label(const gchar* label)
//帶標簽的

GtkWidget* gtk_button_new_with_mnemonic(congst gchar* label)
//帶助記符的

GtkWidget* gtk_button_new_from_stock(const gchar* stock_id)
//基於固定項按鈕--->由一個圖標,一個文本標簽和一個可選的快捷鍵組成

//其他函數

const gchar *gtk_button_get_label(GtkButton *button)
//獲取標簽文本

void gtk_button_set_label(GtkButton *button)

gboolean gtk_button_get_focus_on_click(GtkButton *button)
//獲取按鈕焦點
gboolean gtk_button_set_focus_on_click(GtkButton *button)
GtkWidget* gtk_button_get_image(GtkButton *button)
//獲取按鈕圖像

GtkWidget* gtk_button_set_image(GtkButton *button)

  用戶沒有點擊按鈕,但是需要執行點擊按鈕時所對應的動作。一種方法是直接調用按鈕的c l i c k e d信號的回調函數,另一種方法就是調用一個函數,讓這個函數引發c l i c k e d信號,這樣自然就會調用這個回調函數。對鼠標按下、松開、進入和離開等信號也有類似的函數。如下:

//對給定按鈕構件b u t t o n引發p r e s s e d信號,效果是直接調用p r e s s e d信號對應的回調函數:
void gtk_button_pressed (GtkButton *button);
//對給定按鈕構件b u t t o n引發r e l e a s e d信號:
void gtk_button_released (GtkButton *button);
//對給定按鈕構件b u t t o n引發c l i c k e d信號:
void gtk_button_clicked (GtkButton *button);
//對給定按鈕構件b u t t o n引發e n t e r信號:
void gtk_button_enter (GtkButton *button);
//對給定按鈕構件b u t t o n引發l e a v e信號:
void gtk_button_leave (GtkButton *button);

例子:

View Code

4.標簽創建和屬性設置

GtkWidget *gtk_label_new(const char *str)
GtkWidget *gtk_laber_new_with_mnemonic(const char *str)
//第二個創建了一個帶助記符的標簽

void gtk_label_set_text(GtkLaber *label, const char *str)
//改變標簽文本

const gchar* gtk_label_get_text(GtkLabel *label)
//獲取標簽當前文本

void gtk_label_set_justify(...)
//設置對齊方式

void gtk_label_set_line_wrap(..)
//激活自動換行

void gtk_label_set_pattern(..)
//加下划線

例子:

View Code
//laber_demo.c
#include <stdio.h>
#include <gtk/gtk.h>



int main(int argc, char **argv)
{
    GtkWidget *window;
    GtkWidget *label;     //標簽
    GtkWidget *frame;     //框架
    GtkWidget *main_vbox; //組裝盒
    
    gtk_init(&argc,&argv);
    
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//參數表示創建主窗口
    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),G_OBJECT(window));
    
    gtk_window_set_title(GTK_WINDOW(window),"Label Demo");
    
    main_vbox=gtk_vbox_new(TRUE,6);
    gtk_container_set_border_width(GTK_CONTAINER(window),20);
    
    label=gtk_label_new("LABEL");
    gtk_box_pack_start(GTK_BOX(main_vbox),label,FALSE,FALSE,0);
    
    
    frame=gtk_frame_new("Normal label");
    label=gtk_label_new("this is a label");
    gtk_container_add(GTK_CONTAINER(frame),label);
    gtk_box_pack_start(GTK_BOX(main_vbox),frame,FALSE,FALSE,0);
    
    frame=gtk_frame_new("multi-line label");
    label=gtk_label_new("this is a multi-line label.\nsecond line.\nthird line.");
    gtk_container_add(GTK_CONTAINER(frame),label);
    gtk_box_pack_start(GTK_BOX(main_vbox),frame,FALSE,FALSE,0);
    
    frame=gtk_frame_new("line wrapped label");
    label=gtk_label_new("this is a line wrapped label."\
                        "second line."\
                        "third line.");
    gtk_label_set_line_wrap(GTK_LABEL(label),TRUE);
    gtk_container_add(GTK_CONTAINER(frame),label);
    gtk_box_pack_start(GTK_BOX(main_vbox),frame,FALSE,FALSE,0);
    
    gtk_container_add(GTK_CONTAINER(window),main_vbox);
    
    gtk_widget_show_all(window);
    
    gtk_main();
    
    return 0;
}

5.開關按鈕,復選按鈕,單選按鈕

//創建開關按鈕
GtkWidget *gtk_toggle_button_new(void)
GtkWidget *gtk_toggle_button_new_with_label(const gchar *label)
GtkWidget *gtk_toggle_button_new_with_mnemonic(const gchar *label)

//檢查按鈕狀態
gboolean gtk_toggle_button_get_active(GtkToggleButton *toggle_button)

//設置按鈕狀態
void gtk_toggle_button_set_active(GtkToggleButton *toggle_button, gboolean is_active)
//創建復選按鈕,檢查函數同上
GtkWIdget *gtk_check_button_new(void)
GtkWIdget *gtk_check_button_new_with_label(const gchar* label)
GtkWIdget *gtk_check_button_new_with_mnemonic(const gchar* label)
//創建單選按鈕
GtkWidget *gtk_radio_button_new( GSList *group );
GtkWidget *gtk_radio_button_new_from_widget( GtkRadioButton *group );
GtkWidget *gtk_radio_button_new_with_label( GSList *group,const gchar *label );
GtkWidget* gtk_radio_button_new_with_label_from_widget( GtkRadioButton *group,const gchar *label );
GtkWidget *gtk_radio_button_new_with_mnemonic( GSList *group,const gchar *label );
GtkWidget *gtk_radio_button_new_with_mnemonic_from_widget( GtkRadioButton *group,const gchar *label );

//單選按鈕的屬性

//創建組獲取組標識
GSList *gtk_radio_button_get_group(GtkRadioButton *radio_button)

//設置組中的單選按鈕
GSList *gtk_radio_button_set_group(GtkRadioButton *radio_button)

6.圖像控制

//圖像控件創建函數
GtkWidget* gtk_image_new(void)
GtkWidget* gtk_image_new_file(const gchar* filename)
GtkWidget* gtk_image_new_from_pixmap(GdkPixmap *pixmap)
GtkWidget* gtk_image_new_from_pixbuf(GdkPixbuf *pixbuf)
GtkWidget* gtk_image_new_from_stock(const gchar* stock_id)
GtkWidget* gtk_image_new_from_animation(GdkPixbufAnimation *animation)

//屬性設置
void gtk_image_set_from_pixmap(...)
void gtk_image_set_from_image(...)
void gtk_image_set_from_file(...)
void gtk_image_set_from_pixfuf(...)
void gtk_image_set_from_stock(...)
void gtk_image_set_from_animation(...)

//圖片信息獲取函數
void gtk_image_get_pixmap(...)
void gtk_image_get_image(...)
GdkPixbuf* gtk_image_get_pixbuf(...)
void gtk_image_get_icon_name(...)
GdkPixbufAnimation* gtk_image_get_animation(...)

//清空圖像
void gtk_image_clear(GtkImage *image)

例子:

View Code
#include <stdio.h>
#include <gtk/gtk.h>



int main(int argc, char **argv)
{
    GtkWidget *window;//主窗口
    GtkWidget *image;  //圖像
    GtkWidget *vbox;  //組裝盒
    
    gtk_init(&argc,&argv);
    
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//參數表示創建主窗口
    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),G_OBJECT(window));
    
    gtk_window_set_title(GTK_WINDOW(window),"Image Demo");
    
    vbox=gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);
    
    image=gtk_image_new_from_file("img.jpg");
    gtk_box_pack_start(GTK_BOX(vbox),image,TRUE,TRUE,0);
    
    image=gtk_image_new_from_stock(GTK_STOCK_HELP,GTK_ICON_SIZE_MENU);
    
    gtk_widget_show_all(window);
    
    gtk_main();
    
    return 0;
}

7.文本框輸入

//單行輸入
GtkWidget *gtk_entry_new(void)

//屬性設置
void gtk_entry_set_max_length(GtkEntry* entry,gint max)
gint gtk_entry_get_max_length(GtkEntry* entry)
void gtk_entry_set_visibility(GtkEntry* entry,gboolean visible)
gboolean gtk_entry_get_visibility(GtkEntry* entry)
void gtk_editable_set_editable(GtkEditable* entry, gboolean editable)
gboolean gtk_editable_get_editable(GtkEditable* entry)
void gtk_entry_set_text(GtkEntry *entry, const gchar* text)
const gchar*  gtk_entry_get_text(GtkEntry *entry)


//多行輸入
GtkWidget *gtk_text_new(GtkAdjustment *hadj, GtkAdjustment *vadj)

//屬性設置
void gtk_text_set_editable(GtkText *text, gboolean editable)
void gtk_text_set_adjustments(GtkText *text,GtkAjustment* hadj,GtkAjustment *vadj)
void gtk_text_set_word_wrap(GtkText* text,gboolean word_wrap)
guint gtk_text_get_point(GtkText *text)
void gtk_text_set_point(GtkText *text,guint index)
guint gtk_text_get_length(GtkText *text)
void gtk_text_insert(GtkText *text,GdkFont *font,GdkColor *fore,GdkColor *back,const char *chars,gint length)

//創建滾動條
vscrollbar = gtk_vscrollbar_new(GTK_TEXT(text)->vadj)

例子:

View Code
//laber_demo.c
#include <stdio.h>
#include <gtk/gtk.h>

static void entry_toggle_visibility(GtkWidget *checkbutton,GtkWidget *entry)
{
    gtk_entry_set_visibility(GTK_ENTRY(entry),GTK_TOGGLE_BUTTON(checkbutton)->active);
}

void text_toggle_editable(GtkWidget *checkbutton,GtkWidget *text)
{
    gtk_text_set_editable(GTK_TEXT(text),GTK_TOGGLE_BUTTON(checkbutton)->active);
}

int main(int argc, char **argv)
{
    GtkWidget *window;//主窗口
    GtkWidget *vbox;  //組裝盒
    GtkWidget *entry;
    GtkWidget *vscrollbar;
    GtkWidget *text;
    GtkWidget *table;
    GtkWidget *check;
    
    gtk_init(&argc,&argv);
    
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//參數表示創建主窗口
    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),G_OBJECT(window));
    g_signal_connect_swapped(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_widget_destroy),G_OBJECT(window));
    gtk_window_set_title(GTK_WINDOW(window),"Entry and Text Demo");
    
    vbox=gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);
    
    entry=gtk_entry_new();
    gtk_entry_set_max_length(GTK_ENTRY(entry),30);
    gtk_entry_set_text(GTK_ENTRY(entry),"this is a entry");
    gtk_box_pack_start(GTK_BOX(vbox),entry,TRUE,TRUE,0);
    
    check=gtk_check_button_new_with_label("Visible");
    gtk_box_pack_start(GTK_BOX(vbox),check,TRUE,TRUE,0);
    g_signal_connect(G_OBJECT(window),"toggled",G_CALLBACK(entry_toggle_visibility),(gpointer)entry);
    
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),TRUE);
    
    table=gtk_table_new(2,2,FALSE);
    gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,0);
    
    text=gtk_text_new(NULL,NULL);
    gtk_text_set_editable(GTK_TEXT(text),TRUE);
    gtk_table_attach(GTK_TABLE(table),text,0,1,0,1,
                    GTK_EXPAND|GTK_SHRINK|GTK_FILL,
                    GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
    
    vscrollbar=gtk_vscrollbar_new(GTK_TEXT(text)->vadj);
    gtk_table_attach(GTK_TABLE(table),vscrollbar,1,2,0,1,
                    GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
    
    check=gtk_check_button_new_with_label("Editable");
    gtk_box_pack_start(GTK_BOX(vbox),check,FALSE,FALSE,0);
    g_signal_connect(G_OBJECT(check),"toggled",G_CALLBACK(text_toggle_editable),text);
    
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),TRUE);
    
    gtk_widget_show_all(window);
    
    gtk_main();
    
    return 0;
}
//注意:編譯時候,要添加-DGTK_ENABLE_BROKEN
gcc test.c -Wall -o test -DGTK_ENABLE_BROKEN `pkg-config --cflags --libs gtk+-2.0`

以上方法,可以解決下面的關於vscrollbar滾動條的錯誤:

error: invalid type argument of ‘->’ (have ‘int’)

8.對話框

//對話框結構
struct GtkDialog{
    GtkWindow window;           //窗口
    
    GtkWidget *vbox;            //垂直組裝盒
    GtkWidget *action_area;     //活動區
    GtkWidget *separator;       //分割線
};


//創建函數
GtkWidget* gtk_dialog_new(void)
GtkWidget* gtk_dialog_new_with_buttons(const gchar  *title, GtkWindow *parent,
             GtkDialogFlags flags,
const gchar *first_button_text,...); //添加分割線 void gtk_dialog_set_has_separator(GtkDialog *dialog, gboolean setting) //添加按鈕 GtkWidget* gtk_dialog_add_button(GtkDialog *dialog, const gchar *button_text,gint response_id); void gtk_dialog_add_buttons(GtkDialog *dialog,const gchar *first_button_text,...)

  為了開發程序方便,GTK在GtkDialog基礎上,封裝了一些常用的對話框,包括消息對話框(GtkMessageDialog),應用程序信息對話框(GtkAboutDialog),文本選擇對話框(GtkFileChooserDialog),字體選擇對話框(GtkFontSelectionDialog)等。

例子:

View Code
//laber_demo.c
#include <stdio.h>
#include <gtk/gtk.h>

void destroy(GtkWidget *widget,gpointer *data)
{
    gtk_widget_destroy(GTK_WIDGET(data));
}

void button_event(GtkWidget* widget,gpointer *data)
{
    GtkDialog *dialog;
    GtkWidget *button;
    dialog=gtk_dialog_new();
    gtk_window_set_title(GTK_WINDOW(dialog),"Normal Dialog");
    
    button=gtk_button_new_with_label("YES");
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area),button,TRUE,TRUE,0);
    g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(gtk_main_quit),NULL);
    
    gtk_widget_show(button);
    
    button=gtk_button_new_with_label("NO");
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area),button,TRUE,TRUE,0);
    g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(destroy),dialog);
    
    gtk_widget_show(button);
    
    gtk_widget_show(dialog);
}

void show_info_dialog(GtkWidget *widget,gpointer window)
{
    GtkDialog *dialog;
    dialog=gtk_message_dialog_new(window,GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,"infor to show","title");
    gtk_window_set_title(GTK_WINDOW(dialog),"Information");
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

void show_warning_dialog(GtkWidget *widget,gpointer window)
{
    GtkWidget *dialog;
    dialog=gtk_message_dialog_new(window,GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_WARNING,GTK_BUTTONS_OK,"warning infor");
    gtk_window_set_title(GTK_WINDOW(dialog),"Warning");
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

int main(int argc, char **argv)
{
    GtkWidget *window;//主窗口
    GtkWidget *vbox;  //組裝盒
    GtkWidget *button;
    
    gtk_init(&argc,&argv);
    
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);//參數表示創建主窗口
    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),G_OBJECT(window));
    gtk_window_set_title(GTK_WINDOW(window),"Dialog Demo");
    
    vbox=gtk_vbox_new(FALSE,6);
    gtk_container_add(GTK_CONTAINER(window),vbox);
    
    button=gtk_button_new_with_label("Exit");
    gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,TRUE,0);
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(button_event),NULL);
    gtk_widget_show(button);
    
    button=gtk_button_new_with_label("Infor");
    gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,TRUE,0);
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(show_info_dialog),(gpointer)window);
    gtk_widget_show(button);
    
    button=gtk_button_new_with_label("Warning");
    gtk_box_pack_start(GTK_BOX(vbox),button,TRUE,TRUE,0);
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(show_warning_dialog),(gpointer)window);
    gtk_widget_show(button);
    
    gtk_widget_show_all(window);
    
    gtk_main();
    
    return 0;
}

 9.文本選擇控件

//創建函數
GtkWidget *gtk_file_selection_new(const gchar *title)

//屬性設置
void gtk_file_selection_set_filename(GtkFileSelection *filesel,const gchar *filename);//設置默認路徑,filesel文件選擇控件標識,filename設置的目錄和文件名

gchar* gtk_file_selection_get_filename(gtkfileselection *filesel);//獲取所選文件

void gtk_file_selection_show_fileop_buttons(GtkFileSelection *filesel)//顯示文件按鈕

void gtk_file_selection_set_select_multiple(GtkFileSelection *filesel,gboolean select_multiple)//設置文件多選模式

例子:

View Code
#include <stdio.h>
#include <gtk/gtk.h>

void file_ok_sel(GtkWidget *w,GtkFileSelection *fs)
{
    g_print("%s\n",gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));//獲取文件路徑
}

int main(int argc, char **argv)
{
    GtkWidget *filesel;
    
    gtk_init(&argc,&argv);
    
    filesel=gtk_file_selection_new("File Selection");
    g_signal_connect(G_OBJECT(filesel),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button),"clicked",G_CALLBACK(file_ok_sel),(gpointer)filesel);
    g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button),"clicked",G_CALLBACK(gtk_widget_destroy),G_OBJECT(filesel));
    
    //gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel),"img.jpg");
    
    gtk_widget_show_all(filesel);
    
    gtk_main();
    
    return 0;
}

 10.菜單

  GTK中創建菜單需要三個子項,分別為:

  • 菜單項GtkMenuItem:就是用戶具體要單擊的對象
  • 菜單Menu:菜單項的容器,用於將創建好的菜單項添加到菜單中
  • 菜單欄GtkMenuBar:菜單的容器,用於組織各個菜單
//創建菜單
GtkWIdget* gtk_menu_new(void)

//創建菜單項
GtkWidget* gtk_menu_item_new(void)
GtkWidget* gtk_menu_item_new_with_label(const gchar *label)
GtkWidget* gtk_menu_item_new_with_mnemonic(const gchar *label)

//創建菜單欄
GtkWidget* gtk_menu_new(void)

  下面介紹如何將上面的菜單欄,菜單和菜單項組合成一個菜單控件。

  要將菜單項放到一個菜單中,首先需要創建一個菜單的根菜單項,即根條目,在菜單被下拉時才顯示所有的菜單項。其他菜單項則組織為根菜單項的子菜單。

  可以使用追加或者插入等函數將菜單放到一個菜單中,具體函數宏定義如下:

//將菜單項追加到菜單項列表的最后位置
#define gtk_menu_append(menu,child) gtk_menu_shell_append((GtkMenuShell *)(menu),(child))
//將菜單項添加到菜單項列表的開始位置
#define gtk_menu_prepend(menu,child) gtk_menu_shell_prepend((GtkMenuShell *)(menu),(child))
//將菜單項添加到菜單項列表的指定位置
#define gtk_menu_insert(menu,child,pos) gtk_menu_shell_insert((GtkMenuShell *)(menu),(child),(pos))


//將根菜單項與子菜單項進行關聯
void gtk_menu_item_set_submenu(GtkMenuItem *menu_item,GtkWidget* submenu)


//將菜單項加到菜單欄
#define gtk_menu_bar_append(menu,child) gtk_menu_shell_append((GtkMenuShell *)(menu),(child))
#define gtk_menu_bar_prepend(menu,child) gtk_menu_shell_prepend((GtkMenuShell *)(menu),(child))
#define gtk_menu_bar_insert(menu,child,pos) gtk_menu_shell_insert((GtkMenuShell *)(menu),(child),(pos))

總結主要步驟:

  1. 用gtk_menu_new()函數創建一個新的菜單
  2. 創建菜單上需要的菜單項,將菜單項添加到菜單上
  3. 用gtk_menu_item_new()函數創建一個根菜單項
  4. 用gtk_menu_item_set_submenu()函數將菜單綁定到根菜單項
  5. 用gtk_menu_bar_new()函數創建一個新的菜單欄
  6. 用gtk_menu_bar_append()函數將根菜單項放到菜單欄上

 例子:

View Code
//MENU_demo.c
#include <stdio.h>
#include <gtk/gtk.h>

int main(int argc, char **argv)
{
    GtkWidget *window;
    GtkWidget *h_box;
    GtkWidget *menu_item,*root_menuitem;
    GtkWidget *menu;
    GtkWidget *menu_bar;
    
    gtk_init(&argc,&argv);
    
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_usize(window,400,200);
    g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    
    h_box=gtk_vbox_new(FALSE,5);
    gtk_container_add(GTK_CONTAINER(window),h_box);
    
    menu_bar=gtk_menu_bar_new();
    gtk_box_pack_start(GTK_BOX(h_box),menu_bar,FALSE,TRUE,0);
    
    
    menu=gtk_menu_new();
    
    menu_item=gtk_menu_item_new_with_label("打開");
    gtk_menu_append(GTK_MENU(menu),menu_item);
    menu_item=gtk_menu_item_new_with_label("保存");
    gtk_menu_append(GTK_MENU(menu),menu_item);
    menu_item=gtk_menu_item_new_with_label("退出");
    gtk_menu_append(GTK_MENU(menu),menu_item);
    g_signal_connect(GTK_OBJECT(menu_item),"active",G_CALLBACK(gtk_main_quit),NULL);
    
    root_menuitem=gtk_menu_item_new_with_label("文件");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menuitem),menu);
    gtk_menu_bar_append(GTK_MENU_BAR(menu_bar),root_menuitem);
    root_menuitem=gtk_menu_item_new_with_label("編輯");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menuitem),menu);
    gtk_menu_bar_append(GTK_MENU_BAR(menu_bar),root_menuitem);
    root_menuitem=gtk_menu_item_new_with_label("幫助");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menuitem),menu);
    gtk_menu_bar_append(GTK_MENU_BAR(menu_bar),root_menuitem);    
    
    gtk_widget_show_all(window);
    
    gtk_main();
    
    return 0;
}

11.容器與布局

組裝盒:

//創建組裝盒
GtkWIght* gtk_hbox_new(gboolean homogeneous, gint spacing)//橫向
GtkWIght* gtk_vbox_new(gboolean homogeneous, gint spacing)//縱向

//加入控件
void gtk_box_pack_start(GtkBox *box,GtkWidget *child,gboolean expand,gboolean fill,guint padding);//放在頂部或左邊
void gtk_box_pack_end(GtkBox *box,GtkWidget *child,gboolean expand,gboolean fill,guint padding);//放在下部或右邊
//box為組裝盒,expend為可填充控件,fill是否充分利用空間,padding控件周圍保留的間距

//除此之外,還有按鈕盒(GtkButtonBox)

表格:

//創建表格
GtkWidget* gtk_table_new(guint rows, guint columns, gboolean homogeneous)

//添加控件表格的參數
void gtk_table_attach(GtkTable *table, GtkWidget *child, guint left_attach,guint right_attach,guint top_attach,guint botton_attach,GtkAttahOptions xoptions,GtkAttachOptions yoptions,guint xpadding,guint ypadding);
void gtk_table_attach_default(GtkTable *table, GtkWidget *child, guint left_attach,guint right_attach,guint top_attach,guint botton_attach);
//table表名,child控件名

//屬性設置
void gtk_table_set_row_spacing(...)
guint gtk_table_get_row_spacing(...)

void gtk_table_set_col_spacing(...)
guint gtk_table_get_col_spacing(...)

guint gtk_table_get_default_row_spacing(...)
guint gtk_table_get_default_col_spacing(...)

void gtk_table_set_homogeneous(...)
gboolean gtk_table_get_homogeneous(...)

此外,還有固定容器(GtkFixed),布局容器(GtkLayout),分割面板容器(GtkPaned),分頁容器(GtkNotebook),這四種容器可以參考這里

知識共享許可協議
linux GTK教程(消息機制/標簽/按鈕/圖像/文本/對話框/菜單/容器)cococo點點 創作,采用 知識共享 署名-非商業性使用-相同方式共享 3.0 中國大陸 許可協議進行許可。歡迎轉載,請注明出處:
轉載自: cococo點點 http://www.cnblogs.com/coder2012


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM