内容摘要:一般一个容器构件只能容纳一个构件,如果要在一个容器构件中安排多个子构件,可先将多个子构件放入一个组合框或组合表构件内,再将这个组合框或组合表构件放入该容器构件。
4. Gtk+的事件循环
对Gtk+进行初始化并将窗口等构件安排在屏幕上之后,应用软件需要使用Gtk+开始执行事件的循环函数gtk_main(),没有这个函数,应用程序运行时就会一闪即逝。但是在调用gtk_main_quit()函数之前对gtk_main()函数的调用并不返回,也就是说只有gtk_main_quit()函数才能停止Gtk+的执行,从而最终退出应用程序。我们把gtk_main_quit()函数放在消息处理函数close_window()之中,这样,当用户点击了窗口的关闭按钮,Gtk+收到“delelte_event”消息,然后调用close_window(),执行gtk_main_quit()函数,整个程序即可退出。
5. 实例源代码
现在创建一个显示“hello”字样的简单窗口程序。整个程序实现代码如下:
//hello.c
include
/关闭主窗口中的消息处理函数/
close_window(GtkWidget window,gpointer data)
{
/中止gtk事件循环/
gtk_main_quit();
}
/主函数/
main(int argc,char argv)
{/声明窗口和标签两个构件/
GtkWidget window;
GtkWidget label;
/初始化Gtk+库/
gtk_init(&&argc,&&argv);
/初始化window构件/
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
/初始化label构件/
label=gtk_label_new("hello!");
/将标签放入窗口内,函数内用GTK_CONTAINER宏将窗口构/
/件的指针类型转换为其父类容器构件的指针类型/
gtk_container_add(GTK_CONTAINER(window),label);
/显示label构件/
gtk_widget_show(label);
/显示window构件/
gtk_widget_show(window);
/当窗口获得'delete_event'消息时调用close_windw函数/
gtk_signal_connect(GTK_OBJECT(window),"delete_event",
GTK_SIGNAL_FUNC(close_window),NULL);
/gtk事件循环/
gtk_main();
}6. 编译源代码及运行程序
最后谈一下Gtk+在程序编译和运行时有哪些特别之处。在Linux系统下的C编译器,如gcc,要求编译时在编译命令后加上各种参数,如果参数太复杂,最好把命令写入makefile文件。
前面我们讲过在应用程序文件中用到Gtk+函数或定义的每一部分必须包含gtk/gtk.h文件,它是Gtk+的主要包含文件。此外,还必须连接若干库。Gtk+的开发人员为我们提供了方便。使用gtk-config程序可以简化这些工作。编译hello.c源文件成为可执行文件hello的命令如下:
gcc hello.c -o hello `gtk-config -cflags``gtk-config -libs`注意,程序中一定是反引号(在键盘上位于字符1的左边)。`gtk-config`实际运行了gtk-config程序;参数-cflags输出编译标志,并将它们插入命令行;参数-libs输出连接标志并插入命令行。在Gtk+ 1.2以上版本中包含gtk-config程序。在Linux的命令行提示符后敲入`gtk-config -cflags`和`gtk-config -libs`表示给gcc 传递参数的正确方法。
用shell命令“chmod -777 hello”将文件hello设定为所有用户都可执行的文件,再用shell命令“./hello”执行这个文件。
三、小结
本文仅提供了对Gtk+库应用的基本思路,对于想利用Gtk+开发Linux应用的C程序员来说是入门的一课,深入的应用和开发技巧需要读者在今后不断的实践中获得。
责编:豆豆技术应用