第一章入门1.1Hello!World!1.11第一个GTK程序1.12GTK的对象导向架构1.2Signal与Callback1.21使用Signal关闭窗口1.22自订callback函式1.23内建Signal的发射与停止1.3事件处理1.31GDK事件结构1.32GTK事件处理函式1.33事件屏蔽(EventMask)1.4基本版面配置1.41GtkHBox与GtkVBox1.42GtkFrame与GtkButtonBox1.43GtkTable第二章基本图形组件2.1按钮2.11GtkButton与GtkToggleButton2.12影像及文字按钮2.13GtkCheckButton与GtkRadioButton2.2对话框2.21GtkMessageDialog2.22GtkAboutDialog2.23GtkColorButton与GtkColorSelectionDialog2.24GtkFontButton与GtkFontSelectionDialog2.25GtkFileChooserButton与GtkFileChooserDialog2.26使用GtkDialog自订对话框2.3文字字段2.31GtkEntry2.32GtkSpinButton2.33GtkTextView2.4选项清单2.41GtkComboBox2.42GtkComboBox与GtkListStore2.43GtkComboBox与GtkTreeStore2.44GtkTreeView与GtkListStore2.45GtkTreeView与GtkTreeStrore2.5版面组件2.51GtkNotebook2.52GtkPaned2.53GtkScrolledWindow2.54GtkAlignment、GtkFixed与GtkLayout2.55GtkFrame与GtkAspectFrame第三章进阶组件使用3.1选单元件3.11GtkHandleBox3.12GtkMenuBar、GtkMenu与GtkMenuItem3.13GtkCheckMenuItem、GtkRadioMenuItem与GtkTearoffMenuItem3.14GtkUIManager3.2列组件3.21GtkProgressBar3.22GtkToolBar3.23GtkStatusBar3.3其它组件3.31GtkStyle与资源档3.32GtkLabel3.33GtkScale3.34GtkEntryCompletion3.35GtkArrow3.36GtkRuler3.37GtkAssistant3.38GtkCalendar3.39GtkDrawingArea第四章GLib4.1基本型态、宏、公用(Utility)函式4.11GLib基本型态与宏4.12GTimer4.13Timeout与Idle4.14环境信息4.15日志(Logging)4.2输入输出4.21基本档案读写4.22目录信息4.23GIOChannel与档案处理4.24GIOChannel与Pipe4.3数据结构、内存配置4.31GString4.32GArray、GPtrArray、GByteArray4.33GSList、GList4.34GHashTable4.35GTree与GNode4.36内存配置4.4执行绪4.41GThread4.42GMutex4.43GCond第一章入门1.1Hello!World!1.11第一个GTK程序不可免俗的,从昀简单的基本窗口产生开始介绍,窗口标题就叫作「哈啰!GTK+!」好了,请使用任一编辑器来编辑一个helloGtk.c的档案,内容如下:helloGtk.c#includegtk/gtk.hintmain(intargc,char*argv[]){GtkWidget*window;gtk_init(&argc,&argv);window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),哈啰!GTK+!);gtk_widget_show(window);gtk_main();return0;}首先include必要的GTK标头档案,接着先看到gtk_init(),这个函式会先初始化函式库,设定预设信号处理,并让GTK有机会处理传递给程序的命令列自变量,GTK会检查是否有以下的自变量并处理:–gtk-module–g-fatal-warnings–gtk-debug–gtk-no-debug–gdk-debug–gdk-no-debug–display–sync–name–class这些自变量会从自变量列中移除,剩下的部份留待您自己的程序逻辑来处理。GTK虽然使用C来撰写,但是透过GObject函式库,可以支持对象导向的对象封装、继承观念,透过宏还可以支持多型的观念(至少概念上达到一些部份),一个GTK对象阶层如下所示:GObject+--GInitiallyUnowned+--GtkObject+--GtkWidget+--GtkContainer+--GtkBin+--GtkWindowgtk_window_new()会建立一个GtkWindow,这是一个基本的窗口对象,GtkWindow继承自GtkBin,GtkBin继承自GtkContainer,GtkContainer可以容纳其它widget,所以在GtkWindow中可以置放其它的widget,而它们全都是GtkWidget的后代。在函式库的组织上,GTK+的参考手册中,若要查询与GtkWindow设定的相关函式,也就是gtk_window开头的函式名称,则直接查询GtkWindow的说明文件。在范例中,您使用gtk_window_new()在内存中产生一个GtkWindow(但还不是真正出现在屏幕画面中),参数设定为GtkWindowType,有两个可用的设定:GTK_WINDOW_TOPLEVEL:一个有外框的标准GTK窗口。GTK_WINDOW_POPUP:一个蹦现窗口,像是对话框、蹦现选单或提示文字。若要设定GtkWindow标题文字,则使用gtk_window_set_title(),GTK_WINDOW宏用以将window对象转型为GtkWindow型态。gtk_window_new()只是在内存中产生一个GtkWindow,若要真正在屏幕画面中显示GTK的widget,则使用gtk_widget_show(),昀后呼叫gtk_main(),这会将程序的控制权交给GTK,由GTK来等待键盘、按钮等事件或是档案IO通知。您可以使用以下的指令来进行编译与执行:$gcchelloGtk.c-ohelloGtk`pkg-config--cflags--libsgtk+-2.0`$./helloGtkpkg-config会先取得GTK的标头文件位置与函式库信息,然后再供给gcc进行编译,一个程序的执行画面如下所示,这个程序的原始码使用UTF8编码,在编译执行之后,可直接显示中文:由于gtk_main()会将控制权交给了GTK,直到呼叫gtk_main_quit()之前都不会返回,这个范例目前还没有实作这个部份(之后还会介绍如何实作),因此这个窗口您按下右上X钮也不会真正关闭,而必须在文字模式下先使用Ctrl+C强制中断程序。有关gtk_main()、gtk_main_quit()等函式的说明,可以参考GTK+参考文件中的MainloopandEvents。1.12GTK的对象导向架构GTK基本上是使用C语言来撰写,即使C语言本身不支持对象导向,但GTK在架构上运用了一些方式,使得使用GTK时可以支持许多对象导向的概念。在对象导向的封装特性上,GTK以结构(structure)的方式来模拟类别,事实上GTK也直接称这些结构为类别,以建构GtkWindow的程序代码为例:window=gtk_window_new(GTK_WINDOW_TOPLEVEL);在函式的组织上,与GtkWindow相关的函式,都是以gtk_window名称作为开头,gtk_window_new()就像是对象导向程序语言中的建构式,如果要设置GtkWindow的相关属性,例如标题名称:gtk_window_set_title(GTK_WINDOW(window),哈啰!GTK+!);gtk_window_set_title()的第一个参数接受GtkWindow指标,透过这种方式,让实际上属于全域的函式,看来就像是专属于GtkWindow所使用,就如同对象上所带有的公开(public)方法(method)或成员函式(memberfunction),而在私有(private)的模拟上,GTK使用static函式,例如在gtkwindow.c原始程序代码中,可以看到:staticvoidgtk_window_dispose(GObject*object);staticvoidgtk_window_destroy(GtkObject*object);staticvoidgtk_window_finalize(GObject*object);staticvoidgtk_window_show(GtkWidget*widget);staticvoidgtk_window_hide(GtkWidget*widget);staticvoidgtk_window_map(GtkWidget*widget);staticvoidgtk_window_unmap(GtkWidget*widget);staticvoidgtk_window_realize(GtkWidget*widget);staticvoidgtk_window_unrealize(GtkWidget*widget);这些static函式不会出现在gtkwindow.h标头文件中,仅可在gtkwindow.c中使用,这看起来就像是GtkWindow的专属私用函式。在继承上,GTK实际上使用结构链接(link)的方式,在第一个GTK程序中看过以下的继承关系:GObject+--GInitiallyUnowned+--GtkObject+--GtkWidget+--GtkContainer+--GtkBin+--GtkWindow以GtkContainer为例,在gtkcontainer.h中有如下的定义:typedefstruct_GtkContainerGtkContainer;...struct_GtkContainer{GtkWidgetwidget;GtkWidget*focus_child;guintborder_width:16;/*private*/guintneed_resize:1;guintresize_mode:2;guintreallocate_redraws:1;guinthas_focus_chain:1;};GtkContainer的成员中有一个GtkWidget,而再来看到gtkwidget.h:typedefstruct_GtkWindowGtkWindow;...struct_GtkWidget{/*Theobjectstructureneedstobethefirst*elementinthewidgetstructureinorderfor*theobjectmechanismtoworkcorrectly.This*allowsaGtkWidgetpointertobecasttoa*GtkObjectpointer.*/GtkObjectobject;...};GtkWidget中有个成员为GtkObject,以如此的链接关系来维持对象上的继承关系架构,而在gtk_window_set_title()函式的使用例子中:gtk_window_set_title(GTK_WIND