《GTK入门导引》由会员分享,可在线阅读,更多相关《GTK入门导引(138页珍藏版)》请在金锄头文库上搜索。
1、 GTK入门导引 Ian Main, slowintergate.bc.ca, September 17,1997 翻译: Brian Lin, OK STATION, Webmaster, 7/23/1998, http:/ 目录 1. 简介 2. 开始 2.1 用GTK来写Hello World 2.2 编译Hello World 2.3 Signals及Callbacks的原理 2.4 步过Hello World 3. 下一步 3.1 资料型态 3.2 更多Signal Handlers 3.3 Hello World加强版 4. 封装物件 4.1 Packing Boxes原理 4.
2、2 详述Boxes 4.3 Packing范例程式 4.4 Packing Using Tables 4.5 Table Packing范例 5. 物件概论 5.1 分派系统 5.2 物件组织 5.3 没有视窗的物件 6. 按钮物件 6.1 一般按钮 6.2 Toggle按钮 6.3 Check按钮 6.4 Radio按钮 7. Tooltips 物件 8. Container 物件 8.1 Notebooks 8.2 卷动视窗 9. EventBox 物件 10. 其它物件 10.1 标签 10.2 Progress Bars 10.3 对话盒 10.4 Pixmaps 10.5 影像 11
3、. 档案选取 12. List物件 12.1 信号 12.2 函数集 12.3 范例 12.4 List Item物件 12.5 信号 12.6 函数集 12.7 范例 13. 尚未有文件的物件 13.1 文字项目 13.2 颜色选取 13.3 范围控制 13.4 尺规 13.5 文字盒 13.6 预览 13.7 曲线 14. 选单物件 14.1 Manual Menu Creation 14.2 Manual Menu Example 14.3 使用GtkMenuFactory 14.4 Menu Factory Example 15. Timeouts, IO 及Idle函数 15.1 T
4、imeouts 15.2 监督IO 15.3 Idle函数 16. 选取区域的管理 16.1 概说 16.2 撷取选取区域 16.3 提供选取区域 17. glib 17.1 定义 17.2 双向链结串列 17.3 单向链结串列 17.4 记忆体管理 17.5 Timers 17.6 字串处理 17.7 工具及错误处理函数 18. 设定物件属性 19. GTK的rc档 19.1 rc档的功能 19.2 GTK的rc档格式 19.3 rc档范例 20. 写属於您自己的物件 20.1 概说 20.2 物件的解析 20.3 产生一个组合式的物件 20.4 从草稿中产生一个新的物件. 20.5 更多一
5、点 20.6 版权 21. 写 GTK程式的技巧 22. 贡献本计划 23. 好人们 24. 版权 1. 简介 GTK (GIMP Toolkit) 起源於开发用来做为GIMP (General Image Manipulation Program)的一套工具. GTK建立在GDK (GIMP Drawing Kit)的上层, 基本上是将Xlib功能包装起来. 它被称为GIMP toolkit是因为原来是写来开发GIMP, 但现在被许多免费软体计划所使用. 原作者为 Peter Mattis petmxcf.berkeley.edu Spencer Kimball spencerxcf.ber
6、keley.edu Josh MacDonald jmacdxcf.berkeley.edu GTK基本上是物件导向应用软体程式设计介面(API). 虽然完全用C所写成, 他是用classes及callback函数的观念所实作出来的(指向该函数). 还有另一个被称为glib的函数库被用到, 该函数库包涵了一些标准X函数的替代函数, 及一些额外的处理链结表的函数等等. 这些替代函数是用来增加GTK的可移植性, 因为有些函数需要用到非标准的功能, 诸如g_strerror(). 有些则包含一些libc版本的加强的功能, 诸如g_malloc有加强的除错功能. 这份导引是尽可能去详尽描述GTK的功能
7、, 虽然实在没有办法尽善尽美. 这份导引假设读者对C语言有很相当的基础, 并且知道如何去写C语言程式. 如果读者有过X的程式经验, 会大大有帮助, 但并非绝对需要 (译注: 这一点就好像是要先学MFC或SDK的问题一样). 如果您以GTK做为进入X程式设计的入门的话, 请给我们一些建议, 有关於您在本导引所学到及发现的东西, 及过程中有何困扰. 同时, 目前GTK也有C+ API(GTK-)正在发展, 所以如果您喜欢用C+, 您可能要先去看一看. 同时也有一套Objective C wrapper, guile bindings版本也有, 但我不建议您走这条路. 同时我也很想知道, 您在由本文
8、学习GTK上有何问题, 我会感谢您告诉我如何改进这些种种的缺点. 翻译: OK STATION, Webmaster, Brian Lin 声明: 本文翻译作业, 全程均在LINUX底下完成. 2. 开始 第一件要做的是当然是取得一份GTK的原始码并且安装进您的系统中. 您可以从GIMP取得一份发行版, 或者是从Peter Mattiss的家中 ftp.xcf.berkely.edu/pub/pmattis(however, it has been changed to ftp.gimp.org)取得一份. GTK使用GNU的autoconf来设定. 一但您解开档案, 输入configure
9、-help来看看选项表列. 在介绍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; 所有程式理所当然一定会包含gtk/gtk.h, 其中宣告了所有变数,
10、 函数, 及资料及结构. 这些东西您会在您的GTK应用软体中用到. 下一行 gtk_init (&argc, &argv); 呼叫函数gtk_init(gint *argc, gchar *argv)将会启动GTK. 该函数设定了一些内定的值, 并且後续交给gdk_init(gint *argc, gchar *argv) 继续处理. 该函数启动了一些函数库以供使用, 设定了内定的信号处理, 检查传给您的程式的命令列参数. 看看以下: -display -debug-level -no-xshm -sync -show-events -no-show-events 这些参数将会从参数表中删去,
11、 所剩下的会传给您做後续的处理. 这样会产生标准的参数表(除了GTK所使用的)以供您使用. 下面这两行程式会产生并显示一个视窗. window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); GTK_WINDOW_TOPLEVEL参数指定了我们承习视窗管理程式的外观. 即便我们产生一个0x0大小的视窗, 没有子视窗的视窗内定被设为200x200, 如此我们依然可以处理它. gtk_widget_show()函数, 让GTK知道, 我们已经处理完设定其属性的工作, 并且可以显示它. 最後一行进入GTK的主要处理回
12、圈. gtk_main (); gtk_main()是个在每个GTK应用软体中都会看到的一个函数. 当控制到达这里, GTK会睡一下来等待X事件的发生(诸如像按键被按下). 在我们最简单的例子里面, 事件会被忽略掉. 因为我们没有处理它. 2.1 用 GTK来写Hello World 好, 现在我们来写一个有一个视窗物件的视窗(一个按钮). 这是个GTK的标准hello world. 这会建立起一个新的GTK软体的良好基础. #include /* 这是个callback函数. 其资料参数在本例中被忽略 * 以下有更多的callback函数. */ void hello (GtkWidget
13、*widget, gpointer *data) g_print (Hello Worldn); /* another callback */ void destroy (GtkWidget *widget, gpointer *data) gtk_main_quit (); int main (int argc, char *argv) /* GtkWidget用以储存视窗物件形态 */ GtkWidget *window; GtkWidget *button; /* 这在所有GTK应用软体中用到. 参数由命令列中解译出来并且送到该应用软体中. */ gtk_init (&argc, &ar
14、gv); /* 产生新视窗 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* 当视窗收到destroy信号时(可由该软体或视窗管理程式所送出) 所会被呼叫到的destroy函数一如以下所定义的一般. 送到该函数的资料将会是NULL,并且在该函数中被忽略 */ gtk_signal_connect (GTK_OBJECT (window), destroy, GTK_SIGNAL_FUNC (destroy), NULL); /* 设定视窗的边框的宽度 */ gtk_container_border_width (GTK_CONTAINER
15、 (window), 10); /* 产生一个新的按钮并带有Hello World的字在上面. */ button = gtk_button_new_with_label (Hello World); /* 当该按键收到clicked信号, 它会呼叫hello()这个函数. 并且以NULL做为其参数. hello()函数在以上已定义过. */ gtk_signal_connect (GTK_OBJECT (button), clicked, GTK_SIGNAL_FUNC (hello), NULL); /* 这会导致当clicked这个按钮被按下的时候, 呼叫gtk_widget_destroy(window)而使该视窗被关闭 当