EventBox即為事件盒。在gtk中有一些控件[比如label控件]沒有與之關聯的GDK窗體[也有說是X窗體]。所以他們只能在其父窗體上顯示其外觀;卻不能接收event事件。要接收事件必須借助于事件盒eventbox。先來看一個簡單例子:
/**********************************
**
**FILE: eventboxgtk+.c
**DATE: 20090619 23:50
**AUTHOR: LAMMY
**VERSION: 0.0
**
**********************************/
#include <gtk/gtk.h>
#include <glib/gprintf.h>
static
gboolean _CallBackEventBoxEvent(GtkWidget *pHwidget, GdkEvent *pHevent, gpointer pData)
{
if(GDK_2BUTTON_PRESS == pHevent->type)
{
g_printf("[EventBox] --- 2button pressed ---\n");
}
else
{
g_printf("[EventBox] -- %x\n", pHevent->type);
}
return FALSE;
}
static
gboolean _CallBackLabelEvent(GtkWidget *pHwidget, GdkEvent *pHevent, gpointer pData)
{
if(GDK_2BUTTON_PRESS == pHevent->type)
{
g_printf("[Label] --- 2button pressed ---\n");
}
else
{
g_printf("[Label] -- %x\n", pHevent->type);
}
return FALSE;
}
int main(int argc, char *argv[])
{
GtkWidget *pHwindow, *pHlabel, *pHeventbox;
gtk_init(&argc, &argv);
pHwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(pHwindow), "EventBoxGtk+");
gtk_container_set_border_width(GTK_CONTAINER(pHwindow), 10);
gtk_widget_set_size_request(pHwindow, 200, 150);
pHlabel = gtk_label_new("=GtkLabel=");
pHeventbox = gtk_event_box_new();
gtk_event_box_set_above_child(GTK_EVENT_BOX(pHeventbox), TRUE);
g_signal_connect(G_OBJECT(pHeventbox), "button_press_event", G_CALLBACK(_CallBackEventBoxEvent), NULL);
g_signal_connect(G_OBJECT(pHlabel), "button_press_event", G_CALLBACK(_CallBackLabelEvent), NULL);
gtk_container_add(GTK_CONTAINER(pHeventbox), pHlabel);
gtk_container_add(GTK_CONTAINER(pHwindow), pHeventbox);
gtk_widget_set_events(pHeventbox, GDK_BUTTON_PRESS_MASK);
gtk_widget_realize(pHeventbox);
gdk_window_set_cursor(pHeventbox->window, gdk_cursor_new(GDK_HAND1));
gtk_widget_show_all(pHwindow);
gtk_main();
return 0;
}1. 創建一個eventbox控件函數:
GtkWidget* gtk_event_box_new(void);2. 設置eventbox控件位置函數:
void gtk_event_box_set_above_child (GtkEventBox *event_box,
gboolean above_child);該函數用于設置*evetn_box位于其子控件上方還是下方,取決于above_child為TRUE還是FALSE。當位于其下方時,事件盒的事件消息會先發送到子控件,待其處理完后[前提是子控件有接收事件的能力。從上一個例子,會發現函數_CallBackLabelEvent無論如何都沒有執行],才自己處理;如果在其上方,子控件將不會接收任何事件。
3. 你必須在執行函數gtk_widget_realize之前執行函數gtk_widget_set_events,只有eventbox是個特例。具體原因我這邊將不太清楚,建議看《Foundations of GTK+ Development》的96頁。
|