找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2488|回復: 0
打印 上一主題 下一主題
收起左側

GTK窗口布局管理--EvnetBox

[復制鏈接]
跳轉到指定樓層
樓主
ID:72519 發(fā)表于 2015-1-23 19:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
EventBox即為事件盒。在gtk中有一些控件[比如label控件]沒有與之關聯(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. 設置eventbox控件位置函數(shù):
void                gtk_event_box_set_above_child       (GtkEventBox *event_box,
                                                         gboolean above_child);該函數(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頁。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表