当前位置:文档之家› 第13章+gtk+图形界面程序设计

第13章+gtk+图形界面程序设计

福建师范大学,陈兰香
5. 基本程序示例
on_btn_clicked(),按钮事件处理程序 on_delete(),窗口关闭事件处理程序
helloworld.c代码片断1部分辅助函数 1 2 3 4 5 6 7 8 #include <gtk/gtk.h> void on_btn_clicked(GtkWidget *widget, gpointer data){ g_print("Hello World!\n"); } void on_delete(GtkWidget *widget, GdkEvent *event, gpointer data){ g_print("Window Closed.\n"); gtk_main_quit(); }
福建师范大学,陈兰香
2. 构件(widget)的运用
在调用Gtk+的构件时,一般进行如下操作步骤: (1) 包含所调用构件的头文件 头文件通常存放在/usr/include/gtk/目录下,该文件里 有对构件的定义及对构件的操作函数,在我们使用构 件时,可以经常在这个目录下查阅构件函数的调用格 式或参数。我们不必让所有构件包含头文件,因为构 件的头文件已包含在该目录下一个名为gtk.h的文件 里,包含这个文件就包含了所有构件的头文件。一般 系统将编译的包含目录指定为/usr/include,所以我们 只需写明 include 即可。
福建师范大学,陈兰香
helloworld.c代码片断2——主函数部分 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 int main(int argc, char * argv[ ]){ GtkWidget *window; GtkWidget *button; gtk_set_locale(); gtk_init(&argc,&argv);//初始化运行环境 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建窗口 gtk_window_set_title(GTK_WINDOW(window),"Hello World!"); gtk_container_set_border_width (GTK_CONTAINER (window), 10); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (on_delete), NULL);//关联窗口关闭事件 button = gtk_button_new_with_label ("Hello World"); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (on_btn_clicked), NULL);//关联按钮事件 gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show_all(window);//显示窗口 gtk_main();//启动消息循环 return 0; }
XLib
XLib
网络协议 X服务器 设备驱动程序
福建师范大学,陈兰香
Gtk+简介
来源:
Gimp(GUN Image Manipulation Program)
以Gtk+为基础的应用软件
Gimp Glade Gnome Abiword dia等
Gtk+的主要组成
Glib:底层核心库 Pango:界面布局和国际化 Atk:其它功能
(5) 编写事件处理函数
构件的头文件中定义了构件能响应的事件(消息),但并非所有 的消息在应用中都是程序所关心的,对于程序应当响应的事件, 程序员要写出事件处理函数。
福建师范大学,陈兰香
4. Gtk+的事件循环
对Gtk+进行初始化并将窗口等构件安排在屏幕 上之后,应用软件需要使用Gtk+开始执行事件的循环 函数gtk_main(),没有这个函数,应用程序运行时就 会一闪即逝。但是在调用gtk_main_quit()函数之前对 gtk_main()函数的调用并不返回,也就是说只有 gtk_main_quit()函数才能停止Gtk+的执行,从而最终 退出应用程序。我们把gtk_main_quit()函数放在消息 处理函数close_window()之中,这样,当用户点击了 窗口的关闭按钮,Gtk+收到“delelte_event”消息, 然后调用close_window(),执行gtk_main_quit()函数, 整个程序即可退出。
福建师范大学,陈兰香
在X Windows系统中运行的应用叫客户client,客户 程序并不直接在屏幕上绘制或操纵任何图形,而是和 X服务器进行通讯 X服务器完成所有的绘图工作并且控制有关的显示的 各个方面。 在Linux系统下X Windows系统是XFree86版本,是由 一个非盈利的组织Xfree86 Project Inc开发的。 因为X Windows是基于一种客户机/服务器的思想,所 以将显示和事件处理功能从客户中分离出来,一个客 户端应用程序通过套接接口和X服务器进行通信,这 对用户是透明的,它既可以是本地的也可以是通过网 络的。
福建师范大学,陈兰香
GTK编程
一、建立Gtk+应用 1.基本概念
(1) 构件(widget)的概念 在Gtk+库里的窗口、选单和按钮等应用实体,我们 称之为构件(widget)。构件具有面向对象的特征, 其具体结构由Gtk+库定义,它对运用构件的程序员来 说是透明的,除非你想创建自己的构件。在对构件进行 安排时,我们只需要关心构件的处理函数,这样做的 目的就是要对应用程序员屏蔽构件的细节,使程序员 将更多的精力集中在应用功能上。
福建师范大学,陈兰香
福建师范大学,陈兰香
Gtk+的作用
Gtk+工具包在X Windows中的作用
是Xlib之上更高层的开发工具包,它们将底层的Xlib的API进 行封装,提供更高级的接口,达到降低开发难度,提高开发 效率的目的。
X客户端(应用程序)
X工具包、Gtk+,Qt
X客户端(应用程序)
X工具包、Gtk+,Qt
福建师范大学,陈兰香
下图显示了用户事件、X服务器的事件队列以 及应用程序事件队列之间的相互关系。
福建师范大学,陈兰香
客户机和服务器之间的通信通过一个称为Xlib的底层 接口来执行,这是X Windows软件体系结构中的最底 层,可以直接用Xlib来编写应用程序。 为了方便X Windows编程,在Xlib之上有好几层其他 的库,这些库叫工具包(toolkit),它包括最底层的X工 具包内部函数(X toolkit intrinsics)。 下图显示了X Windows的基本的API函数库,包括Xlib API、X工具包内部函数、Athena窗口部件集以及 Motif窗口部件集的任意组合,当然也包括两个高层的 API函数库:GTK+和Qt图形用户界面库。
3. 构件类型的转换
由于建立的构件是通用构件,需要将它转换为具体的类型以适 合调用更为专用的函数。比如建立按钮构件函数会返回GtkWidget 指针,但是专用的按钮子程序要求返回GtkButton指针,所以在调 用专用的按钮函数以前,需要使用GTK_BUTTON宏将通用的 GtkWidget指针转换为GtkButton指针。通常,构件是由其它构件 派生的,窗口构件(GtkWindow)是由容器构件GtkContainer派生 的,而容器构件是由通用构件派生的。在Gtk+中可以将构件指针 转换为其父类、祖先类构件的任意类型,然后再调用父类或祖先 类构件的函数。
福建师范大学,陈兰香
二、应用举例
为了对Gtk+库的应用有一个具体的认识,让我们看 一个简单的应用实例。 1. 初始化Gtk+ 写Gtk+程序需要调用gtk_init函数对Gtk+库进行初始化。 我们首先将应用程序的变量argc和argv传递给gtk_init 函数,并检查主要用于调试的Gtk+选项。如果在变量 列表中出现任何这样的Gtk+参数,就将它移去。在运 行gtk_init函数后,它们不应该出现在应用程序中。初 始化Gtk+的代码如下: gtk_init(&&argc,&&argv);
福建师范大学,陈兰香
(2) 容器(container)的概念
构件主要分为两大类,即容器类(container)和杂类(miscellaneous)。 大多数构件属容器类,它们可以像容器一样容纳其它的构件。在安排构 件时常常要遵循一个规则:除了组合框(box)和组合表(table)这两种 构件外,其它的容器类构件都只能容纳一个构件。杂类构件比容器类构 件简单,但它不能容纳其它构件。
福建师范大学,陈兰香
程序运行效果
组成: 一个按钮 一个窗口 动作: 点击按钮,在终端输出一个字符串 点击关闭窗口,在终端输出一个字符串后,退出
福建师范大学,陈兰香
6. 编译源代码及运行程序 最后谈一下Gtk+在程序编译和运行时有哪些特别之处。在Linux系统下 的C编译器,如gcc,要求编译时在编译命令后加上各种参数,如果参 数太复杂,最好把命令写入makefile文件。 前面我们讲过在应用程序文件中用到Gtk+函数或定义的每一部分必须 包含gtk/gtk.h文件,它是Gtk+的主要包含文件。此外,还必须连接若 干库。Gtk+的开发人员为我们提供了方便。使用gtk-config程序可以 简化这些工作。
福建师范大学,陈兰香
(4) 安排构件的位置与层次关系
构件之间往往是容纳与被容纳的关系,也就是说容器内还有容 器,层层嵌套。要记住一般一个容器构件只能容纳一个构件,如 果要在一个容器构件中安排多个子构件,可先将多个子构件放 该容器构件。注意父容器构件要先于子容器构件创建,父容器构 件的显示要在子容器构件的显示之后。
相关主题