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页。
|