事件盒 The EventBox
一些 GTK 元件沒有與之相關聯的 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;
}
|
3 則留言