GTK+ 2.0 入門教程


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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

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



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