logo资料库

gtk中文手册(Linux).pdf

第1页 / 共158页
第2页 / 共158页
第3页 / 共158页
第4页 / 共158页
第5页 / 共158页
第6页 / 共158页
第7页 / 共158页
第8页 / 共158页
资料共158页,剩余部分请下载后查看
GTK+ 2.0 教程
版本号: V_0.1.0  2002年6月25日
本文是有关通过 C 语言接口使用 GTK (the GIMP Toolkit) 的教程。
end
简介
从这里开始
用 GTK 来写 Hello World
编译 Hello World 程序
信号和回调函数的原理
事件
Hello World 详解
继续
数据类型
深入探索信号处理函数
改进了的 Hello World
组装构件
组装盒的原理
盒的细节
组装示范程序
用表组装
表组装示例
构件概述
类型转换
构件的组织
无窗口构件
按钮构件
一般按钮 Normal Buttons
开关按钮 Toggle Buttons
复选按钮 Check Buttons
单选按钮 Radio Buttons
调整对象 Adjustments
创建一个调整对象
轻松使用调整对象
“调整对象”的内部机制
范围构件 Range Widgets
滚动条构件 Scrollbar Widgets
比例构件 Scale Widgets
创建一个比例构件
函数和信号(至少讲了函数)
常用的范围函数
设置更新方式
获得和设置调整对象
键盘和鼠标绑定
示例
杂项构件
标签 Labels
箭头 Arrows
工具提示对象 The Tooltips Object
进度条 Progress Bars
对话框 Dialogs
标尺 Rulers
状态栏 Statusbars
文本输入构件 Text Entries
微调按钮 Spin Buttons
组合框 Combo Box
日历 Calendar
颜色选择 Color Selection
文件选择 File Selections
容器构件 Container Widgets
事件盒 The EventBox
对齐构件 The Alignment widget
固定容器 Fixed Container
布局容器 Layout Container
框架 Frames
比例框架 Aspect Frames
分栏窗口构件 Paned Window Widgets
视角 Viewports
滚动窗口 Scrolled Windows
按钮盒 Button Boxes
工具栏 Toolbar
笔记本 Notebooks
菜单构件
手工创建菜单
手工菜单示例
使用套件
套件示例
无文档构件
快捷标签 Accel Label
选项菜单 Option Menu
菜单项 Menu Items
复选菜单项 Check Menu Item
单选菜单项 Radio Menu Item
分隔菜单项 Separator Menu Item
分离菜单项 Tearoff Menu Item
曲线图 Curves
绘图区 Drawing Area
字体选择对话框 Font Selection Dialog
消息对话框 Message Dialog
Gamma 曲线图
图像 Image
插头和插座 Plugs and Sockets
树视区 Tree View
文本视区 Text View
设置构件的属性
超时、IO 和 Idle 函数
超时 Timeouts
监控IO
Idle 函数
高级事件和信号处理
信号函数
连接和断开信号处理函数
阻塞和反阻塞信号处理函数
发出和停止信号
信号的发射和传播
操作选中区
概述
获取选中区信息
提供选中区
拖放
概述
属性
函数
设置源构件
源构件上的信号
设置目的构件
目的构件上的信号
GLib
定义
双向链表
单向链表
存储管理
计时器
字符串处理
实用程序和错误处理函数
GTK 的 rc 文件
rc 文件的功能
GTK rc 文件的格式
rc 文件示例
编写你自己的构件
概述
一个构件的剖析
创建一个复合构件
介绍
选择一个父类
头文件
_get_type() 函数
_class_init() 函数
_init() 函数
其余的...
从头创建构件
介绍
在屏幕上显示构件
表盘构件的原形
主体
gtk_dial_realize()
大小磋商
gtk_dial_expose()
事件处理
可能的增强
深入的学习
涂鸦板,一个简单的绘图程序
概述
事件处理
绘图区构件和绘图
添加XInput支持
允许扩展设备信息
使用扩展设备信息
得到更多关于设备的信息
进一步的讲解
编写 GTK 应用程序的技巧
GTK+ 2.0 教程 版本号: V_0.1.0  2002 年 6 月 25 日 本文是有关通过 C 语言接口使用 GTK (the GIMP Toolkit) 的教程。 Table of Contents 中文版说明 简介……………………………………………………………………………………………………………………………………4 从这里开始……………………………………………………………………………………………………………………………4 程序 用 GTK Hello World 来写 Hello World 编译 信号和回调函数的原理 事件 Hello World 详解 继续……………………………………………………………………………………………………………………………………12 数据类型 深入探索信号处理函数 Hello World 改进了的 组装构件………………………………………………………………………………………………………………………………14 组装盒的原理 盒的细节 组装示范程序 用表组装 表组装示例 构件概述………………………………………………………………………………………………………………………………23 类型转换 构件的组织 无窗口构件 按钮构件………………………………………………………………………………………………………………………………26 Normal Buttons Toggle Buttons Check Buttons Radio Buttons 一般按钮 开关按钮 复选按钮 单选按钮 Adjustments 调整对象 31 ……………………………………………………………………………………………………………… 创建一个调整对象 轻松使用调整对象 “ 调整对象”的内部机制 Range Widgets 范围构件 33 …………………………………………………………………………………………………………… Scrollbar Widgets 滚动条构件 比例构件 Scale Widgets 创建一个比例构件 函数和信号 ( 至少讲了函数 ) 常用的范围函数 设置更新方式 获得和设置调整对象 键盘和鼠标绑定 示例 杂项构件………………………………………………………………………………………………………………………………39 标签 Labels 1
Rulers Arrows 箭头 The Tooltips Object 工具提示对象 Progress Bars 进度条 Dialogs 对话框 标尺 Statusbars 状态栏 文本输入构件 Spin Buttons 微调按钮 Combo Box 组合框 日历 颜色选择 文件选择 Container Widgets 容器构件 76 Color Selection File Selections Text Entries Calendar ……………………………………………………………………………………………………… Frames The EventBox Aspect Frames 事件盒 The Alignment widget 对齐构件 Fixed Container 固定容器 Layout Container 布局容器 框架 比例框架 分栏窗口构件 视角 Scrolled Windows 滚动窗口 按钮盒 工具栏 笔记本 Button Boxes Toolbar Notebooks Viewports Paned Window Widgets 菜单构件……………………………………………………………………………………………………………………………100 手工创建菜单 手工菜单示例 使用套件 套件示例 无文档构件…………………………………………………………………………………………………………………………106 Check Menu Item Radio Menu Item Separator Menu Item Tearoff Menu Item Font Selection Dialog Message Dialog 曲线图 Plugs and Sockets Accel Label 快捷标签 Option Menu 选项菜单 菜单项 复选菜单项 单选菜单项 分隔菜单项 分离菜单项 Menu Items Curves Drawing Area 曲线图 绘图区 字体选择对话框 消息对话框 Gamma 图像 插头和插座 树视区 Text View 文本视区 设置构件的属性 超时、 Image Tree View IO 和 Idle ……………………………………………………………………………………………………………108 函数 Timeouts IO 函数 超时 监控 Idle 高级事件和信号处理 信号函数 连接和断开信号处理函数 2
阻塞和反阻塞信号处理函数 发出和停止信号 信号的发射和传播 操作选中区 概述 获取选中区信息 提供选中区 拖放 概述 属性 函数 设置源构件 源构件上的信号 设置目的构件 目的构件上的信号 GLib 定义 双向链表 单向链表 存储管理 计时器 字符串处理 实用程序和错误处理函数 rc 文件 rc 文件的功能 GTK rc 文件的格式 rc 文件示例 GTK 的 编写你自己的构件………………………………………………………………………………………………………………124 概述 一个构件的剖析 创建一个复合构件 介绍 选择一个父类 头文件 _get_type() _class_init() _init() 其余的 从头创建构件 函数 ... 函数 函数 介绍 在屏幕上显示构件 表盘构件的原形 主体 gtk_dial_realize() 大小磋商 gtk_dial_expose() 事件处理 可能的增强 深入的学习 涂鸦板,一个简单的绘图程序……………………………………………………………………………………………………141 概述 事件处理 绘图区构件和绘图 支持 添加 XInput 允许扩展设备信息 使用扩展设备信息 得到更多关于设备的信息 进一步的讲解 GTK 应用程序的技巧 编写 ………………………………………………………………………………………………………151 3
简介 GTK (GIMP Toolkit) 是一套用于创建图形用户界面的工具包。它遵循 LGPL 许可证,所以你可以用它来开发开源软件、 自由软件,甚至是封闭源代码的商业软件,而不用花费任何钱来购买许可证和使用权。 GTK 被称为 GIMP 工具包是因为最初写它是用来开发 GIMP (GNU 图像处理程序) 的,但是它现在已经被用于很多软件 项目了,包括 GNOME (GNU 网络对象模型环境)。GTK 是在 GDK (GIMP Drawing Kit) 和 gdk-pixbuf 的基础上建立 起来的,GDK 基本上是对访问窗口的底层函数 (在 X 窗口系统中是 Xlib) 的一层封装,gdk-pixbuf 是一个用于客户端 图像处理的库。 GTK 的创建者是: • Peter Mattis petm@xcf.berkeley.edu • Spencer Kimball spencer@xcf.berkeley.edu • Josh MacDonald jmacd@xcf.berkeley.edu GTK 的当前维护者是: • Owen Taylor otaylor@redhat.com • Tim Janik timj@gtk.org GTK 实质上是一个面向对象的应用程序接口 (API)。尽管完全用 C 写成的,但它是基于类和回调函数 (指向函数的指针) 的思想实现的。 还 有一个名为 GLib 的第三个组件,包含一些标准函数的替代函数,以及一些处理链表等数据结构的函数等。这些替代 函数被用来增强 GTK 的可移植性,因为它们所实现的一些函数在其它 Unix 系统上未实现或不符合标准,比如 g_strerror()。一些是对 libc 的对应函数的增强,比如 g_malloc() 具有增强的调试功能。 在 2.0 版中,GLib 又加入这样一些新内容:构成 GTK 类层次基础的类型系统 (type system),在 GTK 中广泛使用的 信号系统,对各种不同平台的线程 API 进行抽象而得的一个线程 API,以及一个加载模块的工具。 作为最后一个组件,GTK 使用了 Pango 库来处理国际化文字输出。 本 教程讲述 GTK 的 C 接口。还有许多其它语言的 GTK 绑定如 C++、Perl、Python、TOM、Ada95、Objective C、Free Pascal、Eiffel、Java 和 C#。如果你想使用 GTK 其它语言的绑定,请先查看该绑定的文档。有时这些文档会 讲一些重要的概念,然后你再来参考本教程。还有一些跨平台的 API (如 wxWindows 和 V),它们把 GTK 作为一个支 持的平台。同样,先参考它们的文档。 如果你用 C++ 来开发 GTK 应用程序,有以下几点需要注意。已有一个 GTK 的 C++ 绑定叫做 GTK-- (译者注:现在 叫做 gtkmm),提供一个更符合 C++ 规范的接口,你可以先看看这个接口。如果你由于种种原因不喜欢这种方法,还 有另外两种使用 GTK 的方法。首先,你可以只使用 C++ 中的 C 子集来调用 GTK,这样就可以使用本教程描述的 C 接口。其次,你可以用下述方法同时使用 GTK 和 C++:把所用的回调函数定义为 C++ 类中的静态成员函数,然后仍 然使用 C 接口来调用 GTK。如果你选择后一种方法,你可以把指向要操作的对象的指针 (即所谓的 "this")作为回调函 数的 data 参数。选择哪一种方法仅仅是个人的喜好问题,因为不管用哪一种方法,你都会得到 C++ 和 GTK。它们都 不需要特殊的预处理程序,因此你可以同时使用标准 C++ 和 GTK。 4
本教程试图尽可能详细地描述 GTK,但是肯定不能面面俱到。本教程假设你能够较好的理解 C 语言,并且了解怎样编写 一个 C 程序。有 X 编程经验会很有帮助,但不是必要条件。如果 GTK 是你学习的第一个构件工具包,请告诉我们你怎 样找到这个教程,以及学习时有什么困难。还有其它一些语言的绑定,如 C++、Objective C、ADA、Guile 等,但我 不了解这些。 本教程仍在不断完善中。请到 http://www.gtk.org/ 查看更新情况。 我非常乐意听到你在使用本教程学习 GTK 时遇到的各种困难,并欢迎对怎样改进此文档提出建议。更多信息请参阅投稿 这一章。 从这里开始 你首先做的第一件事,当然是下载 GTK 源程序,并安装它。你总是能从 ftp.gtk.org 得到最新版本。你也可以在 http:// www.gtk.org/ 上查看其它 GTK 源程序的信息。GTK 使用 GNU autoconf 配置。解压缩后,输入 ./configure --help 查看选项列表 GTK 源码发布包中包含教程中所有示例的代码,每个示例中包含有 Makefiles 文件,用以方便编译。 一开始介绍 GTK,我们会尽可能从简单的程序开始。这个程序创建 200x200 大小的窗口,没有办法退出,除非你从 shell 中将它杀掉。 #include int main( int argc, char *argv[] ) { GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); gtk_main (); return 0; } 你可以用 gcc 编译上面的程序: gcc base.c -o base `pkg-config --cflags --libs gtk+-2.0` Hello World 不常用的编译参数在下面 编译 程序 中解释。 所有程序应该包含 gtk/gtk.h,其中声明了变量、函数以及数据结构等,这些东西会在你的程序中使用。 下一行: gtk_init (&argc, &argv); 5
这 个函数 gtk_init(gint *argc, gchar ***argv) 会在每个 GTK 应用程序中调用。该函数设定了默认的视频(visual)和 颜色映射模式(color map),接着会调用函数 gdk_init(gint *argc, gchar ***argv)。该函数初始化要使用的库,设定默 认的信号处理,并检查传递给你的程序的命令行参数,寻找下列之一: • • • • • • • • • • --gtk-module --g-fatal-warnings --gtk-debug --gtk-no-debug --gdk-debug --gdk-no-debug --display --sync --name --class 这些参数将会从参数表中删除,留下它不能识别的给你的程序解析或忽略。这就创建了可以被所有 GTK 程序接受的一组 标准参数。 下面两行程序会创建并显示一个窗口 window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); GTK_WINDOW_TOPLEVEL 参数指我们要使用窗口管理器来修饰和放置窗口。这里不会创建一个 0x0 大小的窗口,一 个没有子构件的窗口默认大小设置为 200x200,这样你仍然能操作它。 gtk_widget_show() 函数让 GTK 知道,我们已经设置完构件的属性,可以显示它了。 最后一行进入 GTK 主处理循环。 gtk_main (); gtk_main() 是另一个可以在每个 GTK 程序中见到的函数调用。当程序运行到这里,GTK 会“睡着”等待 X 事件 (如按 钮或键盘按下)、超时(timeouts)或文件 IO 通知发生。在我们的示例中,事件被忽略。 用 GTK 来写 Hello World 好,现在来写一个只有一个按钮构件的程序,这是一个标准的 GTK Hello World。 #include /* 这是一个回调函数。data 参数在本示例中被忽略。 * 后面有更多的回调函数示例。*/ void hello( GtkWidget *widget, gpointer data ) { g_print ("Hello World\n"); } gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) { /* 如果你的 "delete_event" 信号处理函数返回 FALSE,GTK 会发出 "destroy" 信号。 * 返回 TRUE,你不希望关闭窗口。 * 当你想弹出“你确定要退出吗?”对话框时它很有用。*/ g_print ("delete event occurred\n"); 6
/* 改 TRUE 为 FALSE 程序会关闭。*/ return TRUE; } /* 另一个回调函数 */ void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit (); } int main( int argc, char *argv[] ) { /* GtkWidget 是构件的存储类型 */ GtkWidget *window; GtkWidget *button; /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/ gtk_init (&argc, &argv); /* 创建一个新窗口 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭” * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 delete_event() 函数。 * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/ g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); /* 在这里我们连接 "destroy" 事件到一个信号处理函数。 * 对这个窗口调用 gtk_widget_destroy() 函数或在 "delete_event" 回调函数中返回 FALSE 值 * 都会触发这个事件。*/ g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); /* 设置窗口边框的宽度。*/ gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* 创建一个标签为 "Hello World" 的新按钮。*/ button = gtk_button_new_with_label ("Hello World"); /* 当按钮收到 "clicked" 信号时会调用 hello() 函数,并将 NULL 传给 * 它作为参数。hello() 函数在前面定义了。*/ g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hello), NULL); /* 当点击按钮时,会通过调用 gtk_widget_destroy(window) 来关闭窗口。 * "destroy" 信号会从这里或从窗口管理器发出。*/ g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), window); /* 把按钮放入窗口 (一个 gtk 容器) 中。*/ gtk_container_add (GTK_CONTAINER (window), button); /* 最后一步是显示新创建的按钮和窗口 */ gtk_widget_show (button); gtk_widget_show (window); /* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里 * 等待事件 (如键盘事件或鼠标事件) 的发生。*/ gtk_main (); 7
return 0; } 编译 Hello World 程序 编译命令是: gcc -Wall -g helloworld.c -o helloworld `pkg-config --cflags gtk+-2.0` \ `pkg-config --libs gtk+-2.0` 这里使用了程序 pkg-config,可以从 www.freedesktop.org 得到。这个程序读取 GTK 附带的 .pc 文件来决定编译 GTK 程序需要的编译选项。pkg-config --cflags gtk+-2.0 列出 include 目录,pkg-config --libs gtk+-2.0 列出编译 连接库,也可以合在一起,像这样:pkg-config --cflags --libs gtk+-2.0。 注意上面编译命令中使用的单引号类型是很重要的。(译者注:这里使用了“命令替换”。命令替换(command substitution)使得可以捕获一个命令的输出而在另一个命令中替换它。这个单引号不是回车键左边的那个,而是 ESC 键 下面的那个。) 连接时常用的库: • GTK 库(-lgtk),构件库,基于 GDK。 • GDK 库(-lgdk),Xlib 库的封装(wrapper)。 • gdk-pixbuf 库(-lgdk_pixbuf),图像处理库。 • Pango 库(-lpango),处理国际化文本。 • gobject 库(-lgobject),包含作为 GTK 基础的类型系统。 • gmodule 库(-lgmodule),动态运行库。 • GLib 库(-lglib),包含各种函数;这个示例里只用了 g_print()。GTK 是基于 GLib 的,因此你总需要这个库。 详见 GLib 这一章。 • Xlib 库(-lX11),GDK 要使用。 • Xext 库(-lXext),包含共享内存位图和其它 X 扩展。 • math 库(-lm),数学库,这个被 GTK 因各种目的而使用。 信号和回调函数的原理 在 2.0 版,信号系统已从 GTK 移到 GLib,因此在函数和类型的说明中有前缀 "g_" 而不是 "gtk_"。我们不打 算介绍 GLib 2.0 信号系统相对 GTK 1.2 信号系统扩展的细节。 在我们详细分析 helloworld 程序之前,我们会讨论信号和回调函数。GTK 是一个事件驱动的工具包,意味着它会等在 gtk_main() 那里,直到下一个事件发生,才把控制权传给适当的函数。 控 制权的传递是使用“信号”的办法来完成的。(注意这里的信号并不等同于 Unix 系统里的信号,并且也不是用它们实 现的,虽然使用的术语是一样的。) 当一个事件发生时,如按一下鼠标键,所按的构件会“发出”适当的信号。这就是 GTK 的工作机制。有所有构件都继承的信号,如 "destroy",有构件专有的信号,如开关 (toggle) 按钮发出的 "toggled" 信号。 要使一个按钮执行一个动作,我们需设置信号和信号处理函数之间的连接。可以这样使用函数来设置连接: gulong g_signal_connect( gpointer *object, const gchar *name, GCallback func, gpointer func_data ); 第一个参数是要发出信号的构件,第二个参数是你想要连接的信号的名称,第三个参数是信号被捕获时所要调用的函数, 第四个参数是你想传递给这个函数的数据。 第三个参数指定的函数叫做回调函数,一般为下面的形式: 8
分享到:
收藏