标题: GTK窗口布局管理--EvnetBox [打印本页]

作者: liuda    时间: 2015-1-23 19:31
标题: GTK窗口布局管理--EvnetBox
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页。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1