【转】GTK编程——构件的显现、映射和显示
2011-02-15 11:11
543 查看
原文: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)
内容摘要 在典型的用户代码中,只需调用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)
相关文章推荐
- GTK编程基础----状态栏、文本输入构件、组合框
- GTK编程基础----状态栏、文本输入构件、组合框
- GTK编程基础----状态栏、文本输入构件、组合框
- GTK编程基础----按钮构件
- GTK编程基础-----框架、比例框架、分栏窗口构件
- linux下GTK编程:显示CPU使用率,内存使用率,网速。
- OpenGL基础图形编程 - 纹理映射
- VS2010/MFC编程入门之十四(对话框:一般属性页对话框的创建及显示)
- Java 编程下 Eclipse 如何设置单行代码显示的最大宽度
- linux编程--获取文件状态与文件映射mmap .
- opengl编程学习笔记(四)(纹理映射)(结合nvdia OpenglSDk 的nvimage类)
- windows编程显示客户区窗口分辨率
- 利用汇编语言编程实现在屏幕上显示A-Z26个大写英文字母。
- 【转帖】快速配置 Samba 将 Linux 目录映射为 Windows 驱动器,用于跨平台编程
- Quartz 2D编程指南(13) - PDF文档的创建、显示及转换
- GTK编程基础----菜单选项
- 12bit灰度图像映射到8bit显示及python 实现
- TC图像编程-汉字串显示【原创】
- GPU编程中的常用几何函数、纹理映射函数、偏导数函数
- 图像编程学习笔记1——bmp文件结构处理与显示