Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3236175
  • 博文数量: 1078
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 12918
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1078)

文章存档

2019年(52)

2018年(81)

2017年(80)

2016年(70)

2015年(52)

2014年(41)

2013年(51)

2012年(85)

2011年(46)

2010年(232)

2009年(289)

分类: LINUX

2009-03-26 14:14:09

构件可以按它们是否有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
/*显现一个构件,创建该构件的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)

阅读(1353) | 评论(0) | 转发(0) |
0

上一篇:彼此的体温

下一篇:GTK+ 布局管理

给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册