1 构件的实现、映射
从GtkWidget中继承的类称为构件,构件分为“有窗口构件”和“无窗口构件”两种。有窗口构件有一个与之相关联的GdkWindow,而无窗口构件没有,它们将被绘制在有窗口构件的窗口上。在构件中,只有窗口构件才能接收和处理事件。如果要处理无窗口构件所产生的事件,则必须将它们放到GtkEventBox中,通过从GtkEventBox中接收事件来实现。
构件要经过一系列与它们的GdkWindow相关的状态:
- 如果一个构件相应的GdkWindow被创建出来,则称为该构件被实现(realize)
- 构件只有在被实现后,它才对应一个窗口,构件的widget->window属性值才不等于NULL
- gtk_widget_realize函数可以用来实现一个构件。gtk_widget_unrealize函数则用来“取消对构件”的实现。当构件被实现时,如果它有父窗口,则其父窗口必须首先被实现。
- 如果在构件的GdkWindow上调用了gdk_window_show函数,则称该构件被映射了,这时该构件将在屏幕上被显示出来。要映射一个窗口,则该窗口必须首先被实现。
- gtk_widget_show:当一个构件调用了gtk_widget_show函数时,该构件将在顶层容器调用gtk_widget_show后被实现和映射(构件被实现和映射后就将显示在屏幕上)。 因而,一般情况下,应该最后对最高级别的构件 GtkWindow调用gtk_widget_show( )函数。否则,如果先显示高级别的构件,用户可能会看到窗口先出现在屏幕上,然后子构件一个一个显示在屏幕上。
- 顶层容器一旦调用了gtk_widget_show则该顶层容器就立刻被实现(realize)和映射(map)了,即:顶层容器在调用gtk_widget_show后会立刻被显示在屏幕上。
2 构件的显示
- gtk_widget_show:当一个构件调用了gtk_widget_show函数时,该构件将在顶层容器调用gtk_widget_show后被实现和映射(构件被实现和映射后就将显示在屏幕上)。 因而,一般情况下,应该最后对最高级别的构件 GtkWindow调用gtk_widget_show( )函数。否则,如果先显示高级别的构件,用户可能会看到窗口先出现在屏幕上,然后子构件一个一个显示在屏幕上。
- gtk_widget_show_all:显示指定容器内的所有构件。(注:如果容器内套有容器,则使用该函数显示最外层容器时,所有内层容器内的构件也将被显示出来)
- gtk_widget_hide用来隐藏一个构件
- gtk_widget_destroy:销毁一个构件,并产生一个destroy消息(该消息为被销毁的构件产生,当然由被销毁的构件处理了)。当一个容器构件被销毁时,在该容器内的其它构件也将被销毁
- gtk_widget_set_usize:用来设置所有构件的大小。如果用该函数指定的中宽度(高度)如果指定为0,则使用容器里头包含的构件宽度(高度)来生成容器的宽度(高度)
- 使用GTK+内的函数来创建构件时,返回的是创建好的构件的指针,而描述构件的数据则保存在数据段中(全局变量)。因此,即使在某个函数内创建了多个构件,在函数返回时,构件仍然存在(构件保存在数据段中)
3 构件的敏感性
构件的敏感性即构件是否可用(enable,不可用的构件将被显示为灰色,且无法获得键盘输入焦点)
gtk_widget_set_sensitive函数用来设置构件是否敏感,可以通过设置容器的敏感性来设置容器内所有构件的敏感性
GTK_WIDGET_IS_SENSITIVE宏用来查询构件是否敏感
4 构件的类型转换
- GTK_BUTTON等类型转换宏的功能和相应的(GtkButton*)相同,程序中通常用它来进行强制类型转换,这样能使程序看起来比较亲切
- 某个Gtk数据类型具有哪些成员可以在DevHelp的properties页面中查询
类型转换宏
- GTK_OBJECT(object)
- GTK_WIDGET(widget)
- GTK_CONTAINER(container)
- GTK_SIGNAL_FUNC(func)
- GTK_WINDOW(window)
- GTK_BOX(box)
- G_CALLBACK:用于g_signal_connect中的回调函数的类型转换
5 默认构件
- “默认构件”指的是在窗口内按回车后会选中的构件
- GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT)宏用来将一个构件的GTK_CAN_DEFAULT标志位设为1
- 只有当构件的GTK_CAN_DEFAULT标志为1时,才能使用gtk_widget_grab_default来将构件设置为默认构件
6 补充部分
1.gtk_"控件名"_new_with_label系列的函数的实现
- 使用gtk_“控件名”_new来创建一个控件
- 2 往新建立的控件中添加一个label控件