linux GUI库GTK+的简单应用之事件和事件监听器
来源:互联网 发布:tricking动作教学软件 编辑:程序博客网 时间:2024/06/05 11:53
刚接触GTK+,先来看看一个简单的用户登录的小例子,再来说说
GTK+的信号和回调函数实现的事件监听器。
#include<gtk/gtk.h>#include<stdio.h>#include<string.h>const char *password = "correct";void closeApp(GtkWidget *window, gpointer data){gtk_main_quit();}void button_clicked(GtkWidget*button, gpointer data){const char *password_input = gtk_entry_get_text(GTK_ENTRY((GtkWidget *)data));if(strcmp(password_input,password) == 0)printf("OK\n");elseprintf("wrong password\n");}int main(int argc, char *argv[]){GtkWidget *window;GtkWidget *username_label, *password_label;GtkWidget *username_entry, *password_entry;GtkWidget *ok_button;GtkWidget *hbox1, *hbox2;GtkWidget *vbox;gtk_init(&argc,&argv);window = gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"first gtk gui");gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);gtk_window_set_default_size(GTK_WINDOW(window),200,200);g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(closeApp),NULL);username_label = gtk_label_new("Login: ");password_label = gtk_label_new("Password: ");username_entry = gtk_entry_new();password_entry = gtk_entry_new();gtk_entry_set_visibility(GTK_ENTRY(password_entry),FALSE);ok_button = gtk_button_new_with_label("OK");g_signal_connect(GTK_OBJECT(ok_button),"clicked",GTK_SIGNAL_FUNC(button_clicked),password_entry);hbox1 = gtk_hbox_new(TRUE, 5);hbox2 = gtk_hbox_new(TRUE, 5);vbox = gtk_vbox_new(FALSE, 10);gtk_box_pack_start(GTK_BOX(hbox1), username_label, TRUE, FALSE, 5);gtk_box_pack_start(GTK_BOX(hbox1), username_entry, TRUE, FALSE, 5);gtk_box_pack_start(GTK_BOX(hbox2), password_label, TRUE, FALSE, 5);gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, FALSE, 5);gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 5);gtk_box_pack_start(GTK_BOX(vbox), ok_button, FALSE, FALSE, 5);gtk_container_add(GTK_CONTAINER(window),vbox);gtk_widget_show_all(window);gtk_main();return 0;}
gcc gtkLogin.c -o gtkLogin `pkg-config --cflags --libs gtk+-2.0`编译此程序
./gtkLogin运行此程序,结果如下。
我觉得有意思的是,GTK+是用纯C写的一个库,但可以通过宏支持继承和多态,支持面向对象。
代码中使用g_singal_connect(gpointer *object, const gchar *name, GCallback func, gpointer user_data)连接信号和回调函数,第一个参数信号发出的窗口部件,
第二个参数是以字符串指定的信号名,第三个参数就是处理信号的回调函数指针,第四个参数是传递用户数据的指针。
回调函数原型:
void a_callback_function(GtkWidget *widget, gpointer user_data);
第一个参数正是发出信号的窗口部件指针,第二个参数是传递数据过来的任意类型指针。
GTK+就是使用信号和回调函数实现的事件监听器系统,使用连接函数使得信号和信号处理器即回调函数对应起来了,这和MFC的窗口系统中的消息映射竟然
是那么的似曾相识。。。
- linux GUI库GTK+的简单应用之事件和事件监听器
- Java GUI:事件监听器 和 事件适配器
- Java GUI事件监听器
- Android开发之事件和事件监听器
- GUI事件监听键盘监听器
- GUI事件监听鼠标监听器
- GTK学习笔记1-简单的控件和事件响应
- Android的事件和事件监听器
- 事件监听器模式(一个简单的例子)
- Java中的事件、监听器的简单例子
- 自定义事件和事件监听器。。。
- java_事件和事件监听器
- 事件和事件监听器 笔记
- Java基础教程之事件和监听器
- Java基础教程之事件和监听器
- Java基础教程之事件和监听器
- Java基础教程之事件和监听器
- Java基础教程之事件和监听器
- java中关于时区转换的方法
- [转]字符串相似度算法(编辑距离算法 Levenshtein Distance)[附c#,asp源码]
- 《深入理解计算机网络》迷你书
- Javascript定义类(class)的三种方法
- Logcat的自动清屏问题
- linux GUI库GTK+的简单应用之事件和事件监听器
- Spring框架,如何返回数据给视图(jsp文件)
- SGS白皮书(White Paper Sun Game Server Technology)浅译
- 教你掌握面试的心理攻略
- c盘里的每个文件夹的作用,那个可以删除,那个不能动!
- 面试官通常具有什么心理
- get more out of google
- Android ADT安装时卡在Calculating requirements and dependencies
- Levenshtein Distance(LD)-计算两字符串相似度算法