【转】GTK编程——构件的显现、映射和显示

来源:互联网 发布:淘宝装修950模板 编辑:程序博客网 时间:2024/06/07 05:59

原文:http://www.yuanma.org/data/2009/0401/article_3603.htm

 

内容摘要 在典型的用户代码中,只需调用gtk_widget_show()函数。这暗含当它的父构件一旦被显现和映射,该构件就被显现和映射。要理解的是: gtk_widget_show()函数并不会立即生效,这一点很重要,它仅仅是确定构件被显示出来的时间。也就是说,不用担心显示构件的顺序(不必一定要先显示子构件,再显示父构件)。但是,这时还不能立即访问这个构件的GdkWindow窗口。有时,又确实需要在映射之前访问构件的GdkWindow 窗口;在这样的情况下,要手工调用gtk_widget_realize()函数来创建这个GdkWindow。如果机会适当, gtk_widget_realize()函数还会显现构件的父构件。使用gtk_widget_realize()函数的情况是不多见的,如果感觉到一定要这么做时,也许是使用了不正确的方法。

中国源码网内相关主题链接
  • 22+1条经典的编程引言
  • ORM编程思想
  • 网络编程之C10K问题
  • 在windows中构建gtk开发环境
  • Linux socket编程之套接字
  • Gtk+的裁剪
  • Linux下socket编程的非阻塞TC...
  • 非阻塞式socket编程select()
  •  

    构件可以按它们是否有GdkWindow窗口分类。有两种Gtk+ 构件,一种有一个相关联的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<gtk/gtkwidget.h>
    /*显现一个构件,创建该构件的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)

    原创粉丝点击