1 概述
- gtk+编程和 Java 编程相同,首先构建一个界面,然后程序进入消息循环。当窗口等构件上有事件产生时,该事件会被窗口管理器捕获,如果程序注册了该事件的处理函数,则使用该处理函数来处理事件,否则使用窗口处理管理奇的默认处理函数来处理该事件
- gtk+ 编程中,以 g_ 开头的函数和以 g 开头的变量为在 glib 函数库中定义的函数和变量。以 gtk_ 开头的函数和以 Gtk 开头的变量为在 gtk+ 函数库中定义的函数和变量。
- main函数返回0表示程序正常结束
- gtk+ 编程中函数的命名使用“ _ ”来分隔
gtk+ 中的各种构件有一个层次结构,新的构件一般在原来构件的基础上添加了某些功能后得到的。 gtk+ 的层次结构如下图所示:
相关头文件
- 头文件 gtk/gtk.h 中包含了 gtk +库中的所有头文件,也包含了 gdk.h 和 glib.h
- 头文件 gnome.h 中包含了 gtk.h ,要用到 GNOME 库中的构件和库函数,包含 gnome.h 就可以了
2 程序的初始化与消息循环
- gtk_init :在进行 gtk +编程时必须先使用该函数来对 gtk 函数库进行初始化,它还能够自动分析命令行参数,并根据命令行参数来初始化应用程序。注意:此处的命令行参数为 gtk+ 中预定义的值,如果不是,则给出出错信息。比如:在程序中使用 --display 参数可以用来指示要使用的 X display
- gtk_exit:退出GTK+应用程序并回收所有GTK+资源所占的空间
- g_print 函数用来在标准输出中输出数据,它一般在调试时使用
3 GTK+主循环
3.1 主循环基本知识
- gtk_main函数运行GTK+主循环(相当于 Window 程序中的消息循环),直到调用gtk_main_quit函数,gtk_main才会退出。gtk_main函数可以递归调用,每次调用一个gtk_main_quit函数就退出gtk_main函数的一个实例
- gtk_main_quit用来退出最里层的gtk_main主循环
- 由于GTK+程序中只有一条执行线索,因此事件处理函数中的代码都是在gtk_main函数中执行的。如果在事件处理函数中又调用了gtk_main,则称为gtk_main的递归调用
- gtk_main_level返回递归的层次。如果没有gtk_main运行时,返回0,如果一个gtk_main函数在运行,则返回1
- gtk_main_iteration:该函数是gtk_main函数的一次迭代,它在处理完一个事件后返回(gtk_main函数只有在调用gtk_main_quit后才返回,否则将阻塞等待,以处理下一个事件)。gtk_main_iteration通常与gtk_event_pending合在一起使用。
- gtk_events_pending:在有事件到达时返回
3.2 退出函数
退出函数就是当调用gtk_main_quit函数时要调用的回调函数。退出函数的原型为:
gint (*GtkFunction)(gpointer data)
当退出函数返回FALSE时,该退出函数被调用一次后将被系统自动删除,此后再次调用gtk_main_quit函数将不会再调用退出函数。例题:退出函数
可以为一个gtk_main主循环添加多个退出函数,这些退出函数的调用顺序与它们被添加的顺序相反。当某个退出函数返回FALSE而另一个退出函数返回TRUE时,在第二次调用gtk_main_quit时,只有返回TRUE的退出函数被调用
- gtk_quit_add用来给某个主循环添加退出函数,添加时必须指定主循环的级别
- gtk_quit_remove使用gtk_quit_add的返回值来从主循环中删除一个回调函数
- gtk_quit_remove_by_data使用传递给回调函数的数据来从主循环中删除回调函数
4 定时器
- gtk_timeout_add函数用来往程序中添加一个定时器,并返回此定时器的ID
- gtk_timeout_remove则根据定时器的ID来删除一个定时器
- 现在一般使用g_timeout_add系列的函数来代替gtk_timeout_add系列的函数
定期调用的回调函数的原型为:
gint timeout_callback(gpointer data)
当该回调函数返回FALSE时,定时器将在调用一次该函数后被删除。如果要让定时器一直起作用,则必须让定期调用的回调函数返回TRUE
5 idle函数
idle函数只有在主循环中没有事件要被处理时才会被运行,且如果idle函数的返回值为FALSE,idle函数将在被调用一次后被删除。如果要让idle函数一直起作用,则必须让它返回TRUE
- gtk_idle_add函数用来往程序中添加一个idle函数
- gtk_idle_remove根据idle函数的ID来删除idle函数
- gtk_idle_remove_by_data根据传递给idle函数的参数来删除idle函数
6 使用文件描述符进行输入输出
- gtk_input_add函数用来往GTK+程序中添加一个文件描述符,当该文件描述符读、写或发生异常时调用指定的回调函数。该函数返回一个ID号用来在删除文件描述符时使用
- gtk_input_remove函数使用gtk_input_add函数的返回值来删除一个输入函数
输入回调函数的原型为:void(*DdkInputFunction)(gpointer data,gint_source,GdkInputCondition condition),其中condition的取值可以是:
- GDK_INPUT_READ 当文件描述符读就绪时调用回调函数
- GDK_INPUT_WRITE 当文件描述符写就绪时调用回调函数
- GDK_INPUT_EXECPTION 当文件描述符上有异常产生时调用回调函数。注意:只有在TCP发送紧急数据时的套接字描述符上才产生异常
7 编译应用程序
使用autoconf和automake工具的目的是创建一个能在用户环境使用的,可移植的shell脚本和Makefile文件。autoconf实际上是一个工具集,用来生成可移植的shell脚本--configure。configure脚本用来探查编译系统,生成Makefile文件和一个特殊的头文件config.h。使用configure生成的Makefile文件来编译程序能够使程序适应用户系统的特定环境。configure脚本从一个称为makefile.in的模版文件生成Makefile文件。automake由一个手写的makefile.am生成Makefile.in文件。Makefile.in文件随源代码一块发布,当用户运行configure时使用它来生成Makefile文件。
阅读(295) | 评论(0) | 转发(0) |