標題: GTK窗口布局管理--EvnetBox [打印本頁]

作者: liuda    時間: 2015-1-23 19:31
標題: GTK窗口布局管理--EvnetBox
EventBox即為事件盒。在gtk中有一些控件[比如label控件]沒有與之關(guān)聯(lián)的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. 創(chuàng)建一個eventbox控件函數(shù):
GtkWidget* gtk_event_box_new(void);2. 設(shè)置eventbox控件位置函數(shù):
void                gtk_event_box_set_above_child       (GtkEventBox *event_box,
                                                         gboolean above_child);該函數(shù)用于設(shè)置*evetn_box位于其子控件上方還是下方,取決于above_child為TRUE還是FALSE。當位于其下方時,事件盒的事件消息會先發(fā)送到子控件,待其處理完后[前提是子控件有接收事件的能力。從上一個例子,會發(fā)現(xiàn)函數(shù)_CallBackLabelEvent無論如何都沒有執(zhí)行],才自己處理;如果在其上方,子控件將不會接收任何事件。
3. 你必須在執(zhí)行函數(shù)gtk_widget_realize之前執(zhí)行函數(shù)gtk_widget_set_events,只有eventbox是個特例。具體原因我這邊將不太清楚,建議看《Foundations of GTK+ Development》的96頁。





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1