用Gtk+开发Linux上的GUI应用软件

豆豆网   技术应用频道   2007年11月30日  【字号: 收藏本文

内容摘要:一般一个容器构件只能容纳一个构件,如果要在一个容器构件中安排多个子构件,可先将多个子构件放入一个组合框或组合表构件内,再将这个组合框或组合表构件放入该容器构件。

   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程序员来说是入门的一课,深入的应用和开发技巧需要读者在今后不断的实践中获得。

责编:豆豆技术应用

正在加载评论...