首頁 / LinuxDev / GTK+ 2.0 教學-容器元件 Container Widgets

GTK+ 2.0 教學-容器元件 Container Widgets

事件盒 The EventBox

一些 元件沒有與之相關聯的 X 視窗,所以它們只在其父元件上顯示其外觀。由於這個原因,它們不能接收任何事件,並且,如果它們尺寸設置不正確,它們也不會自動剪裁(譯者註:裁剪就是使元件只顯示一部分),這樣可能會把界面弄得亂糟糟的。如果要想元件接收事件,可以使用事件盒(EventBox)。

乍看起來,事件盒元件好像完全沒有什麼用。它在螢幕上什麼也不畫,並且對事件也不做響應。但是,它有一個功能:為它的子元件提供一個 X 視窗。因為許多GTK元件並沒有相關聯的 X 視窗,所以這一點很重要。雖然沒有 X 視窗可以節省記憶體,提高系統性能,但它也有一些弱點。沒有 X 視窗的元件不能接收事件,並且對它的任何內容不能實施剪裁。雖然事件盒元件的名稱事件盒強調了它的事件處理功能,它也能用於剪裁構件(更多的訊息請看下面的範例)。

用以下函式創建一個新的事件盒元件:

    GtkWidget *gtk_event_box_new( void );

然後子元件就可以添加到這個事件盒裡面:

    gtk_container_add (GTK_CONTAINER (event_box), child_widget);

下面的範例說明了事件盒的用途:創建一個標籤,將它剪裁,放到一個小盒子裡面,然後設置讓滑鼠點擊時程式退出。改變視窗的尺寸會使標籤元件的尺寸發生變化。

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

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

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title (GTK_WINDOW (window), "Event Box");

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

    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
/* 創建一個事件盒,然後將它加到頂級視窗上 */
    event_box = gtk_event_box_new ();
    gtk_container_add (GTK_CONTAINER (window), event_box);
    gtk_widget_show (event_box);
/* 創建一個長標籤 */
    label = gtk_label_new ("Click here to quit, quit, quit, quit, quit");
    gtk_container_add (GTK_CONTAINER (event_box), label);
    gtk_widget_show (label);
/* 將標籤剪裁短。 */
   gtk_widget_set_size_request (label, 110, 20);
/* 為它繫一個動作 */
    gtk_widget_set_events (event_box, GDK_BUTTON_PRESS_MASK);
    g_signal_connect (event_box, "button_press_event",
	              G_CALLBACK (exit), NULL);
    /* 又是一個要有 X 視窗的東西... */  
    //譯者註: 要設置滑鼠式樣也要有 X 視窗。gtk_widget_realize使元件在沒有show之前就形成 X 視窗。
    gtk_widget_realize (event_box);
    gdk_window_set_cursor (event_box->window, gdk_cursor_new (GDK_HAND1));

    gtk_widget_show (window);

    gtk_main ();

    return 0;
}
Print Friendly, PDF & Email
馬上成為工作達人的Fans

About ㄚ琪

工作達人Fun Taiwan的創辦者及總編,可以在這裡更認識他。

3 comments

發表迴響

你的電子郵件位址並不會被公開。 Required fields are marked *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料

Scroll To Top