选择显示字体大小

用gtk+开发linux上的gui应用软件

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

   一、如何建立gtk+应用
   1.基本概念

   在linux上开发gui应用软件,我们通常利用gtk+库。为了深入了解gtk+的应用,我们首先要明确几个概念。

   (1) 构件(widget)的概念

   在gtk+库里的窗口、选单和按钮等应用实体,我们称之为构件(widget)。构件具有面向对象的特征,其具体结构由gtk+库定义,它对运用构件的程序员来说是透明的,除非你想创建自己的构件。在对构件进行安排时,我们只需要关心构件的处理函数,这样做的目的就是要对应用程序员屏蔽构件的细节,使程序员将更多的精力集中在应用功能上。

   (2) 容器(container)的概念

   构件主要分为两大类,即容器类(container)和杂类(miscellaneous)。大多数构件属容器类,它们可以像容器一样容纳其它的构件。在安排构件时常常要遵循一个规则:除了组合框(box)和组合表(table)这两种构件外,其它的容器类构件都只能容纳一个构件。杂类构件比容器类构件简单,但它不能容纳其它构件。

   (3) 消息及回呼函数的概念

   程序必须能对用户的操作作出反应,在基于gui的程序设计中,“消息”或“信号”是必要的。用户点击选单、各种按钮、输入用户数据、查询运行结果和拖放,都会产生消息或信号。信号可能需要由软件来加以处理,这时程序员就需要编写消息回呼函数。消息或信号的概念类似于windows中的事件。在gtk+中经常产生各种信号,用户产生的大多数信号被忽略,只有程序关心的信号,程序中才有相应的处理函数被调用。程序员要登记信号与处理函数之间的关系,告诉gtk+哪些信号或事件是程序所关心的。

   2. 构件(widget)的运用

   在调用gtk+的构件时,一般进行如下操作步骤:

   (1) 包含所调用构件的头文件

   头文件通常存放在/usr/include/gtk/目录下,该文件里有对构件的定义及对构件的操作函数,在我们使用构件时,可以经常在这个目录下查阅构件函数的调用格式或参数。我们不必让所有构件包含头文件,因为构件的头文件已包含在该目录下一个名为gtk.h的文件里,包含这个文件就包含了所有构件的头文件。一般系统将编译的包含目录指定为/usr/include,所以我们只需写明 include 即可。

   (2) 声明构件

   声明构件的过程是为了符合c语言中先声明后使用的原则。一般在程序开始要声明构件结构的指针,这就为构件分配了地址。

   (3) 构件指针的初始化

   调用构件的创建函数,对构件的属性进行调整(大小、位置和状态等),接着显示构件,这一点不能忽略,如果只创建了构件却忘了显示(gtk_widget_show),在应用时,用户就不能看到构件,也就无法对构件进行操作了。

   (4) 安排构件的位置与层次关系

   构件之间往往是容纳与被容纳的关系,也就是说容器内还有容器,层层嵌套。要记住一般一个容器构件只能容纳一个构件,如果要在一个容器构件中安排多个子构件,可先将多个子构件放入一个组合框或组合表构件内,再将这个组合框或组合表构件放入该容器构件。注意父容器构件要先于子容器构件创建,父容器构件的显示要在子容器构件的显示之后。

   (5) 编写事件处理函数

   构件的头文件中定义了构件能响应的事件(消息),但并非所有的消息在应用中都是程序所关心的,对于程序应当响应的事件,程序员要写出事件处理函数。

   二、应用举例
   为了对gtk+库的应用有一个具体的认识,让我们来看一个简单的应用实例。

   1. 初始化gtk+

   写gtk+程序需要调用gtk_init函数对gtk+库进行初始化。我们首先将应用程序的变量argc和argv传递给gtk_init函数,并检查主要用于调试的gtk+选项。如果在变量列表中出现任何这样的gtk+参数,就将它移去。在运行gtk_init函数后,它们不应该出现在应用程序中。初始化gtk+的代码如下:

   gtk_init(&&argc,&&argv);

   2. 建立构件

   首先要建立的构件是窗口,它是应用程序的顶层构件,其它构件一般安排在顶层窗口中。窗口是gui程序的基本框架,在窗口里我们可以为用户安排各种方便的应用。一个应用可以有若干个窗口,这些窗口之间既相互独立,又有层次的关系。窗口有相对固定的风格,前景色、背景色、字体和字号等,我们应当保持定制的风格,确保不使应用软件杂乱。

   按照上面提出的构件运用步骤,我们创建一个程序主窗口:

   /声明构件指针/

   gtkwidget window;

   /创建窗口,初始化窗口指针,建立一个顶层窗口/

   window=gtk_window_new(gtk_window_toplevel);

   /显示构件/

   gtk_widget_show(window);

   /登记消息与消息处理函数的关系/

   gtk_signal_connect(gtk_object(window),"delete_event",gtk_signal_func(close_window),null);

   3. 构件类型的转换

   由于建立的构件是通用构件,需要将它转换为具体的类型以适合调用更为专用的函数。比如建立按钮构件函数会返回gtkwidget 指针,但是专用的按钮子程序要求返回gtkbutton指针,所以在调用专用的按钮函数以前,需要使用gtk_button宏将通用的gtkwidget指针转换为gtkbutton指针。通常,构件是由其它构件派生的,窗口构件(gtkwindow)是由容器构件gtkcontainer派生的,而容器构件是由通用构件派生的。在gtk+中可以将构件指针转换为其父类、祖先类构件的任意类型,然后再调用父类或祖先类构件的函数。

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


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons