《linux图形界面编程资料》由会员分享,可在线阅读,更多相关《linux图形界面编程资料(33页珍藏版)》请在金锄头文库上搜索。
1、Page 1 LinuxLinux图形界面编程图形界面编程 Page 2 什么是X Window系统 X Window是UNIX和Linux系统上的图形界面系统 X Window是众多软件程序的组合体,是一个程序库 X Window是内核之上的一个应用 Page 3 X Window系统的组成 X Server:控制输出及输入设备并维护相关资源的程序 X Client:应用程序的核心部分,与硬件无关,每个应用程序都是一个 X Client X协议:X Server与X Client间的通信协议 Window Manager:提供窗口控制参数,包括窗口大小、重迭显示、 移动、最小化等 Displ
2、ay Manager:管理登录界面 Page 4 什么是GTK GTK (GIMP Toolkit) 是一套用于创建图形用户界面的工 具包。 GTK 实质上是一个面向对象的应用程序接口 (API)。尽管 完全用C写成的,但它是基于类和回调函数 (指向函数的 指针) 的思想实现的。 它遵循LGPL许可证,所以可以用它来开发开源软件、自 由软件,甚至是封闭源代码的商业软件,而不用花费任何 费用来购买许可证和使用权。 当前,GTK已经被成功地应用到了大量的自由软件及商 业软件中,已经取得了很大的成功。 Page 5 GTK构成 Glib:包含一些标准函数的替代函数,以及一些处理链表 等数据结构的函数
3、等。这些替代函数被用来增强GTK 的 可移植性,同时提供 libc 的对应函数的增强版本。 Pango:用来处理国际化文字输出。 GDK :为GTK提供底层实现的函数库。 GdkPixbuf :用于加载和维护图像“缓存”的函数库。 Cairo :用于制作二维图像的函数库。 Page 6 Glib的数据类型 Glib具有一套自己的类型系统,与C语言标准类型对照如下 C类型GLIB类型C类型GLIB类型 chargcharunsigned charguchar shortgshortunsigned shortgushort longglongunsigned longgulong intgint
4、unsigned intguint intgbooleanvoid *gpointer floatgfloatconst void *gconstpointer doublegdouble Page 7 GTK的数据类型 Gtk+中采用了面向对象的概念,通常由构件派生构件。 如铵钮构件(GtkButton)由容器构件(GtkContainer)派生;容器构件由通用 构件(GtkWidget)派生;通用构件又由GtkObject派生。 所有建立构件的函数返回指向GtkWidget的指针。 比如gtk_window_new返回的是GtkWidget * 而不是GtkWindow *。这使得通用 函
5、数可以对所有的构件进行操作。 在调用具体的构件函数之前将构件转换为正确的类型。 如: void gtk_window_set_title (GtkWindow * window, const gchar *title); 第一个参数要求为一个GtkWindow *类型。 每一种构件有一个转换宏可将GtkWidget转换为相应构件类型。 如: gtk_window_set_title(GTK_WINDOW(window), “helloGTK”); Page 8 界面基本元素 1、窗口 窗口是一个应用程序的界面框架,程序的所有内容和与用户的交互都在 这个窗口中。在设置应用程序的界面时,第一步便是
6、建立一个窗口。 新建一个窗口: #include GtkWidget *gtk_window_new (GtkWindowType type); type:GTK-WINDOW-TOPLEVEL GTK-WINDOW-POPUP 成功:返回一个GtkWidget类型的指针, 失败:返回空指针。 gtk_window_new 函数根据给出的窗口类型创建窗口,默认情况下窗口 为200X200像素大小。 Page 9 显示窗口: 当新建一个窗口后,这个窗口不会马上就显示出来,需要调用窗口显示 函数gtk_widget_show()来显示这个窗口,函数原型如下: #include void gtk_w
7、idget_show(GtkWidget * widget); 参数widget是一个GtkWidget类型的结构体 设置标题: gtk_window_set_title()函数用于设置窗口的标题,函数的原型如下: #include gtk_window_set_title(GTK_WINDOW *window,gchar *title); window 表示将要设置标题的窗口构件, title表示设置的标题,函数无返回值。 注意title的值要是英文否则在有些Linux下会乱码。 Page 10 设置窗口的大小和位置: gtk_widget_set_usize(GtkWidget * wid
8、get,int x,int y); gtk_widget_set_uposition(GtkWidget * widget,int x,int y); Page 11 实例演示: #include int main(int argc,char *argv) GtkWidget *window; char title=“My First Window“; gtk_init( window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW (window),title); gtk_widget_set_us
9、ize(window),400,200); gtk_widget_set_uposition(window),200,200); gtk_widget_show(window); gtk_main(); return 0; Page 12 编译方法: gcc hellogtk.c -o hellogtk pkg-config -cflags -libs gtk+-2.0 注意: () 不是普通的单引号 (),而是同“在一起的那个符号! Page 13 2、按钮 在图形界面的程序中,有很多操作都是通过窗口程序的按钮来实现的。 在后面我们还将看到,按钮最常用于发送一个信号,这个信号会引起相应事 件
10、的响应。 新建一个按钮: #include GtkWidget *gtk_button_new_with_lable (gchar *lable); 若创建成功则返回GtkWidget类型的指针,否则返回NULL 设置和获取按钮的标签: #include const gchar *gtk_button_get_lable (GtkButton *button); void gtk_button_set_lable(GtkButton *button,const gchar *lable); Page 14 3、文本框 文本框是界面的输入区域,用户可以在这个区域中用键盘输入内容,界 面程序的各种
11、输入都是通过文本框来完成的。 新建一个文本框: #include GtkWidget *gtk_entry_new(void); 若创建成功则返回一个GtkWidget类型的指针,若失败返回NULL。 另建一个文本框的函数为: GtkWidget *gtk_entry_new_with_man_length(gint max); 返回值同上,参数max是表示该文本框最多可以输入的字符。 Page 15 设置和获取文本框的数据 #include const gchar *gtk_entry_get_text(GtkEntry *entry); void gtk_entry_set_text(Gt
12、kEntry *entry,const gchar *text); 在文本框输入数据后往往要获得数据和进行相关的处理。函数 gtk_entry_get_text()用来获得数据。gtk_entry_set_text()用来设置文本框的 初始内容。 第一个函数返回值:若成功则返回指向文本框中的字符串的指针,若失 败则返回NULL。 第二个函数无返回值。 在参数列表中,entry是一个指向文本框的指针,text表示需要设置文 本框中的字符串文本。 Page 16 实例演示:button.c Page 17 GTK界面布局 GTK+的图形界面编程中的界面布局构件,包括表格,框,窗格 等,其中表格是界
13、面编程中最常使用的布局构件,通过在表格的单元 格中插入不同的构件,来实现构件的布局和排列。使用界面布局构件, 可以在一个窗口中设计出复杂而优美的界面。 Page 18 GTK界面布局 (1) 表格 表格是指用横竖布局的线和格子将一个窗口划分成多个区域, 每个区域可以放置不同的构件。如果一个构件中可以存放其它的构件, 这个构件杯称做容器。GTK+的容器都是二进制的,也就是每个容器 只能放置一个构件,如果想在一个窗口中放置多个构件,则需要使用 表格,窗格等有多个单元格的容器。 Page 19 表格的建立 #include GtkWidget *gtk_table_new(guint rows, g
14、uint columns, gboolean homegenous) rows表示行数,columns表示列数; homegenous是一个布尔值, 设为true,每个单元格的大小相同。 设为false,根据单元格中的构件大小自行调整。 注意:表格的作用只是将窗口划分成不同的区域,本身并不显示,也就 是说在GTK中,表格作为一个容纳其它构件的容器,并不会实际显示。 Page 20 添加构件到表格中 #include void gtk_table_attach(GtkTable *table, GtkWidget *child, guint left_attach, guint right_at
15、tach, guint top_attach, guint bottom_attach, GtkAttachOptions xoptions, GtkAttachOptions yoptions, guint xpadding, guint ypadding); table:容器表格指针; child:需要添加的构件的指针; left_attach , right_attach:表示左右是表格的第几条边(从0计数); top_attach,bottom_attach:表示上下是表格的第几条边; xoptions,yoptions:表示水平和垂直方向对齐; xpading,ypading:表示构
16、件与边框在水平和垂直放向上的边距; Page 21 嵌套表格 在设计复杂的界面时,使用一个表格并不能完成布局,这时就需要在表 格中嵌套表格,表格也是一个普通的构件,可以把表格添加到另一个表格的 单元格之中,这样通过表格的嵌套就可以实现复杂的布局了。 在下面的这个例子中实现表格的综合应用,它包括建立表格,合并单元 格,以及嵌套表格。 实例演示:table.c Page 22 (2) 框 在GTK+中框是一种不可见的widget容器,它有水平框和垂直框 两种。水平框是指构件放入窗口的顺序水平排列。垂直框是指构件按 放入窗口的顺序垂直排列。水平框可以看做是只有一行的表格,而垂 直框可以看做是只有一列的表格。但是它们的操作比表格简单,放置 构件时不需要考虑构件的位置。 Page 23 框的建立