GTK+程序的基本框架分析
資料在此 https://gitee.com/dgwcode/technical_documents/tree/master/GTK
頭文件〈gtk/gtk.h> 包括了 GTK+中所有的控件、變量、函數和結構的聲明。
gtk_init():這個函數必須在控件定義之前使用,參數由命令行中解析出來並且送到該程序中。
主要作用是設立 GTK+運行環境,自動完成一些必要的初始化工作。
創建 GtkWidget 窗口控件,並且讓它顯示出來。
gtk_main():程序運行停在這里等待事件(如鍵盤事件或鼠標事件)的發生,等待用戶來操作窗口。這個函數在所有
的 GTK+程序都要調用。
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget 是 GTK+控件類型,GtkWidget * 能指向任何控件的指針類型。
gtk_window_new()創建一個窗口並返回這個窗口的控件指針。
GTK_WINDOW_TOPLEVEL 指明窗口的類型為最上層的主窗口,它最常用。
gtk_widget_show(window);用來顯示上一步創建的窗口控件
窗口的詳細設置
窗口的創建
GtkWidget *gtk_window_new(GtkWindowType type);
GtkWindowType 是一個枚舉,有兩種情況:
GTK_WINDOW_TOPLEVEL:有邊框
GTK_WINDOW_POPUP:
沒邊框
標題的設置
void gtk_window_set_title(GtkWindow *window, const gchar *title);
窗口最小大小的設置
void gtk_widget_set_size_request(GtkWidget *widget,gint width,gint height);
窗口伸縮設置( FALSE 為不可伸縮 )
void gtk_window_set_resizable(GtkWindow *window, gboolean resizable);
顯示或隱藏所有控件
void gtk_widget_show_all(GtkWidget *widget);
void gtk_widget_hide_all(GtkWidget *widget);
窗口在顯示器位置的設置
void gtk_window_set_position(
GtkWindow *window,
GtkWindowPosition position);
position 常用有 4 種情況:
GTK_WIN_POS_NONE: 不固定
GTK_WIN_POS_CENTER: 居中
GTK_WIN_POS_MOUSE: 出現在鼠標位置
GTK_WIN_POS_CENTER_ALWAYS: 窗口總是居中

#include <gtk/gtk.h> // 頭文件 int main( int argc,char *argv[] ) { gtk_init(&argc, &argv); // 初始化 // 創建頂層窗口 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 設置窗口的標題 gtk_window_set_title(GTK_WINDOW(window), "Window"); // 設置窗口在顯示器中的位置為居中 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); // 設置窗口的最小大小 gtk_widget_set_size_request(window, 400, 300); // 固定窗口的大小 gtk_window_set_resizable(GTK_WINDOW(window), FALSE); // "destroy" 和 gtk_main_quit 連接 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); // 顯示窗口全部控件 // gtk_widget_hide_all(window); // 隱藏窗口 gtk_main(); // 主事件循環 return 0; }
3 進階體驗---帶按鈕的窗口
創建一個帶內容的按鈕
GtkWidget *gtk_button_new_with_label(const gchar *label );
獲得按鈕上面的文本內容
const gchar *gtk_button_get_label(GtkButton *button );
把控件添加到窗口容器里
void gtk_container_add(GtkContainer*container,GtkWidget*widget);
container:容納控件的容器;widget:要添加的控件
v
#include <gtk/gtk.h> // 頭文件 int main( int argc,char *argv[] ) { gtk_init(&argc, &argv); // 初始化 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 創建頂層窗口 // 設置窗口邊框的寬度(窗口里的控件與窗口邊框間隔為 15) gtk_container_set_border_width(GTK_CONTAINER(window), 15); // 創建按鈕,文本信息為"Hello GTK+" GtkWidget *button = gtk_button_new_with_label("Hello GTK+"); const char *str = gtk_button_get_label( GTK_BUTTON(button) ); // 獲得按鈕的內容 printf("str = %s\n", str); // 把按鈕放入窗口(窗口也是一種容器) gtk_container_add(GTK_CONTAINER(window), button); // 顯示控件有兩種方法:逐個顯示,全部顯示 // gtk_widget_show(button); // gtk_widget_show(window); gtk_widget_show_all(window); // 顯示窗口全部控件 gtk_main(); // 主事件循環 return 0; }
動起來---信號與回調函數機制
信號與回調函數機制
GTK+采用了信號與回調函數來處理窗口外部傳來的事件、消息或信號。當信號發生時,程序自動調用為信號連接
的回調函數。
窗口關閉時觸發的常用信號:destroy, delete-event
操作按鈕觸發的常用信號:clicked, pressed,released
信號與回調函數的連接
gulong g_signal_connect(
gpointer instance,
const gchar *detailed_signal,
GCallback c_handler,
gpointer data );
instance:
信號的發出者
detailed_signal: 要連接信號的名稱
c_handler:
回調函數的名稱,需要用 G_CALLBACK()進行轉換
data:
傳遞給回調函數的參數
回調函數的定義
信號連接函數的寫法:
g_signal_connect(button, "pressed",
G_CALLBACK(callback), NULL);
回調函數的定義(參考“參考文檔”)
void callback( GtkButton *button,
gpointer user_data );
button: 信號的發出者
user_data:傳給回調函數的數據
#include <gtk/gtk.h> // 頭文件 // 按鈕按下的處理函數, gpointer 相當於 void * void deal_pressed(GtkButton *button, gpointer user_data) { // 獲得按鈕的文本信息 const gchar *text = gtk_button_get_label( button ); // g_print() 相當於 C 語言的 printf(), gchar 相當於 char g_print("button_text = %s; user_data = %s\n", text, (gchar *)user_data); } int main( int argc,char *argv[] ) { gtk_init(&argc, &argv); // 初始化 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 創建頂層窗口 // 設置窗口邊框的寬度(窗口里的控件與窗口邊框間隔為 15) gtk_container_set_border_width(GTK_CONTAINER(window), 15); /* 當窗口關閉時,窗口會觸發 destroy 信號, * 自動調用 gtk_main_quit()結束程序運行*/ g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); GtkWidget *button = gtk_button_new_with_label("Hello GTK+"); // 創建按鈕 gtk_container_add(GTK_CONTAINER(window), button); // 把按鈕放入窗口(窗口也是一種容器) /* 按鈕按下(pressed)后會自動調用 deal_pressed() * "is pressed"是傳給 deal_pressed()的數據 */ g_signal_connect(button, "pressed", G_CALLBACK(deal_pressed), "is pressed"); gtk_widget_show_all(window); // 顯示窗口全部控件 gtk_main(); // 主事件循環 return 0; }
資料在此 https://gitee.com/dgwcode/technical_documents/tree/master/GTK