^^
大家一起用gtk编程1(开始与热身)
转载请注明出处: http://lvjinhua.cublog.cn
作者:lvjinhua at gmail dot com
2006.09.20
- 写在最前面
笔者将尽力保证所有的代码都是最短小的,这样才能保证大家都有足够的动力去手工输入它。
由于笔者时间及精力有限,不能一次将所有内容呈现给所有读者,因此拟定了一个计划:每天更新一个章节的内容,在笔者的Blog上进行连载,同时会不断地对以前的内容进行修改和完善,因此为了保证大家能够读到最新的内容,请随时关注笔者的Blog: http://lvjinhua.cublog.cn
起笔的日子:2006.09.20
- 为什么是GTK?
- 1、GTK简介
GTK 的创建者:
Peter Mattis: petm@xcf.berkeley.edu
Spencer Kimball: spencer@xcf.berkeley.edu
Josh MacDonald: jmacd@xcf.berkeley.edu
当前,GTK主要由几大组件构成: *Gtk+:GTK的主要构件,包括所有的图形控件及大量实用的API。 *Glib:包含一些标准函数的替代函数,以及一些处理链表等数据结构的函数等。这些替代函数被用来增强GTK 的可移植性,同时提供 libc 的对应函数的增强版本。 *Pango:该组件用来处理国际化文字输出。 |
- 2、预备
1)GTK是跨平台的,它能够运行于Linux/Unix/Windows/MacOS及嵌入式系统,但这不是本文所关注的重点;实际上,只要按照GTK所提供的API去编程,基本上在一个平台上设计的程序,在其它平台可以不加任何修改而成功地进行编译。
笔者使用的操作系统是: Dubuntu-6.06, 本文中所有的示例代码将在该平台上进行开发并编译运行;当然,这并不代表不能使用其它操作系统,只要安装了GCC编译环境、GTK/Glib/Libc开 发库,基本上就能成功地编译运行本文中的所有示例,现就Ubuntu Dapper 发行版GTK开发环境安装方法简述如下:
sudo apt-get install vim #是的,笔者使用vim来编写代码,当然您可以使用任何自己喜欢的编辑器 sudo apt-get install build-essential #这将安装 gcc/g++/gdb/make 等基本编程工具 sudo apt-get install gnome-core-devel #这将安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件 sudo apt-get install pkg-config #用于在编译GTK程序时自动找出头文件及库文件位置 sudo apt-get install devhelp #这将安装 devhelp GTK文档查看程序 sudo apt-get install libglib2.0-doc libgtk2.0-doc #这将安装 gtk/glib 的API参考手册及其它帮助文档 sudo apt-get instal glade libglade2-dev #这将安装基于GTK的界面构造程序 |
当然,其它的 Linux 发行版可参考相应的文档进行开发环境的搭建,各大Linux论坛是个不错的咨询地: www.linuxsir.org , www.linuxfans.org
如果有热心的同仁能提供其它操作系统 GTK 开发库的安装方法,欢迎提供给我笔者,笔者将在这里分享给大家!先行谢过了。
1. 从
http://www.gimp.org/~tml/gimp/win32/downloads.html
下载以下文件:
|
- 3、Hello,Dubuntu!
本程序的主要功能: 显示一个窗口,并在窗口的标题栏显示字符串"Hello, Dubuntu!"
源代码如下所示,编译成功后,可以通过命令行输入 ./hello_dubuntu 来运行此程序,显示效果如下:
![](http://www.dubuntu.com/pub/gtk/hello_dubuntu.png)
hello_dubuntu.c |
#include<gtk/gtk.h> /* 一般可以在 /usr/include/gtk-2.0 下找到上边的头文件 * 上边的头文件的作用是包含进行GTK编程所有可能用到的头 * 文件,包括glib.h等 */ int main(int argc, char *argv[]) { GtkWidget *window; // GtkWidget 是绝大部分可视组件的的基类 gtk_init(&argc, &argv); //对程序传入的命令行参数进行标准化处理 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //创建窗口(200x200大小) gtk_window_set_title(GTK_WINDOW(window), "Hello,Dubuntu!"); //设置窗口标题 gtk_widget_show(window); //显示窗口 gtk_main(); //Gtk程序主循环 return 0; } |
编译程序: gcc hello_dubuntu.c -o hello_dubuntu `pkg-config --cflags --libs gtk+-2.0` # 注意:"`" 不是普通的单引号 "'",而是同"~"在一起的那个符号! |
是的,上边的程序非常简单,除了注释就没几条语句了!但它确实是一个GTK程序,虽然它还不够完善,缺少信号处理,因此当您单击“关闭”按钮关闭此窗口后,实际上程序还在运行。
1) 编译程序的命令行:
如上,使用GNU C语言编译器 gcc , 其中 pkg-config --cflags --libs gtk+-2.0 用于生成 gcc 编译及链接程序时所必须的头文件及库文件列表,在笔者的机器上运行该命令得到的结果如下:
命令: pkg-config --cflags --libs 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 -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 |
2) 大家如果对某个GTK标准API定义,或者某个类型/常量定义不清楚,可以在 devhelp 帮助程序中进行搜索,以查看某参数说明。
3) gtk_init(&argc, &argv) 函数用于对传入进来的标准命令行参数进行解析并处理,这些标准命令行参数为(即:运行我们的程序时,通过命令行传入的下列参数会被自动处理):
- --gtk-module
- --g-fatal-warnings
- --gtk-debug
- --gtk-no-debug
- --gdk-debug
- --gdk-no-debug
- --display
- --sync
- --name
- --class
5) gtk_main() ,程序将会运行到此,然后等待“事件”的发生;当有事件发生后,将调用此事件对应的回调函数,当回调函数执行完毕,又会重新回到 gtk_main() ,等待新的“事件”发生。
6) 宏 GTK_WINDOW(window) 是用于进行类型检查及转换,它将把一个可以转化为 GtkWindow 的构件强制转换为GtkWindow 类型后传递给函数。
好了,hello_dubuntu.c 理解了吗? 什么!没有理解! 不要紧,我们下边还会有很多这样的小例子,再多输入几个就会理解了,相信我!
下集预告:将在窗口中添加一个按钮,并为按钮关联"clicked"事件,以使单击按钮后会有一些返回。