GTK进阶学习:事件盒子

有些控件( 如:标签GtkLabel,图片控件GtkImage 等),不响应GDK事件,相当于鼠标在其上面点击,它是捕获不到的。用户通过事件盒子可以解决这个问题。

事件盒子给控件提供一个GDK窗口来捕获事件。我们把控件放在事件盒子里,当我们用鼠标点击这个控件时,这个事件盒子就能捕获到点击的状态。

事件盒子的创建:

GtkWidget *gtk_event_box_new(void);

返回值:事件盒子指针

把控件添加到事件盒子里:

void gtk_container_add(GtkContainer *container,

GtkWidget *widget );

container:容纳控件的事件盒子

widget:要添加的控件

以下例子为,通过事件盒子实现,双击标签改变其内容:

#include <gtk/gtk.h>

// "button_press_event"信号处理函数
gboolean button_pressed( GtkWidget *eventbox,
						GdkEventButton *event,
						GtkLabel *label )
{
	if (event->type == GDK_2BUTTON_PRESS){// 双击
		const gchar *text = gtk_label_get_text(label); // 获取label内容
		if( text[0] == 'D' ){
			gtk_label_set_text(label, "I Was Double-Clicked!"); // 修改
		}else{
			gtk_label_set_text(label, "Double-Click Me Again!");
		}
	}

	return FALSE;
}

int main( int argc, char *argv[] )
{
	gtk_init(&argc, &argv);

	GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	// 主窗口
	gtk_window_set_title(GTK_WINDOW(window), "Event Box");	    // 标题
	gtk_container_set_border_width(GTK_CONTAINER(window), 10);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); // 居中显示
	gtk_widget_set_size_request(window, 200, 50);				     // 最小大小
	g_signal_connect(window, "destroy",G_CALLBACK(gtk_main_quit), NULL ); 

	GtkWidget *eventbox = gtk_event_box_new();				// 事件盒子的创建
	gtk_widget_set_events(eventbox, GDK_BUTTON_PRESS_MASK); // 捕获鼠标点击事件
	gtk_container_add( GTK_CONTAINER(window), eventbox );	// 事件盒子放入窗口

	GtkWidget *label = gtk_label_new("Double-Click Me!");	// label
	gtk_container_add( GTK_CONTAINER(eventbox), label );	// label放入事件盒子里

	// 处理"button_press_event"信号,把标签label传给回调函数
	g_signal_connect(eventbox, "button_press_event",
						G_CALLBACK(button_pressed), (gpointer)label);

	gtk_widget_show_all(window);	// 显示所有控件

	gtk_main();

	return 0;
}

程序运行效果图如下:

源代码下载请点击此处。

时间: 2024-11-06 11:21:15

GTK进阶学习:事件盒子的相关文章

GTK进阶学习:绘图事件

GTK界面只要有图片的地方,其底层实际上是通过绘图实现的,所以,我们很有必要学习一下绘图,这里我们使用 Cairo 进行相应的绘图操作. Cairo是用于绘制二维矢量图形的跨平台图形库,采用 C 语言实现,又被许多其它计算机语言所绑定.我们可以使用Cairo库在窗口中绘图,也可以用于生成PNG图片.PDF.PostScript.SVG文件.Cairo同时也是自由软件库,自GTK+2.8版本开始,Cairo成为GTK+库的一部分. 绘图实际上也是事件的一种,GTK中,绘图事件也叫曝光事件. 绘图时

GTK进阶学习:属性改变事件

当窗口初始化,被移动或拉伸时,会触发属性改变事件. 属性改变事件产生的信号:configure_event 其回调函数的定义如下: gboolean callback( GtkWidget *widget, GdkEventConfigure *event, gpointer data ) { event:属性事件结构体变量,系统内部的变量,不是用户传参的 event->x,event->y:窗口的起点坐标 event->width,event->height:窗口的大小 } 以下

GTK进阶学习:鼠标事件

鼠标事件,可以理解为操作鼠标的动作.对于窗口而言,用户操作鼠标,窗口检测到鼠标的操作( 产生一个信号 ),然后去做相应处理( 调用其规定的回调函数 ),即可认为是鼠标事件,还是信号与回调函数的知识点. 信号与回调函数的使用请点击此处. 窗口默认不接收鼠标的操作,需要手动添加让其接收. 设置控件捕获(接收)相应的事件: void gtk_widget_add_events( GtkWidget *widget, gint events ); widget:控件 events:事件类型,它是GdkE

GTK进阶学习:设置窗口背景图(可指定其大小)

设置窗口背景图(可指定其大小): #include <gtk/gtk.h> /* 功能: 设置背景图 * widget: 主窗口 * w, h: 图片的大小 * path: 图片路径 */ void chang_background(GtkWidget *widget, int w, int h, const gchar *path) { gtk_widget_set_app_paintable(widget, TRUE); //允许窗口可以绘图 gtk_widget_realize(widg

GTK进阶学习:GTK实现截图功能( 可以指定截图范围 )

按按钮截图,图片保存在当前路径为"save.png": #include <gtk/gtk.h> #include <cairo.h> /******************************************************** 功能:指定窗口区域截图,需要包含头文件cairo.h 参数: area: 需要截图的窗口指针 x, y, w, h: 截图的范围 path_name: 保存图片的路径名字,如 "./image/test.

GTK进阶学习:定时器

定时器在应用编程里用得很广,我们手机里的闹钟,幻灯片播放图片等应用都用到定时器.定时器,每隔一段时间干一件事(程序里表现为调用一个函数),像闹钟,每隔一天响一次. 定时器的创建: guint g_timeout_add(guint interval, GSourceFunc function, gpointer data); interval:设置的时间间隔,以毫秒为单位( 1000即为1秒 ) function:回调函数的名字 data:给回调函数传的参数 返回值:定时器id号 使用实例: g

Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零零散散在好多地方使用到了Android事件分发的知识.也有好多朋友问过我各种问题,比方:onTouch和onTouchEvent有什么差别,又该怎样使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图片使用Button而不用ImageView?

GTK+重拾--07 GTK+中的事件

(一):写在前面 在这一个小节中,我们主要是学习GTK+2.0中最重要的部分,就是信号和事件.GTK+函数工具库是基于"事件"系统的.所有的GUI应用都是基于"事件"驱动的.如果没有"事件"发生,那么应用程序就无法正常运行.在GTK+中一个事件就是从X窗口服务器传过来的一个消息.当一个"事件"发生的时候,她就会通过发送一个"信号"来表示它已经做除了反应.当然,利用GTK+还可以为"信号"

42步进阶学习—让你成为优秀的Java大数据科学家!

作者 灯塔大数据 本文转自公众号灯塔大数据(DTbigdata),转载需授权 如果你对各种数据类的科学课题感兴趣,你就来对地方了.本文将给大家介绍让你成为优秀数据科学家的42个步骤.深入掌握数据准备,机器学习,SQL数据科学等. 本文将这42步骤分为六个部分, 前三个部分主要讲述从数据准备到初步完成机器学习的学习过程,其中包括对理论知识的掌握和Python库的实现. 第四部分主要是从如何理解的角度讲解深入学习的方法.最后两部分则是关于SQL数据科学和NoSQL数据库. 接下来让我们走进这42步进