一、初始化GTK+
写GTK+程序需要调用gtk_init函数对GTK+ 库函数进行初始化。 1. 名称:: 功能: 头文件: 函数原形: 参数: 返回值: gtk_init 初始化GTK+库 #include
在你程序使用到GTK+工具库之前,必须对它进行初始化。gtk_init可以初始化GTK+工具库。gtk_init的参数的指向主函数argc,argv的指针,它可以改变一些不满足GTK+函数要求的命令行参数。
因为gtk_init函数没有返回值,所以如果在初始化过程中发生错误程序就会立即退出。 2. 名称:: 功能: 头文件: 函数原形: 参数: 返回值: gtk_init_check 初始化GTK+库 #include
还有一个GTK+库初始化函数gtk_init_check,它的作用和gtk_init完全相同。唯一的区别是gtk_init_check有返回值,可以判断初始化是否成功。
二、建立窗口 GTK+的构件是GUI的组成部分。窗口、检查框、按钮和编辑字段都属于构件。通常将构件和窗口定义为指向GtkWidget结构的指针。在GTK+中,GtkWidget是用于所有构件和窗口的通用数据类型。 GTK+ 库进行初始化后,大多数应用建立一个主窗口。在GTK+中,主窗口常常被称为顶层窗口。顶层窗口不被包含在任何其他窗口内,所以它没有上层窗口。在GTK+ 中,构件具有父子关系,其中父构件是容器,而子构件则是包含在容器中的构件。顶层窗口没有父窗口,但可能 成为其他构件的容器。 在GTK+中建立构件分两步:建立构件,然后使它可以看得见。
gtk_window_new函数负责建立窗口。gtk_widget_show函数负责使它成为可见。
2.
名称:: 功能: 头文件: 函数原形: 参数: 返回值: 3.
名称:: 功能: 头文件: 函数原形: 参数: 返回值: gtk_widget_show 显示窗口 #include
三、GTK+的事件循环
对GTK+进行初始化并将窗口和构件置于屏幕以后,程序就调用get_main函数等待某种事件的执行。 4.
名称:: 功能: 头文件: 函数原形: 参数: 返回值: gtk_main 等待事件的发生 #include
我们在来看看第一章的程序。也许大家就会理解上面函数的作用了。 /*base1.c*/ #include
程序开始定义了一个窗体,然后用函数gtk_init初始化GTK+库。用函数gtk_window_new创建一个窗体,用get_widget_show显示该窗体。程序最后调用gtk_main()进入主循环,等待各种事件的发生.
注意该程序不能正常退出,原因是程序没有回呼函数。关于回呼函数我们将会在下面介绍。
四、结束应用程序 5.
名称:: 功能: 头文件: 函数原形: 参数: 返回值: gtk_main_quit 结束应用程序 #include
五、回调函数
由于程序必须能够对用户的操作做出相应,在基于GUI的程序设计中信号是必要的。移动鼠标,按下按钮,敲入正文或者关闭窗口,将给应用软件的回呼函数提供信号。信号可能需要应用软件来加以处理。如:字处理软件有使字体变黑的按钮。如果用户按下了按钮,就需要调用使字体变黑的程序。与此类型,如果用户关闭了主窗口,在实际关闭窗口以前要进行某些处理(如保存文件,清除等)。
在GTK+中经常产生各种信号,多数情况下信号被忽略。以按钮构件为例,应用软件有专门用于按钮的信号。当用户按下鼠标或释放鼠标按钮时,当用户电机鼠标时,或者当鼠标移过按钮或离开按钮时都产生各自的信号。应用程序可以忽略掉一些信号,只对感兴趣的事件加以处理。
当需要对信号进行处理时,需要用GTK+登记回调函数,并将它和构件联系在一起。构件可以登记回调函数,回调函数可与多个构件联系在一起。 6.
名称:: 功能: 头文件: 函数原形: 参数: g_signal_connect 信号登记函数 #include
下面我们把上面的程序稍微改动一下,使它可以正常退出。 /*base2.c*/ #include
其中destroy为GTK+最基本信号之一,当关闭窗口时,发出该信号。还有一个是delete_event, 当将要关闭窗口时,发出该信号。
程序中添加了gtk_signal_connect函数,当用户关闭窗口时gtk_signel_connect函数调用gtk_main_quit函数来关闭程序。
大家也可以编写回调函数,在回调函数里结束程序。这样做的好处是当用户试图退出一个程序时,程序可以提示你是否真的退出。 自己编写回调函数的程序例子: /*base2.c*/ #include
注意,当关闭窗口时,将在启动应用程序的控制台上显示Quitting消息。这是由回调函数显示的。
从上面的程序可以看到,g_signal_connect对应的回调函数形式为gint
destroy(GtkWidget *widget,gpointer gdata)有两个参数。GTK+还有一个信号登记函数。g_signal_connect_swapped.,它的作用和gtk_signal_connect相同。不同的是g_signal_connect_swapped.对应的回调函数只有一个参数,形式为gint
destroy(GtkWidget *widget)。是因为GTK+有一些只接收一个参数的函数(比如gtk_widget_destroy)。