找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2291|回复: 0
打印 上一主题 下一主题
收起左侧

GTK窗口布局管理--EvnetBox

[复制链接]
跳转到指定楼层
楼主
ID:72519 发表于 2015-1-23 19:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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页。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表