【php精品源码栏目提醒】:网学会员--在 php精品源码编辑为广大网友搜集整理了:GTK 程序设计中文版 - 其它资料绩等信息,祝愿广大网友取得需要的信息,参考学习。
GTK 简介关于本初级教程 l本 GTK程序初级教程采用了“引导”式的方法来教你如何使用 GTK。
本教程所用的编程语言为 C 语言。
并且整个教程中方法已经在 Linux 中测试通过。
本教程适用 GTK的初级兼代中级水平的程序员。
GTK GTK 是一种函数库是用来帮助制作图形交互界面的。
整个函数库都是由 C 语言来编写的。
GTK函数库通常也叫做 GIMP 工具包。
因为,一开始 GTK是用来编写“GIMP”–这个图形处理软件的。
从那以后, GTK就逐渐成为了 Linux and BSDUnix 下最受欢迎的用于图形交互界面(GUI)设计的工具包之一。
时至今日大多数的 Linux 下的 GUI 软件(有图形交互界面)都是由 GTK或者 QT 来编写的。
GTK是一种面向对象式的APIapplicationprogramming interface。
Glib 是 GTK的基础,而这种“面向对象系统”正是由“Glib”来提供的。
GObject 也就是这种面向对象的机制可以为 GTK绑定很多种开发语言。
目前存在的语言有:C Python Perl Java C,
PHP等其他高级语言。
GTK 和以下“函数库”存在着依赖关系 Glib Pango ATK GDK GdkPixbuf CairoGlib 是一种通用的函数库。
她提供了各种各样的语言特性,譬如说:各种数据类型,字符串函数,错误通知,消息队列和线程。
Pango 是一种函数库,用来实现国际化和本地化的功能。
ATK一种平易近人的工具函数包,她提供了快捷键服务为肢体有缺陷的人使用电脑提供了便利。
GDK 是一种函数库,她为整个 GTK图形库系统提供了一些底层的“图形实现”和“窗口实现”的方法。
在 Linux 中 GDK 是位于 X 服务器和 GTK函数库之间的。
在最近的 GTK发行版本中,越来越多的功能性函数,都交给了 Cairo 函数库来处理。
GdkPixbuf 函数库是一种函数库工具包用于加载图像和维护图像“缓存”的(pixel buffer)。
Cairo 是一种函数库用于制作二维图像。
从 GTK2.8 版本以后,Cairo 就正式成为 GTK系统中的一员了。
Gnome and XFce 桌面环境系统都是用 GTK来编程实现的. SWT and wxWidgets 是种很著名的编程框架也是用 GTK来编程实现的。
最杰出的 GTK软件的代表是 Firefox (火狐浏览器)和 Inkscape。
编译 GTK 应用程序有一个非常方便的工具--quotpkg-configquot可以帮助我们编译 GTK的应用程序。
pgk-config 可以提供各种安装函数库(譬如 GDKPango 等)的位置。
简单点说就是我们如果想使用某种函数库,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 ltgtk/gtk.hgtint main int argc char argv GtkWidget window gtk_initampargc ampargv window gtk_window_newGTK_WINDOW_TOPLEVEL gtk_widget_showwindow gtk_main return 0这个例子就是为我们显示了一个空白的窗口。
gcc -o simple simple.c pkg-config --libs --cflags gtk-2.0这就是我们用来编译这个例子的命令。
下面我们将对这个简单的程序进行详细的解读。
gtk_initampargc ampargv这就是在初始化整个 GTK程序,是每一个 GTK程序必不可少的部分。
window gtk_window_newGTK_WINDOW_TOPLEVEL这里我们首先生成了一个构件—— GtkWindow. 这个窗口构件的种类是GTK_WINDOW_TOPLEVEL. . Toplevel 窗口拥有一个标题栏和边框。
他们同意由窗口管理器进行管理。
gtk_widget_showwindow在我们生成了一个窗口构件以后,必不可少的是,我们需要用这句语句来显示构件。
gtk_main这句代码语句将进入“主循环”。
在这一点上,GTK程序将安静的等待“事件”event的发生,以便做出相应的反应。
Figure: Simple生成一个窗口如果我们不安排窗口的摆放位置的话,那么窗口管理器将为我们给这个窗口“安一个家”。
在下个例子中,我们将走进“窗口”。
include ltgtk/gtk.hgtint main int argc char argv GtkWidget window gtk_initampargc ampargv window gtk_window_newGTK_WINDOW_TOPLEVEL gtk_window_set_titleGTK_WINDOWwindow quotCenterquot gtk_window_set_default_sizeGTK_WINDOWwindow 230 150 gtk_window_set_positionGTK_WINDOWwindow GTK_WIN_POS_CENTER gtk_widget_showwindow g_signal_connect_swappedG_OBJECTwindow quotdestroyquotG_CALLBACKgtk_main_quit NULL gtk_main return 0在我们上面的这个例子,我将深入了解窗口构件(window widget),为窗口构件设置标题和大小。
gtk_window_set_titleGTK_WINDOWwindow quotCenterquotgtk_window_set_title 这个函数就可以为 window 设置一个标题,如果我们不用这个函数的话,GTK将用源文件的名字来作为窗口的标题。
gtk_window_set_default_sizeGTK_WINDOWwindow 230 150上面这个代码片段为 window 设置了 230x150 像素的大小。
值得注意的是,我们这里提到的大小是指主窗口的大小;而不包括窗口管理器提供的修饰或者装饰的部分。
gtk_window_set_positionGTK_WINDOWwindow GTK_WIN_POS_CENTER这段代码把窗口设定在显示器的中央。
g_signal_connect_swappedG_OBJECTwindowquotdestroyquotG_CALLBACKgtk_main_quit NULL在之前的例子中,我们没有设置窗口的关闭,当我按下右上角的“X”时。
我们可以看到,如果是从命令行的方式来运行例子程序的话,默认情况下窗口程序并不会对你刚刚的动作作出反应 (当然,最新的窗口管理器,譬如 X11 会强行关闭)。
我们必须要明确为这个例子程序连接上一个关闭的信号(the destroy signal),就是 gtk_main_quit 这个函数。
应用程序图标的制作在下面的例子中,我们会进行应用程序图标的制作。
大多数的窗口管理器都会把图标放置在标题栏的左上方和任务栏上。
include ltgtk/gtk.hgtGdkPixbuf create_pixbufconst gchar filename GdkPixbuf pixbuf GError error NULL pixbuf gdk_pixbuf_new_from_filefilename amperror ifpixbuf fprintfstderr quotsnquot error-gtmessage g_error_freeerror return pixbufint main int argc char argv GtkWidget window gtk_initampargc ampargv window gtk_window_newGTK_WINDOW_TOPLEVEL gtk_window_set_titleGTK_WINDOWwindow quoticonquot gtk_window_set_default_sizeGTK_WINDOWwindow 230 150 gtk_window_set_positionGTK_WINDOWwindow GTK_WIN_POS_CENTER gtk_window_set_iconGTK_WINDOWwindow create_pixbufquotweb.pngquot gtk_widget_showwindow g_signal_connect_swappedG_OBJECTwindowquotdestroyquotG_CALLBACKgtk_main_quit NULL gtk_main return 0上面的就是为一个填加上图标的窗口程序了. gtk_window_set_iconGTK_WINDOWwindow create_pixbufquotweb.pngquot函数 gtk_window_set_icon 是为窗口设置图标用的。
函数 create_pixbuf 作用是从一个 png 图象文件中生成 GdkPixbuf 类型数据。
pixbuf gdk_pixbuf_new_from_filefilename amperror根据官方公布的文档说明,函数 gdk_pixbuf_new_from_file 一个文件中加载图象数据,从而生成一个新的 pixbuf。
至于文件中包含图象的格式,是由系统自动检测的。
如果该函数返回值是 NULL 的话,程序就会出现错误。
Figure: Icon增加 和 减少下面我们将用一个简单的示例,来完成了“GTK程序设计初级教程”的第一阶段,在这里我们用到了三个构件:两个按钮和一个标签。
这个标签将保存一个整数,两个按钮会分别增加和减少这个数。
include ltgtk/gtk.hgtgint count 0char buf5void increaseGtkWidget widget gpointer label count sprintfbuf quotdquot count gtk_label_set_textlabel bufvoid decreaseGtkWidget widget gpointer label count-- sprintfbuf quotdquot count gtk_label_set_textlabel bufint mainint argc char argv GtkWidget label GtkWidget window GtkWidget frame GtkWidget plus GtkWidget minus gtk_initampargc ampargv window gtk_window_newGTK_WINDOW_TOPLEVEL gtk_window_set_positionGTK_WINDOWwindow GTK_WIN_POS_CENTER gtk_window_set_default_sizeGTK_WINDOWwindow 250 180 gtk_window_set_titleGTK_WINDOWwindow quot-quot frame gtk_fixed_new gtk_container_addGTK_CONTAINERwindow frame plus gtk_button_new_with_labelquotquot gtk_widget_set_size_requestplus 80 35 gtk_fixed_putGTK_FIXEDframe plus 50 20 minus gtk_button_new_with_labelquot-quot gtk_widget_set_size_requestminus 80 35 gtk_fixed_putGTK_FIXEDframe minus 50 80 label gtk_label_newquot0quot gtk_fixed_putGTK_FIXEDframe label 190 58 gtk_widget_show_allwindow g_signal_connectwindow quotdestroyquot G_CALLBACK gtk_main_quitNULL g_signal_connectplus quotclickedquot G_CALLBACKincrease label g_signal_connectminus quotclickedquot G_CALLBACKdecrease label gtk_main return 0这个示例代码完的功能是:增加和减少对象 GtkLabel 的值。
g_signal_connectplus quotclickedquot G_CALLBACKincrease label我们把回调函数 increase和增加按钮进行了连结。
还有值得注意的是我们把 label 作为回调函数调用的参数。
这样的话就可以在回调函数 increase中对 label 进行处理。
count sprintfbuf quotdquot count gtk_label_set_textlabel buf在“增加”的回调函数中,增加数字。
然后在 label 中的数字就会随之增加。
Figure: Increase - Decrease“菜单” (menubar)和“工具栏”(toolbars)在这个部分的 GTK程序设计教程中,我们使用“菜单”和“工具栏”。
“菜单”( menubar) 是 GUI 程序中最为常见的部分之一。
各种各样的命令和功能都可以借以“菜单”来实现。
当我们习惯在终端(console)中启动应用程序的时候,必须要记得很多复杂的命令和参数 , 在本章节中我们将 这一切都转化为可见的操作。
菜单和工具栏中标准化的操作,将让你摆脱学习新软件所耗费的大量时间和精力。
简单的菜单示列在我们的第一个例子中,我们将生成一个含有文件菜单的菜单栏。
文件菜单将只有一个菜单条(menu item)。
如果点击这个菜单条程序将退出。
include ltgtk/gtk.hgtint main int argc char argv GtkWidget window GtkWidget vbox GtkWidget menubar GtkWidget filemenu GtkWidget file GtkWidget quit gtk_initampargc ampargv window gtk_window_newGTK_WINDOW_TOPLEVEL gtk_window_set_positionGTK_WINDOWwindow GTK_WIN_POS_CENTER gtk_window_set_default_sizeGTK_WINDOWwindow 250 200 gtk_window_set_titleGTK_WINDOWwindow quotmenuquot vbox gtk_vbox_newFALSE 0 gtk_container_addGTK_CONTAINERwindow vbox menubar gtk_menu_bar_new filemenu gtk_menu_new file gtk_menu_item_new_with_labelquotFilequot quit gtk_menu_item_new_with_labelquotQuitquot gtk_menu_item_set_submenuGTK_MENU_ITEMfile filemenu gtk_menu_shell_appendGTK_MENU_SHELLfilemenu quit gtk_menu_shell_appendGTK_MENU_SHELLmenubar file gtk_box_pack_startGTK_BOXvbox menubar FALSE FALSE 3 g_signal_connect_swappedG_OBJECTwindowquotdestroyquotG_CALLBACKgtk_main_quit NULL g_signal_connectG_OBJECTquitquotactivatequotG_CALLBACKgtk_main_quit NULL gtk_widget_show_allwindow gtk_main return 0生成一个菜单栏的确会让人有点疑惑。
我们要牢记的是一个菜单栏和一个菜单都是源属于同一个构件的,也就是菜单外壳(menu shell)。
菜单选项(menu items )是一个只对菜单有效的子构件。
他们通常用来实现子菜单。
menubar gtk_menu_bar_new filemenu gtk_menu_new在上面的代码中我们生成了一个菜单栏构件(menubar)和一个菜单构件menu。
gtk_menu_item_set_submenuGTK_MENU_ITEMfile filemenu上面的代码就会生成一个名为“文件”的菜单。
这也就是说其实菜单栏就是一个菜单外壳。
很显然这里的文件菜单也是一个菜单外壳。
这就是为什么我们把文件菜单称为子菜单或者说是一个子外壳。
gtk_menu_shell_appendGTK_MENU_SHELLfilemenu quit gtk_menu_shell_appendGTK_MENU_SHELLmenubar file菜单选项由函数 gtk_menu_shell_append f 来实现。
然后一般情况下菜单选项被填加进菜单外壳里。
在我们的这个例子中,“quit”菜单选项是被填加进“file”菜单栏里,然后类似的是“file”菜单选项被填加进菜单中(menubar)。
g_signal_connectG_OBJECTquitquotactivatequotG_CALLBACKgtk_main_quitNULL当你单击“quit”菜单按钮,程序就会退出。
Figure: Simple menu图象菜单 mnemonics ampaccelerators在接下来的这个例子中,我们将更进一步的去探索,在 GTK系统中我们可以应用的功能。
Accelerators 是快捷键的意思,用来方便的用键盘上的组合键激活一个菜单选项。
Mnemonics 也是是快捷键用于用于 GUI 的基础。
他们的具体表现都为带有下画线的字符。
(译者:似乎说的不清楚啊,呵呵。
具体的区别还是请参见下面的具体代码实现以及对应的程序效果图)include ltgtk/gtk.hgtinclude ltgdk/gdkkeysyms.hgtint main int argc char argv GtkWidget window GtkWidget vbox GtkWidget menubar GtkWidget filemenu GtkWidget file GtkWidget newGtkWidget openGtkWidget quitGtkWidget sepGtkAccelGroup accel_group NULLgtk_initampargc ampargvwindow gtk_window_newGTK_WINDOW_TOPLEVELgtk_window_set_positionGTK_WINDOWwindow GTK_WIN_POS_CENTERgtk_window_set_default_sizeGTK_WINDOWwindow 250 200gtk_window_set_titleGTK_WINDOWwindow quotmenuquotvbox gtk_vbox_newFALSE 0gtk_container_addGTK_CONTAINERwindow vboxmenubar gtk_menu_bar_newfilemenu gtk_menu_newaccel_group gtk_accel_group_newgtk_window_add_accel_groupGTK_WINDOWwindow accel_groupfile gtk_menu_item_new_with_mnemonicquot_Filequotnew gtk_image_menu_item_new_from_stockGTK_STOCK_NEW NULLopen gtk_image_menu_item_new_from_stockGTK_STOCK_OPEN NULLsep gtk_separator_menu_item_new quit gtk_image_menu_item_new_from_stockGTK_STOCK_QUITaccel_group gtk_widget_add_acceleratorquit quotactivatequot accel_group GDK_qGDK_CONTROL_MASK GTK_ACCEL_VISIBLE gtk_menu_item_set_submenuGTK_MENU_ITEMfile filemenu gtk_menu_shell_appendGTK_MENU_SHELLfilemenu new gtk_menu_shell_appendGTK_MENU_SHELLfilemenu open gtk_menu_shell_appendGTK_MENU_SHELLfilemenu sep gtk_menu_shell_appendGTK_MENU_SHELLfilemenu quit gtk_menu_shell_appendGTK_MENU_SHELLmenubar file gtk_box_pack_startGTK_BOXvbox menubar FALSE FALSE 3 g_signal_connect_swappedG_OBJECTwindowquotdestroyquotG_CALLBACKgtk_main_quit NULL g_signal_connectG_OBJECTquitquotactivatequotG_CALLBACKgtk_main_quit NULL gtk_widget_show_allwindow gtk_main return 0在上面的整个代码程序中,向大家展示了是如何向一个菜单选项中去填加一个图象的。
当然也包括了如何使用 accelerator 以及 mnemonics 。
accel_group gtk_accel_group_new gtk_window_add_accel_groupGTK_WINDOWwindow accel_group ... quit gtk_image_menu_item_new_from_stockGTK_STOCK_QUITaccel_group gtk_widget_add_acceleratorquit quotactivatequot accel_group GDK_qGDK_CONTROL_MASK GTK_ACCEL_VISIBLE一个 accelerator 组有好多个 accelerators 快捷键。
这里我们生成了一个“Ctrl q”accelerators 快捷键。
file gtk_menu_item_new_with_mnemonicquot_Filequot我们需要调用函数 gtk_menu_item_new_with_mnemonic 来生成一个mnemonic 快捷键。
你可以按下键盘上的“ Alt F”就可以看到. mnemonic 快捷键的效果。
new gtk_image_menu_item_new_from_stockGTK_STOCK_NEW NULL open gtk_image_menu_item_new_from_stockGTK_STOCK_OPEN NULL在上面的代码中我们生成了两个带有图象的菜单选项。
在所调用的函数的第二个参数中,我们设置为 NULL,这样达到的效果是我们自动生成了 accelerators 快捷键。
我们也为菜单选项分别提供了图象与文字。
sep gtk_separator_menu_item_new菜单选项能够被一个水平的分割线隔开。
这样的话我们就可以从逻辑上把一些菜单选项给区分开来。
Figure: Menu example选择(Check)菜单选项 (menu item)GtkCheckMenuItem 便是一个可以生成带有选择的菜单选项。
include ltgtk/gtk.hgtvoid toggle_statusbarGtkWidget widget gpointer statusbar if gtk_check_menu_item_get_activeGTK_CHECK_MENU_ITEMwidget gtk_widget_showstatusbar else gtk_widget_hidestatusbar int main int argc char argv GtkWidget window GtkWidget vbox GtkWidget menubar GtkWidget viewmenu GtkWidget view GtkWidget tog_stat GtkWidget statusbar gtk_initampargc ampargv window gtk_window_newGTK_WINDOW_TOPLEVEL gtk_window_set_positionGTK_WINDOWwindow GTK_WIN_POS_CENTER gtk_window_set_default_sizeGTK_WINDOWwindow 250 200 gtk_window_set_titleGTK_WINDOWwindow quotview statusbarquot vbox gtk_vbox_newFALSE 0 gtk_container_addGTK_CONTAINERwindow vbox menubar gtk_menu_bar_new viewmenu gtk_menu_new .