GTK编程基础-----事件驱动(事件盒、固定窗口)
来源:互联网 发布:工业打标机软件 编辑:程序博客网 时间:2024/06/06 04:57
事件盒 The EventBox
一 些 GTK 构件没有与之相关联的 X 窗口,所以它们只在其父构件上显示其外观。由于这个原因,它们不能接收任何事件,并且,如果它们尺寸设置不正确,它们也不会自动剪裁(译者注:裁剪就是使 构件只显示一部分),这样可能会把界面弄得乱糟糟的。如果要想构件接收事件,可以使用事件盒(EventBox)。
初 一看,事件盒构件好像完全没有什么用。它在屏幕上什么也不画,并且对事件也不做响应。但是,它有一个功能:为它的子构件提供一个 X 窗口。因为许多G T K构件并没有相关联的 X 窗口,所以这一点很重要。虽然没有 X 窗口会节省内存,提高系统性能,但它也有一些弱点。没有 X 窗口的构件不能接收事件,并且对它的任何内容不能实施剪裁。虽然事件盒构件的名称事件盒强调了它的事件处理功能,它也能用于剪裁构件。看下面的具体代码:
点击将会退出
/*File:color.c *Date:2014-01-06 *Author:sjin *Mail:413977243@qq.com */#include <gtk/gtk.h>#include <gdk/gdk.h>#include <stdlib.h>int main( int argc, char *argv[] ){ /* GtkWidget 是构件的存储类型 */ GtkWidget *window; GtkWidget *event_box; GtkWidget *label; /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/ gtk_init (&argc, &argv); /* 创建一个新窗口 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /*设置窗口标题*/ gtk_window_set_title(GTK_WINDOW(window),"My first program helloworld!"); /**/ gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE); /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭” * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 destroy_window() 函数。 * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/ g_signal_connect (GTK_OBJECT(window), "destroy",G_CALLBACK (gtk_main_quit), (gpointer)window); /*创建一个事件盒,并将它加到顶级窗口上*/ event_box = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(window),event_box); gtk_widget_show(event_box); /*创建一个长标签*/ label = gtk_label_new("点击这里,退出"); gtk_container_add(GTK_CONTAINER(event_box),label); gtk_widget_show(label); /*将标签剪裁短*/ gtk_widget_set_size_request(label,110,20); /**/ gtk_widget_set_events(event_box,GDK_BUTTON_PRESS_MASK); g_signal_connect(GTK_OBJECT(event_box),"button_press_event",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_realize(event_box); gdk_window_set_cursor(event_box->window,gdk_cursor_new(GDK_HAND1)); gtk_widget_show (window); /* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里 * 等待事件 (如键盘事件或鼠标事件) 的发生。*/ gtk_main (); return 0;}
固定容器 Fixed Container
固定容器(The Fixed container)允许将构件放在窗口的固定位置,这个位置是相对于固定容器的左上角的。构件的位置可以动态改变。
/*File:color.c *Date:2014-01-07 *Author:sjin *Mail:413977243@qq.com */#include <gtk/gtk.h>#include <gdk/gdk.h>#include <glib.h>/*用全局变量储存固定容器里构件的位置*/gint x = 50;gint y = 50;/*这个回调函数将按钮移动到固定容器的位置*/void move_button(GtkWidget *widget,GtkWidget *fixed){ x = (x + 30)%300; y = (y + 30)%300; gtk_fixed_move(GTK_FIXED(fixed),widget,x,y);}int main( int argc, char *argv[] ){ /* GtkWidget 是构件的存储类型 */ GtkWidget *window; GtkWidget *button; GtkWidget *fixed; gint i; /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/ gtk_init (&argc, &argv); /* 创建一个新窗口 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /*设置窗口标题*/ gtk_window_set_title(GTK_WINDOW(window),"Fixed Container"); /**/ gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE); /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭” * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 destroy_window() 函数。 * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/ g_signal_connect (GTK_OBJECT(window), "destroy",G_CALLBACK (gtk_main_quit), NULL); /*设置窗口的边框宽度*/ gtk_container_set_border_width(GTK_CONTAINER(window),10); /*创建一个固定容器*/ fixed = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window),fixed); gtk_widget_show(fixed); for(i = 0; i < 3; i++){ /*创建一个按钮*/ button = gtk_button_new_with_label("miss you!"); g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(move_button),fixed); /*将按钮组装到一个固定容器的窗口中*/ gtk_fixed_put(GTK_FIXED(fixed),button,i*50,i*50); gtk_widget_show(button); } gtk_widget_show (window); /* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里 * 等待事件 (如键盘事件或鼠标事件) 的发生。*/ gtk_main (); return 0;}
/*File:color.c *Date:2014-01-07 *Author:sjin *Mail:413977243@qq.com */#include <gtk/gtk.h>#include <gdk/gdk.h>#include <glib.h>/*用全局变量储存固定容器里构件的位置*/gint x = 50;gint y = 50;/*这个回调函数将按钮移动到固定容器的位置*/void move_button(GtkWidget *widget,GtkWidget *fixed){ x = (x + 30)%300; y = (y + 30)%300; gtk_fixed_move(GTK_FIXED(fixed),widget,x,y);}int main( int argc, char *argv[] ){ /* GtkWidget 是构件的存储类型 */ GtkWidget *window; GtkWidget *button; GtkWidget *fixed; gint i; /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/ gtk_init (&argc, &argv); /* 创建一个新窗口 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /*设置窗口标题*/ gtk_window_set_title(GTK_WINDOW(window),"Fixed Container"); /**/ gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE); /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭” * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 destroy_window() 函数。 * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/ g_signal_connect (GTK_OBJECT(window), "destroy",G_CALLBACK (gtk_main_quit), NULL); /*设置窗口的边框宽度*/ gtk_container_set_border_width(GTK_CONTAINER(window),10); /*创建一个固定容器*/ fixed = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window),fixed); gtk_widget_show(fixed); for(i = 0; i < 3; i++){ /*创建一个按钮*/ button = gtk_button_new_with_label("miss you!"); g_signal_connect(GTK_OBJECT(button),"clicked",G_CALLBACK(move_button),fixed); /*将按钮组装到一个固定容器的窗口中*/ gtk_fixed_put(GTK_FIXED(fixed),button,i*50,i*50); gtk_widget_show(button); } gtk_widget_show (window); /* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里 * 等待事件 (如键盘事件或鼠标事件) 的发生。*/ gtk_main (); return 0;}
1 0
- GTK编程基础-----事件驱动(事件盒、固定窗口)
- GTK编程基础-----事件驱动(事件盒、固定窗口)
- GTK编程基础-----滚动窗口
- [GTK+] 固定窗口大小
- C# 事件驱动基础
- 事件驱动编程
- 事件驱动编程
- Javascript事件驱动编程
- 事件驱动编程
- 关于事件驱动编程
- 事件驱动编程
- GTK编程:button控件与消息事件
- SDL学习(三)事件驱动编程
- dojo事件驱动编程之事件绑定
- dojo事件驱动编程之事件绑定
- 事件与状态机 事件驱动编程
- 数据处理窗口CloseQuery事件编程
- gtk+程序在关闭主窗口时的事件流
- Android EditText 定制键盘行为
- 嵌入式Qt常用到的一些设置(显示中文)、不显示箭头、全屏显示
- 单链表的反转问题
- CMake Tutorial
- iOS 7Development Recipes(中文版)之第二章 Storyboard(2)
- GTK编程基础-----事件驱动(事件盒、固定窗口)
- 嵌入式学习之路(二十)——数据结构(2)
- Ext学习笔记
- 关于内核编译的一点说明
- 网页平面设计广州传智播客不容错过的好学校
- 学习Java CSDN 的经典老贴整理
- 夜间作业的糊涂,将要安装完成,黑屏了。
- 黑马程序员—高新技术:动态代理
- ASCII码表