logo资料库

GTK+教程(很全面).pdf

第1页 / 共143页
第2页 / 共143页
第3页 / 共143页
第4页 / 共143页
第5页 / 共143页
第6页 / 共143页
第7页 / 共143页
第8页 / 共143页
资料共143页,剩余部分请下载后查看
GTK+
BlankWindow
Window
Icon
Button
MenuBar
Mnemonics
Check
ToolBar
Undo
GtkFixed
GtkVBox
GtkTable
GtkAlignment
Windows
Signals
Moving Window
Mouse Enter
Disconnect
Drag
Timer
Message Dialog
GtkAboutDialog
GtkFontSelectionDialog
GtkColorSelectionDialog
GtkButton
GtkCheckButton
GtkFrame
GtkLabel
GtkComboBox
GtkHSeparator
GtkEntry
GtkImage
GtkStatusBar
GtkIconView
List View
Advanced List
GtkTreeView
GtkTexView
Lines and Columns
GtkTextBuffer
CPU Widget
GTK+ 简介 关于本初级教程 l 本 GTK+程序初级教程采用了“引导”式的方法来教你如何使用 GTK+。本教程所用的编程语言 为 C 语言。并且整个教程中方法已经在 Linux 中测试通过。本教程适用 GTK+的初级兼代中级 水平的程序员。 GTK+ GTK+ 是一种函数库是用来帮助制作图形交互界面的。整个函数库都是由 C 语 言来编写的。 GTK+函数库通常也叫做 GIMP 工具包。因为,一开始 GTK+是用来编写“GIMP” –这个图形处理软件的。 从那以后, GTK+就逐渐成为了 Linux and BSDUnix 下最受欢迎的 用于图形交互界面(GUI)设计的工具包之一。时至今日,大多数的 Linux 下的 GUI 软件(有图 形交互界面)都是由 GTK+或者 QT 来编写的。GTK+是一种面向对象式的 API(applicationprogramming interface)。Glib 是 GTK+的基础,而这种“面向对象系统” 正是由“Glib”来提供的。 GObject 也就是这种面向对象的机制可以为 GTK+绑定很多种开发 语言。目前存在的语言有:C++, Python, Perl, Java, C#,PHP,等其他高级语言。 GTK+ 和以下“函数库”存在着依赖关系 • Glib • Pango • ATK • GDK • GdkPixbuf • Cairo Glib 是一种通用的函数库。她提供了各种各样的语言特性,譬如说:各种数据类型,字符串函 数,错误通知,消息队列和线程。 Pango 是一种函数库,用来实现国际化和本地化的功能。 ATK 一种平易近人的工具函数包,她提供了快捷键服务为肢体有缺陷的人使用电脑提供了便 利。 GDK 是一种函数库,她为整个 GTK+图形库系统提供了一些底层的“图形实现”和“窗口实
现”的方法。在 Linux 中 GDK 是位于 X 服务器和 GTK+函数库之间的。在最近的 GTK+发行版 本中,越来越多的功能性函数,都交给了 Cairo 函数库来处理。 GdkPixbuf 函数库是一种函 数库工具包用于加载图像和维护图像“缓存”的(pixel buffer)。 Cairo 是一种函数库用于制 作二维图像。从 GTK+2.8 版本以后,Cairo 就正式成为 GTK+系统中的一员了。 Gnome and XFce 桌面环境系统都是用 GTK+来编程实现的. SWT and wxWidgets 是种很 著名的编程框架,也是用 GTK+来编程实现的。最杰出的 GTK+软件的代表是 Firefox (火狐浏 览器)和 Inkscape。 编译 GTK+ 应用程序 有一个非常方便的工具--"pkg-config",可以帮助我们编译 GTK+的应用程序。pgk-config 可 以提供各种安装函数库(譬如 GDK,Pango 等)的位置。简单点说,就是我们如果想使用某种函 数库,Pkg-config 就会为我们提供所需要的 lib 与 include 文件的位置。 pkg-config 是从一 些通常以“.pc”结尾的文件中,得到所需要的信息的。 gcc -o simple simple.c `pkg-config --libs --cflags gtk+-2.0` 上面的编译命令,就是在展示我们如何去编译一个简单的源文件——“simple.c”。 $ pkg-config --cflags gtk+-2.0 -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 上面列出了 pkg-config 为你自动提供的编译所需要的 include 文件的信息。 $ pkg-config --libs gtk+-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0
-lfontconfig -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXfixes -lpango-1.0 -lcairo -lX11 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0 上面列出了 pkg-config 为你自动提供的编译所需要的 lib 文件的信息。 Sources • gtk.org • gtkforums.com • GTK+ / Gnome application development 第一个 GTK+程序 在这一章节中,我们将开始编写第一个 GTK+程序。 超级简单的例子 我们要“制造”一个超级简单的 GTK+程序。就是显示一个空白的窗口。 #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 -o simple simple.c `pkg-config --libs --cflags gtk+-2.0` 这就是我们用来编译这个例子的命令。下面我们将对这个简单的程序进行详细的解读。 gtk_init(&argc, &argv); 这就是在初始化整个 GTK+程序,是每一个 GTK+程序必不可少的部分。 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 这里我们首先生成了一个构件—— GtkWindow. 这个窗口构件的种类是 GTK_WINDOW_TOPLEVEL. . Toplevel 窗口拥有一个标题栏和边框。他们同意由窗口管 理器进行管理。 gtk_widget_show(window); 在我们生成了一个窗口构件以后,必不可少的是,我们需要用这句语句来显示构件。 gtk_main(); 这句代码语句将进入“主循环”。 在这一点上,GTK+程序将安静的等待“事件”(event)的发生, 以便做出相应的反应。 Figure: Simple 生成一个窗口
如果我们不安排窗口的摆放位置的话,那么窗口管理器将为我们给这个窗口“安一个家”。在下个 例子中,我们将走进“窗口”。 #include int main( int argc, char *argv[]){ GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Center"); gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_widget_show(window); g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_main(); return 0; } 在我们上面的这个例子,我将深入了解窗口构件(window widget),为窗口构件设置标题和 大小。 gtk_window_set_title(GTK_WINDOW(window), "Center"); gtk_window_set_title() 这个函数就可以为 window 设置一个标题,如果我们不用这个 函数的话,GTK+将用源文件的名字来作为窗口的标题。 gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
上面这个代码片段为 window 设置了 230x150 像素的大小。值得注意的是,我们这里提到的 大小是指主窗口的大小;而不包括窗口管理器提供的修饰或者装饰的部分。 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 这段代码把窗口设定在显示器的中央。 g_signal_connect_swapped(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL); 在之前的例子中,我们没有设置窗口的关闭,当我按下右上角的“X”时。我们可以看到,如果是 从命令行的方式来运行例子程序的话,默认情况下窗口程序并不会对你刚刚的动作作出反应(当 然,最新的窗口管理器,譬如 X11 会强行关闭)。我们必须要明确为这个例子程序连接上一个 关闭的信号(the destroy signal),就是 gtk_main_quit() 这个函数。 应用程序图标的制作 在下面的例子中,我们会进行应用程序图标的制作。大多数的窗口管理器都会把图标放置在标题 栏的左上方和任务栏上。 #include GdkPixbuf *create_pixbuf(const gchar * filename){ GdkPixbuf *pixbuf; GError *error = NULL; pixbuf = gdk_pixbuf_new_from_file(filename, &error); if(!pixbuf) { fprintf(stderr, "%s\n", error->message); g_error_free(error); } return pixbuf; }
int main( int argc, char *argv[]){ GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "icon"); gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("web.png")); gtk_widget_show(window); g_signal_connect_swapped(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL); gtk_main(); return 0; } 上面的就是为一个填加上图标的窗口程序了. gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("web.png")); 函数 gtk_window_set_icon() 是为窗口设置图标用的。函数 create_pixbuf() 作用是 从一个 png 图象文件中生成 GdkPixbuf 类型数据。 pixbuf = gdk_pixbuf_new_from_file(filename, &error); 根据官方公布的文档说明,函数 gdk_pixbuf_new_from_file() 一个文件中加载图象数 据,从而生成一个新的 pixbuf。 至于文件中包含图象的格式,是由系统自动检测的。如果该 函数返回值是 NULL 的话,程序就会出现错误。
Figure: Icon 增加 和 减少 下面我们将用一个简单的示例,来完成了“GTK+程序设计初级教程”的第一阶段,在这里我们用 到了三个构件:两个按钮和一个标签。这个标签将保存一个整数,两个按钮会分别增加和减少这 个数。 #include gint count = 0; char buf[5]; void increase(GtkWidget *widget, gpointer label){ count++; sprintf(buf, "%d", count); gtk_label_set_text(label, buf); } void decrease(GtkWidget *widget, gpointer label){ count--; sprintf(buf, "%d", count); gtk_label_set_text(label, buf);
分享到:
收藏