1. 程式人生 > >GTK+重拾--09 GTK+中的組件(一)

GTK+重拾--09 GTK+中的組件(一)

nec face 可見 ref init lines efault borde rust

(一):寫在前面


在這篇文章中主要介紹了GTK+程序中的各種構件,這是解說構件的第一個部分,另外一部分將在下一個小節中講到。

構件是建立一個GUI程序的基礎。在GTK+的長期發展過程中。一些特定的構件逐漸成為了大多數編程工具集和差點兒全部的操作系統的公用標準了。比如,按鈕,選擇框或者是一個滑動條。

對於GTK+來說,內置了非常多經常使用的專用構件,供我們使用。

(二):GtkButton


GtkButton是一個簡單易用的構件,通常被用於觸發一個動作。

以下我們來看一下GtkButton的用法:

#include <gtk/gtk.h>

int
main(int argc,char *argv[]) { GtkWidget *window; GtkWidget *fixed; GtkWidget *button; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WIDGET(window),"GtkButton"); gtk_window_set_default_size(GTK_WINDOW(window),230,150
); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); fixed = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window),fixed); button = gtk_button_new_with_label("Quit"); gtk_fixed_put(GTK_FIXED(fixed),button,50,50); gtk_widget_set_size_request(button,80,35); g_signal_connect(G_OBJECT(button
),"clicked",G_CALLBACK(gtk_main_quit),G_OBJECT(window)); g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show_all(window); gtk_main(); return 0; }

在上面的樣例中,就是展示一個按鈕放置在一個fixed容器中,當我們按下按鈕的時候。程序就會退出。

button = gtk_button_new_with_label("Quit");

這段代碼就生成了一個帶有標簽的GtkButton構件。

同一時候結合我們上一小節學過的事件。為按鈕加入對應的事件,就能夠了:

g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(gtk_main_quit),G_OBJECT(window));

我們來看一下執行效果:

技術分享

(三):GtkCheckButton


GtkCheckButton也是一個構件,他有兩種狀態。“開”和“關”,開表示一個可見的浮復選標記。

我們來看一下他的用法:

#include <gtk/gtk.h>

void toggle_title(GtkWidget *widget,gpointer window)
{
    if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))){
        gtk_window_set_title(window,"GtkCheckButton");
    }else{
        gtk_window_set_title(window,"");
    }
}

int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *frame;
    GtkWidget *check;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),230,150);
    gtk_window_set_title(GTK_WINDOW(window),"GtkCheckButton");

    frame = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window),frame);

    check = gtk_check_button_new_with_label("Show title");
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),TRUE);
    GTK_WIDGET_UNSET_FLAGS(check,GTK_CAN_FOCUS);

    gtk_fixed_put(GTK_FIXED(frame),check,50,50);

    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    g_signal_connect(G_OBJECT(check),"clicked",G_CALLBACK(toggle_title),(gpointer)window);

    gtk_widget_show_all(window);

    gtk_main();
    return 0;
}

我們要展示的功能就是:標題欄的顯示狀態依據構件GtkCheckButton的狀態變化而變化。

    check = gtk_check_button_new_with_label("Show title");
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),TRUE);

一個GtkCheckButton構件被生成了而且默覺得已標記(即狀態為打開)。

    GTK_WIDGET_UNSET_FLAGS(check,GTK_CAN_FOCUS);

這行代碼是取消了對復選框的默認鎖定,這樣做到原因非常easy。是由於我們能夠隨意設置復選框外面是否“罩”上一個“框”。

而最上面的監聽函數就是實現功能的關鍵位置:這樣。標題欄的顯示狀態依據構件GtkCheckButton的狀態變化而變化。

我們來看一下執行效果:

技術分享

技術分享

(四):GtkFrame


GTkFrame是一種裝飾性的框架,還能夠為他設置一個標簽(可有可無)。

我們來看一看GtkFrame是怎樣使用的,以及其使用後的效果:

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *table;


    GtkWidget *frame1;
    GtkWidget *frame2;
    GtkWidget *frame3;
    GtkWidget *frame4;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),250,250);
    gtk_window_set_title(GTK_WINDOW(window),"GtkFrame");

    gtk_container_set_border_width(GTK_CONTAINER(window),10);

    table = gtk_table_new(2,2,TRUE);
    gtk_table_set_row_spacings(GTK_TABLE(table),10);
    gtk_table_set_col_spacings(GTK_TABLE(table),10);
    gtk_container_add(GTK_CONTAINER(window),table);

    frame1 = gtk_frame_new("Shadow In");
    gtk_frame_set_shadow_type(GTK_FRAME(frame1),GTK_SHADOW_IN);


    frame2 = gtk_frame_new("Shadow out");
    gtk_frame_set_shadow_type(GTK_FRAME(frame2),GTK_SHADOW_OUT);

    frame3 = gtk_frame_new("Shadow Etched In");
    gtk_frame_set_shadow_type(GTK_FRAME(frame3),GTK_SHADOW_ETCHED_IN);

    frame4 = gtk_frame_new("Shadow Etched Out");
    gtk_frame_set_shadow_type(GTK_FRAME(frame4),GTK_SHADOW_ETCHED_OUT);

    gtk_table_attach_defaults(GTK_TABLE(table),frame1,0,1,0,1);
    gtk_table_attach_defaults(GTK_TABLE(table),frame2,0,1,1,2);
    gtk_table_attach_defaults(GTK_TABLE(table),frame3,1,2,0,1);
    gtk_table_attach_defaults(GTK_TABLE(table),frame4,1,2,1,2);

    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),G_OBJECT(window));

    gtk_widget_show_all(window);

    gtk_main();
    return 0;
}

這個實例我們展示了四種不同風格的frame框架。這些框架構件是利用表格所無法布局的。

 frame1 = gtk_frame_new("Shadow In");
 gtk_frame_set_shadow_type(GTK_FRAME(frame1),GTK_SHADOW_IN);

我們生成了一個GtkFrame構件,而且還為他設置了陰影種類。

技術分享

(五):GtkLabel


GtkLabel的功能非常明顯,是用來顯示文字的,當然。他也會支持markup語法,我們在這裏展示兩個樣例:

1:普通GtkLabel的使用

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *label;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_title(GTK_WINDOW(window),"Nymohetamine");
    gtk_window_set_default_size(GTK_WINDOW(window),350,400);

    label = gtk_label_new("Cold was my soul\n    Untold was the pain\n    I faced when you left me\n    A rose in the rain....\n    So I swore to the razor\n    That never,enchained\n    Would your dark nails of faith\n    Be pushed through my veins again\n    \n    Bared on your tomb\n    I‘m a prayer for your loneliness\n    And would you ever soon\n    Come above onto me?

\n On the binds of your lowliness\n I could always find the slot for your sacred key "); gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_CENTER); gtk_container_add(GTK_CONTAINER(window),label); g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show_all(window); gtk_main(); return 0; }

在這裏顯示了一個歌詞。居中顯示,我們來看一下執行效果:

技術分享

2:支持markup語法的label

以下我們來展示GtkLabel怎樣支持markup語法:

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *label;

    gtk_init(&argc,&argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_title(GTK_WINDOW(window),"markup label");

    char *str = "<b>ZetCode</b>,Knowledge only matters";

    label = gtk_label_new(NULL);
    gtk_label_set_markup(GTK_LABEL(label),str);

    gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_CENTER);

    gtk_container_add(GTK_CONTAINER(window),label);

    gtk_widget_show(label);

    gtk_window_set_default_size(GTK_WINDOW(window),300,100);

    g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);

    gtk_widget_show(window);


    gtk_main();
    return 0;
}

以下就是支持markup語法效果的label:

技術分享

(六):寫在後面


在這裏,我們先介紹幾種經常使用的GTK+中的構件,後面一節我們會接著介紹GTK+中還有哪些實用的構件。

註:下載代碼

GTK+重拾--09 GTK+中的組件(一)