学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍

400 篇文章 3 订阅
147 篇文章 0 订阅

学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍

学习使用GTK+ 系列的第 3 篇 (本系列共6篇)

这一部分是对最简单的GTK+(C语言)程序的一个解释,并介绍GTK+的基本概念和运作方式。如果内容存在错误,或者方法不适用与你的电脑,请在下方评论区留言给我,谢谢!

几个概念

首先先来解释GTK+中几个基本的概念,以方便将来的分析。

物件(GtkWidget) :GTK+中每一个窗口里的组成要素都被视为一个物件,如按钮、文本等等,窗口本身也是一个物件。总之GTK+的界面就是由物件构成的。注意,物件都使用指针来管理,物件外在表现就是一个特定类型的指针。

容器(GtkContainer) :物件里的一大类,容器的特点是其内部能够容纳其他物件。容器最基本的功能之 一是将各种物件良好地组织起来。GTK+的容器能在大小改变时自动调整内含物件的大小,这使得GTK+能够很智能地相应窗口或其他物件的大小改变。这为我 们提供了很大的方便,往往我们不需要指定某个物件的大小,只需说明他所在的容器位置,GTK+会把物件的实际位置和大小自动计算出来(这比MFC强多 了!)。

继承、组合 :虽然是C语言写的,但GTK+灵活地运用了面向对象思想。GTK+的物件体系中就有继承、组合这样的关系,如窗口(GtkWindow)是由容器(GtkContainer)派生出来的。

类型转换宏 :C语言本身没有“继承”这个概念,那么,如果直接把派生的物件直接当做基物件使用,会出现一个编译 警告,即“隐式指针类型转换”,但不会出错。为了消除这个警告,需要做指针类型转换。一般情况下类型转换使用类型转换宏。类型转换宏内部会检查物件的继承 关系,确定能否进行转换,然后再做显式类型转换。

事件 (event):用户的操作,比如按下某个按钮或快捷键,被视为一个事件。

信号 (signal):GTK+是基于信号回调(signal-slot)机制的。信号捆绑了一个事件和一个函数,在用户触发这个事件时,这个函数会被调用一次。从这个角度来说,GTK+是基于物件的,即程序围绕物件属性、事件、方法进行。

主循环 (main loop):GTK+程序在一个主循环中运行。当一个事件被触发时,它将被插入队列中;在主循环中被触发的事件会被逐个处理(和这个事件绑定的函数被逐个 调用);没有事件被触发时,程序就处于等待状态,等待下一个事件被用户触发。直到退出主循环的函数被调用,GTK+程序才结束。

GTK+命名规范

GTK+拥有开源软件的很多特点,比如结构高度严谨,可读性甚好。现在介绍一下GTK+的关键字命名方式,以便阅读一段GTK+程序。

普通变量类型名 :全小写写法,以“g”开头,如“gint”。

物件类型名 :驼峰写法(首字母大写),以“Gtk”开头,形如“GtkWindow”。在GTK+内部,类型是向下面这样定义的(以GtkWindow为例)。

typedef
 _GtkWindow {
 ... }
 GtkWindow;

函数名 :小写夹下划线写法,以“gtk_”为前缀,形如“gtk_main()”。如果是针对某类物件的函数,则前缀中还有物件类型名,形如“gtk_window_new()”。

常数名 :大写夹下划线写法,以“GTK_”为前缀,形如“GTK_WINDOW_TOPLEVEL”。

类型转换宏 :大写夹下划线写法,以“GTK_”为前缀。一般来说,宏名字和类型名相仿,比如要把GtkWindow*类型的物件转换为GtkContainer*类型,就使用宏“GTK_CONTAINER()”。

GTK+的“Hello World”

下面这段程序是GTK+的Hello World,它创建一个普通窗口,里面只有一句“Hello, World”。在前文的基础上,可以分析一下这一段Hello World。

//下面来分析一下这其中每句话的含义,介绍如何初始化GTK+,使C语言程序在GTK+环境下运行。

 
#include <gtk/gtk.h> //包含gtk库
 
int main ( int argc, char * argv[ ] )
{
GtkWidget * window;
GtkWidget * label; //定义两个物件指针,用于操作物件。
 
//这一句是所有GTK+程序必须的:初始化GTK+库。每个GTK+程序必须用这个来使GTK+做好准备。
gtk_init ( & argc, & argv) ;
 
//接下来这三句用于建立并设置一个窗口,几乎所有的GTK+程序都要新建窗口。
 
//建立一个新窗口,让window指向它。之后window就相当于这个窗口了。目前窗口中不包含任何物件。
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL) ;
 
//设置window标题为“Hello World”。
//这里使用了类型转换宏GTK_WINDOW()。因为这里函数参数需要是GtkWindow*型,而window在定义的时候是GtkWidget*型的。
gtk_window_set_title ( GTK_WINDOW ( window) , "Hello World" ) ;
 
//连接信号:将window的关闭(destroy)事件与退出主循环函数gtk_main_quit()绑定在一起,即窗口被关闭时程序结束。
//G_CALLBACK()也是一个类型转换宏,它把普通函数变成信号回调函数。
g_signal_connect ( window, "destroy" , G_CALLBACK ( gtk_main_quit) , NULL) ;
 
//接下来写入窗口内容。窗口只包含一个文本(GtkLabel)。
 
//新建一个GtkLabel,让label指向它。之后label就相当于这个文本了。
label = gtk_label_new ( "Hello, World" ) ;
 
//把label插入母容器中。把window转换为容器(这是允许的,因为GtkWindow由GtkContainer派生),然后插入label。
gtk_container_add ( GTK_CONTAINER ( window) , label) ;
 
//接下来这两句也是所有GTK+程序必须的。
 
//显示所有物件。物件新建好后是隐藏的,用这个函数来显示window及它包含的内容。
gtk_widget_show_all ( window) ;
 
//进入主循环,开始接受用户操作并处理各种事件。
gtk_main ( ) ;
 
return 0 ;
}

程序内容很简洁,它只处理一个事件:关闭窗口。但是这个程序已经摆出了GTK+程序主函数编写的基本形式:使用gtk_init()初始化;建立窗 口、组织窗口内容并连接信号;显示窗口;进入主循环。此外,编写回调函数并动态修改窗口内容通常也是必须的。基本所有GTK+程序都遵循这个规律。

可以想见的是,建立窗口、组织窗口内容是非常麻烦的事情。于是界面设计器应运而生,使得组织界面的工作不再由代码完成。下一部分内容会介绍使用界面设计器Glade的方法。

另外,有关GTK+物件、函数、常数的说明都可以在GTK+参考中找到。记得收藏GTK+参考的网址http://library.gnome.org/devel/gtk/stable/index.html ,将来查找函数就靠它了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值