GTK基本概念小结

基本概念:
GTK(GIMP Toolkit)是一套用于创建图形用户界面的工具包。
GTK 实质上是一个面向对象的应用程序接口 (API)。尽管完全用 C 写成的,但它是基于类和回调函数 (指向函数的指针) 的思想实现的。
几个注意点:
1、GTK是一个事件驱动的工具包,意味着它会等在gtk_main()那里,直到下一个事件发生,才把控制权传给适当的函数。

2、控制权的传递时使用“信号”的办法来完成。当一个事件发生时,如按一下鼠标键,所按的构件会“发出”适当的信号。这就是GTK的工作机制。
例如:
所有构件都会继承的信号,如 信号“destroy”
如,构件专有信号,比如说开关(toggle)按钮发出的“toggled”信号。

3、要使一个按钮执行一个动作,我们需设置信号和信号处理函数之间的连接。
可以这样使用函数来设置连接:
g_ signal_ connect (gpointer *object, constgchar *name, GCallbackfunc, gpointerfanc_data)
//第一个参数:要发出信号的构件。第二个参数:你想要连接的信号的名称
//第三个参数:信号被捕获时所要调用的函数。第四个参数:你想传递给这个函数的数据。

4、第三个参数所指定的函数即为:回调函数。
其形式一般为:
void callback_ func (GtkWidget *widget,gpointercallback_data);
//第一个参数:一个指向发出信号的构件的指针。
//第二个参数:一个指向数据的指针,就是上面gulongg_signal_connect()函数的最后一个参数传进来的数据。
注意点:以上只是一般形式。有些构件的特殊信号会用不同的调用参数。

5、g_ signal_ connect_ swapped() 和 g_ signal_connect()相同,只是回调函数只用一个参数,一个指向GTK对象的指针(即*object)。
其形式为void callback_func(GtkWidget *object)
拥有两个函数来设置信号连接的目的只是为了允许回调函数有不同数目的参数。GTK库中许多函数仅接受一个单独的构件指针作为其参数,所以对于这些函数你要用g_ signal_ connect_swapped(),然而对你自己定义的函数,你可能需要附加的数据提供给你的回调函数

6、除前面的信号机制外,还有一套events反应X事件机制。回调函数可以与这些事件连接。

7、事件的回调函数
g_ callback_ func(GtkWidget *widget,GdkEvent *event,gpointercallback_data);
//GdkEvent是一个C联合结构,它的类型依赖于上述事件中的哪个事件发生了。

8、所以,连接一个回调函数到这些事件之一,我们可以这样用:
g_ signal_ connect (G_ OBJECT(button),”button_ press_event”,
G_ CALLBACK (button_ press_callback),NULL);
//这里假定button是一个按钮构件。现在,当鼠标位于按钮上并按一下鼠标时,函数button_ press_callback()会被调用。

9、你可以用以下函数从列表中删除这个回调:
void g_ signal_ handler_disconnect(gpointer object,gulong id);
所以,通过传递你想在上面删除处理函数的构件,以及某个signal_connect函数返回的标识,你就可以中断一个信号处理函数的连接。

10、gtk 的设计是面向对象的,一个构件是一个对象。

11、对于信号处理函数前的gulong,这是一个回调函数的标识。由于每个信号和对象可以有多个回调函数,因此可以通过标识来寻找。

12、组装构件:用于控制各个构件的定位。这就是组装(Packing)。
多数组装是通过一些“盒(boxes)”来达成,这是不可见的构件容器。
分为:横向盒(horizontal box)(依着我们调用的顺序由左至右或从右到左水平地插入进去)和纵向盒(vertical box)(从顶部到底部或相反地组装构件)
可以使用任意盒组合,嵌套盒等。

13、创建横向盒:gtk_hbox_new(),
纵:gtk_vbox_new()
gtk_box_pack_start():将对象从上到下组装到纵向盒中,或者从左到右组装到横向盒中。
gtk_box_pack_end():则相反
声明:void gtk_box_pack_start(
GtkBox *box, //你要把对象组装进去的盒
GtkWidget *child, //该对象
gboolean expand, //用来控制构件在盒中是充满所有多余空间这样盒会扩展到充满所有分配给它的空间(TURE);还是盒收缩到仅仅符合构件的大小(FALSE)。设置 expand 为 FALSE将允许你向左或向右对齐你的构件。否则,它们会在盒中展开。
gboolean fill, //fill 参数在 gtk_box_pack 中控制多余空间是分配给对象本身(TRUE),还是让多余空间围绕在这些对象周围分布(FALSE) 它只有在 expand 参数也为TRUE时,才会生效。
guint padding);

14、gtk会自动做调整大小和美化的事。

15、另一种组装方法:表(Tables)。
使用表时,我们建立格来放入构件,构件可以沾满我们指定的的所有空间。
GtkWidget *gtk_table_new(
guint rows,//表中行的数量
guint columns,//列的数量
gboolean homogeneous);//决定表格框的大小

16、容器(container):控件分成两种:一种是能容纳其他控件的容器,另一种是不能容纳其他控件的非容器控件。容器控件又分成能容纳多个控件的容器和只能容纳一个控件的容器。(窗口控件就是一种容器)

/点滴积累,我的一小步O(∩_∩)O~/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值