偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.
全部博文(1747)
分类: LINUX
2009-03-26 14:14:09
构件可以按它们是否有GdkWindow窗口分类。有两种+
构件,一种有一个相关联的GdkWindow窗口,另一种没有。大多数构件都有一个相关联的GdkWindow窗口,构件就绘制在这个窗口上。这里的
GdkWindow窗口和Gtk+里的GtkWindow窗口是不一样的。
GdkWindow不是一个用户可见的对象,而是一个X服务器用于划分屏幕的抽象概念。一个GdkWindow窗口,对X服务器给出了关于将要显示的图形
的结构信息。因为X窗口系统是网络透明的,有可能X窗口的显示位置和X服务器不在同一台机器上,这样有助于减少网络流量。GtkWindow是
一个窗口构件,它是一个用户可见的对象。
还有一些构件,比如说GtkLabel构件,没有与之相关联的GdkWindow;它们被称为“无窗口构件”,并且是相对轻量级的。没有相关联窗口 的构件绘制在它的父构件的GdkWindow窗口上。一些操作,例如捕获一个事件,要求有一个GdkWindow窗口,因此不能在无窗口构件上做这些操 作。
构件要经过一系列与它们的GdkWindow相关的状态:
如果一个构件相应的GdkWindow被创建出来,称为该构件被显现(realize)。用
gtk_widget_realize()函数显现一个构件,用gtk_widget_unrealize()函数反显现(unrealized)构件。因为X窗口必须有一个父窗口,如果一个构件已经显现,它的父窗口也必然已显现。
如果在构件的GdkWindow上调用了gdk_window_show()函数,称为该构件被映射(map)了。这意味着器已经要求在屏幕上显示这个构件的GdkWindow窗口。很明显,GdkWindow窗口必须存在,也就是说,被映射的构件必然已被显现。
如果当一个构件的父构件被映射时,它也被映射到屏幕上,这个构件就是可见的。这意味着已经对该构件调用了gtk_widget_show()函数。 通过调用gtk_widget_hide()函数,一个构件可以绘制为不可见的,这或者是取消未决的映射(已经确定了映射的时间,但还未映射),或者反映 射该构件(隐藏它的GdkWindow窗口)。因为顶级构件没有父构件,当它们一显示,它们同时就被映射了。
在典型的用户代码中,只需调用gtk_widget_show()函数。这暗含当它的父构件一旦被显现和映射,该构件就被显现和映射。要理解的是: gtk_widget_show()函数并不会立即生效,这一点很重要,它仅仅是确定构件被显示出来的时间。也就是说,不用担心显示构件的顺序(不必一定 要先显示子构件,再显示父构件)。但是,这时还不能立即访问这个构件的GdkWindow窗口。有时,又确实需要在映射之前访问构件的GdkWindow 窗口;在这样的情况下,要手工调用gtk_widget_realize()函数来创建这个GdkWindow。如果机会适当, gtk_widget_realize()函数还会显现构件的父构件。使用gtk_widget_realize()函数的情况是不多见的,如果感觉到一 定要这么做时,也许是使用了不正确的方法。
上面介绍了创建构件的过程。销毁构件自动地将以上事件的整个次序倒过来,递归取消子构件和构件本身的显现。
正如上面所提到的,对构件调用gtk_widget_show()函数之后,构件并不一定会显示。只有当构件的所有父构件(直到最高级别的父构件) 全部显示之后,它才会显示。因而,一般情况下,应该最后对最高级别的构件GtkWindow调用gtk_widget_show()函数。否则,如果先显 示高级别的构件,用户可能会看到窗口先出现在屏幕上,然后子构件一个一个显示在屏幕上。用户或许会觉得你的程序不够专业,甚至不正确。
下面是显现、映射和显示构件的相关函数。
函数列表:显示/映射/显现构件
#include
/*显现一个构件,创建该构件的GdkWindow*/
voidgtk_widget_realize(GtkWidget*widget)
/*反显现构件,销毁该构件的GdkWindow*/
voidgtk_widget_unrealize(GtkWidget*widget)
/*映射构件,构件的GdkWindow显示在窗口上*/
voidgtk_widget_map(GtkWidget*widget)
/*反映射构件,隐藏构件的GdkWindow。注意,构件的GdkWindow还存在*/
voidgtk_widget_unmap(GtkWidget*widget)
/*显示构件,当构件的父构件(向上递归直到最高级别构件)显示时,
*构件将显示在屏幕上,*/
voidgtk_widget_show(GtkWidget*widget)
/*隐藏构件,构件的GdkWindow依然存在*/
voidgtk_widget_hide(GtkWidget*widget)