linux应用程序开发指南之21-16.pdf
《linux应用程序开发指南之21-16.pdf》由会员分享,可在线阅读,更多相关《linux应用程序开发指南之21-16.pdf(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载第16章 GDK 基 础16.1 GDK和XlibG T K是用于实现图形用户接口的函数库。在 L i n u x平台上,G U I(图形用户接口)使用的是称为X 窗口(X Wi n d o w)的系统。X窗口系统是1 9 8 4年由美国麻省理工学院(M I T)开发的。在 L i n u x上使用的 X窗口系统是一种称为 X F r e e 8 6的X版本。X窗口系统与 M i c r o s o f tWi n d o w s的图形用户接口有所不同,它是基于客户/服务器的。X服务器在计算机上运行,控制监视器、鼠标和键盘。X客户通过网络与服务器通讯。X服务器为X客户提供图形显示服务。也就
2、是说,X客户和X服务器可能在同一台计算机上运行,也可能在不同的计算机上运行。X窗口系统带有一套低级的库函数,称为 X l i b。X l i b提供了许多对X窗口的屏幕进行操作的函数。当然,使用X l i b函数在屏幕上创建构件是很复杂的。G T K要在屏幕上绘制各种构件,就需要与X服务器打交道。但是 G T K提供的构件库并未直接使用 X l i b,而是使用了一个称为G D K的库。G D K的意思是GIMP Drawing To o l k i t,亦即G I M P绘图工具包。差不多每个G d k函数都是一个相应X l i b函数的封装。但是X l i b的某些复杂性(和功能)被隐藏起
3、来了。这样是为了简化编程,使G d k更容易移植到其他窗口系统(有一个在Wi n d o w s平台上的G d k版本)。被隐藏的X l i b功能一般是程序员极少用到的,例如,X l i b的许多特性只有窗口管理器才会用到,所以没有封装到G d k当中。如果需要,可以在应用程序中直接调用 X l i b函数,只要在文件头部包含g d k/g d k x.h头文件就可以了。一般情况下,如果要创建普通的图形接口应用程序,使用 G T K就可以了。G t k+和G n o m e构件库提供了极为丰富的构件,足以构造非常复杂的用户界面。但是,如果需要开发新构件,或者要创建绘图程序,仅使用 G T K
4、就不够了。这时可以采用X l i b,更好的方法是使用G D K库,它可以应付绝大多数的编程需要。本章介绍了关于G D K的一些基本知识,这些也是创建构件和绘图的基础。更多的 G D K细节内容,请参考g d k.h头文件。如果想了解G d k函数的实现细节(比如它对应于 X l i b的哪一个函数),可以看一下G d k的源代码以确定它所封装的 X l i b函数,然后用 m a n指令参看该函数的手册页。例如,下面是g d k _ d r a w _ p o i n t()函数的实现代码:v o i dgdk_draw_point(GdkDrawable*drawable,GdkGC *g
5、c,gint x,gint y)GdkWindowPrivate*drawable_private;GdkGCPrivate*gc_private;g_return_if_fail(drawable!=NULL);g_return_if_fail(gc!=NULL);drawable_private=(GdkWindowPrivate*)drawable;if(drawable_private-destroyed)r e t u r n;gc_private=(GdkGCPrivate*)gc;XDrawPoint(drawable_private-xdisplay,drawable_priv
6、ate-xwindow,gc_private-xgc,x,y);每一个数据结构都被转换给它的一个“私有”版本,该“私有”版本包含了与 G D K正在使用的特定窗口系统的相关信息,这样可以将与特定窗口系统相关的函数声明排除在gdk/gdk.h 头文件外。每个数据结构的“私有”版本都包含一个封装的 X l i b数据结构,且这个数据结构被传递到 X D r a w P o i n t()函数中,所以 X D r a w P o i n t()函数的文档也适用于g d k _ d r a w _ p o i n t()函数。16.2 GdkWindowG d k Wi n d o w是X l i b
7、窗口对象的封装。一个G d k Window 代表屏幕上的一个区域,可以显示或隐藏起来(在X l i b里面称为映射或反映射窗口),也可以捕获G d k Wi n d o w接收到的事件,还可以在里面绘制图像,移动或调整图像的尺寸。G d k Window 是以树状结构组织的,也就是说,每一个窗口都可以有子窗口。子窗口是相对于父窗口的位置定位的,当父窗口移动时,子窗口也会移动。子窗口不会在父窗口边界外的区域绘出(也就是说,它们会被父窗口剪裁)。所谓G d k Wi n d o w窗口的树状组织并不是针对每个应用程序的,实际上有一个由 X服务器和窗口管理器控制的窗口的全局树。根窗口没有父窗口,所
8、有窗口都是从它派生而来的。作为桌面背景,根窗口的全部或部分总是可见的。每个窗口都可以为不同的 L i n u x进程所拥有,一些窗口是由窗口管理器所创建的,还有一些来自于用户的应用程序。G d k Wi n d o w和G t k Wi n d o w是完全不同的东西。G t k Wi n d o w是一个G t k+构件,用于表示顶级(t o p l e v e l)窗口(顶级窗口是在窗口层次中由应用程序控制的最高级别的窗口)。典型情况下,窗口管理器为顶级窗口创建各种装饰,包括标题条、关闭按钮以及窗口外观等。要理解X窗口首先要知道它是 X服务器上的一个对象,这一点很重要。X客户对每一个窗口获
9、得一个独一无二的整数 I D号,并用I D号码引用该窗口。这样,所有的窗口操作都发生在服务器上,并且所有与X窗口打交道的函数都要通过网络传输。G d k Wi n d o w是由X返回的整数I D号的一个封装。它确实保存一些信息的本地拷贝(比如说窗口的尺寸),所以一些G d k操作比相应的X l i b操作效率更高。还有,G d k Wi n d o w本质上是服务器端对象的一个句柄。许多G d k对象都是相似的,字体、像素映射图片、鼠标光标等等也是服务器端对象的句柄。16.2.1 GdkWindow和GtkWidget许多G t k Wi d g e t子类都有一个相关联的 G d k Wi
10、 n d o w窗口。理论上,G t k+应用程序可以只创建一个顶级窗口,并将所有构件画在里面。然而,这么做并没有什么实际意义,因为G d k Wi n d o w允许X窗口系统自动处理许多细节。例如,G d k所接收到的事件都使用它们所发生的窗口标志,这使得G t k+能很快确定每个事件是哪个构件发生的。有一些构件是没有与之相关联的 G d k Wi n d o w窗口的,它们称为“无窗口”的构件,用一第1 6章GDK 基础使237下载个G T K _ N O _ W I N D O W标记来标志它们(可以用G T K _ W I D G E T _ N O _ W I N D O W()宏
11、来测试它们)。没有窗口的构件会将自身绘制在其父构件容器的 G d k Wi n d o w窗口上。无窗口构件相对较小,占用资源较少,一般将它们称为“轻量级”的,G t k L a b e l构件就是一个最常见的例子。因为事件总是由G d k Wi n d o w窗口接收的,无窗口构件不能接收事件。如果想让无窗口构件捕获事件,可以使用G t k E v e n t B o x容器构件。16.2.2 GdkWindow属性创建G d k Wi n d o w时,gdk_window_new()函数允许指定窗口的所有属性,这些属性以后也可以再改变。要指定多个属性,可以向函数传递一个 G d k Wi
12、 n d o w A t t r对象。G d k Wi n d o w A t t r对象的内容就是G d k Wi n d o w窗口的属性。下面是G d k Wi n d o w A t t r结构的定义:typedef struct _GdkWindowAttr GdkWindowAttr;struct _GdkWindowAttrgchar*title;gint event_mask;gint16 x,y;gint16 width;gint16 height;GdkWindowClass wclass;GdkVisual*visual;GdkColormap*colormap;GdkW
13、indowType window_type;GdkCursor*cursor;gchar*wmclass_name;gchar*wmclass_class;gboolean override_redirect;因为G d k Wi n d o w A t t r结构的一些成员是可选的,所以 g d k _ w i n d o w _ n e w()函数用一个a t t r i b u t e s _ m a s k参数指定哪一个可选成员里包含有效的数据。Gdk 只检查在屏蔽值里面指定的成员,这样可以让不感兴趣的成员保留缺省值。下面的函数列表简要概括了这些值。没有a t t r i b u t
14、e s _ m a s k标志的成员必须指定,因为它们没有缺省值。g d k _ w i n d o w _ n e w()函数最典型的是用在构件的实现中,用来创建构件的 G d k Wi n d o w。在其他场合下极少用到它。g d k _ w i n d o w _ d e s t r o y()函数销毁G d k Wi n d o w窗口。函数列表:G d k Window#include GdkWindow*gdk_window_new(GdkWindow*parent,GdkWindowAttr*attributes,gint attributes_mask)void gdk_wi
15、ndow_destroy(GdkWindow*window)下面简要介绍G d k WindowAttr 结构中各个成员的意义。第一个成员t i t l e是G d k Wi n d o w的标题,它只对顶级窗口才有实际意义,大多数窗口管理器把它放在标题条上。通常,不要在创建 G d k Wi n d o w窗口时指定 t i t l e值,应该让用户调用g t k _ w i n d o w _ s e t _ t i t l e()函数来指定它。238使第二部分 Linux编程常用C语言函数库及构件库下载第二个成员e v e n t _ m a s k是窗口的事件屏蔽,它决定这个窗口接收什
16、么事件。后面会有详细的介绍。第三个和第四个成员x、y是窗口的X、Y坐标,它们是以像素度量的;这两个坐标是相对于父窗口原点的坐标。每个窗口的原点都是它的左上角(西北角)。注意,它们是1 6位的有符号整数。X窗口最大可以是32 768像素,它可以是负数值,不过会被它的父窗口剪裁掉(只有在父窗口内部的区域才是可见的)。第五个和第六个成员 w i d t h、h e i g h t是窗口的宽度和高度,它们是以像素度量的,也是1 6位的有符号整数。第七个成员G d k Wi n d o w C l a s s可取以下两种值:GDK_INPUT_OUTPUT:G d k Wi n d o w是一个普通窗口
17、 G D K _ I N P U T _ O N LY:G d k Wi n d o w是一个窗口,它有一个位置,能接收事件,但没有视觉上的表示,也就是说它是不可见的。它的子窗口也必须是这种类型的。你可以为这种窗口设置光标和其他的属性,但是没有办法把窗口画出来(因为它是不可见的)。这种窗口有时候用于捕获事件或改变两个普通窗口重叠区域的鼠标光标。第八个成员v i s u a l(视件)描述了一个显示器的颜色处理特征;第九个成员 c o l o r m a p(颜色表)包含了用于绘画的颜色。第十个成员w i n d o w _ t y p e指定G d k Wi n d o w的类型。窗口可以是下
18、面几种不同类型之一,由G d k Wi n d o w Ty p e枚举类型指定:GDK_WINDOW_ROOT:是根窗口的G d k封装类型,在初始化时创建。G D K _ W I N D O W _ TO P L E V E L:是一个顶级窗口。在这种情况下,g d k _ w i n d o w _ n e w()函数的p a r e n t参数应该设为N U L L。G d k自动使用根窗口作为它的父窗口。GDK_WINDOW_CHILD:是一个在顶级窗口中的下级窗口。G D K _ W I N D O W _ D I A L O G:基本上与顶级窗口是一样的。它的父窗口应该是 N U
19、 L L,并且G d k会替换根窗口。应该设置一个窗口类提示(w m c l a s s _ n a m e)告诉窗口管理器这个窗口是一个对话框,一些窗口管理器会考虑这些情况并作适当的处理。G D K _ W I N D O W _ T E M P:用于弹出菜单或其他类似的东西。它是一个只需暂时存在的窗口。它是一个顶级窗口,所以它的父窗口应该是 N U L L。这种窗口的鼠标光标总是与它们父窗口的一样。所以它们会忽略属性结构中的相关成员值。G D K _ W I N D O W _ P I X M A P:根本就不是窗口。在 G d k中G d k P i x m a p和G d k Wi n
20、 d o w差不多是同样处理的,所以G d k用同样的结构表示它们;它们可以视为 G d k D r a w a b l e类型。G D K _ W I N D O W _ F O R E I G N:标识一个不是由G d k创建的窗口的封装。对g d k _ w i n d o w _ n e w()来说,只有G D K _ W I N D O W _ TO P L E V E L、G D K _ W I N D O W _ C H I L D、G D K _ W I N D O W _ T E M P和G D K _ W I N D O W _ D I A L O G是有效的。库用户不会创
21、建一个G D K _ W I N D O W _ R O O T。p i x m a p(G D K _ W I N D O W _ P I X M A P)是用g d k _ p i x m a p _ n e w()创建的。外来窗口(G D K _ W I N D O W _ F O R E I G N)是在G d k外部创建并用g d k _ w i n d o w _ f o r e i g n _ n e w()封装的X窗口。第十一个成员c u r s o r指定在这个窗口中的鼠标的指针(光标)形状。第十二个成员w m c l a s s _ n a m e前面已经介绍过了。写构件时
22、,通常不设置类提示,它只与顶级窗口有关。G t k+提供了g t k _ w i n d o w _ s e t _ w m c l a s s()函数,程序员可以将它设置为具有确切含义的值。第1 6章GDK 基础使239下载G d k Wi n d o w A t t r的最后一个成员 o v e r r i d e _ r e d i r e c t决定窗口是否“替换重定向”的。通常,窗口管理器截获所有对顶级窗口的显示、隐藏、移动或尺寸调整请求。你可以重定向或取消这些请求,让顶级窗口按窗口管理器的布局策略行事。将o v e r r i d e _ r e d i r e c t设置为T R
23、 U E,禁止窗口管理器对窗口的管理。因为窗口管理器不能移动设置了这个标志的窗口,通常也不会为这样的窗口设置标题条或其他的装饰。注意,所有的G D K _ W I N D O W _ T E M P窗口都将这个成员设为 T R U E;G D K _ W I N D O W _ T E M P通常用作弹出菜单,窗口管理器不能控制它。一般不应该改变o v e r r i d e _ r e d i r e c t成员。如果指定了正确的 G d k Wi n d o w q Ty p e,缺省值差不多总是正确的。不过还是有一些例外,例如 G n o m e面板应用程序设置了这个成员。16.3 视件
24、和颜色表硬件之间总存在差别。最原始的 X服务器只支持两种颜色,每一个像素只能是 o n或o ff(开或关)。这就是“每像素一位”(b p p)显示模式。每像素一位的显示模式称为深度为 1。多数高级的X服务器支持每像素 2 4或3 2位,还允许以窗口为基础指定不同的深度。每像素 2 4位允许22 4(16 777 216)种像素,包含了比人眼能分辨的还要多的颜色。从概念上说,位图显示由一个矩形的像素网格组成。每个像素由一些固定的位数组成;像素以一种硬件相关的方法映射为可视的颜色。考虑这种概念的一种方法就是想象一个二维的整数数组,整数的大小等于要求的位数。换一种说法,可以想象一种显示就像一个“位平
25、面”栈,或“位”的二维数组。如果每个平面都平行于其他平面,那么一个像素就是一根在相同坐标处穿过每个平面的垂线,并且从每一个平面处获得一位。这就是术语“深度”的起源,因为每个像素的位数等于位平面栈的深度。在X窗口系统中,像素代表在一个颜色查找表中的入口。一种颜色就是一组红、绿、蓝(R G B)值监视器以一定比率混合红绿蓝光以显示每个像素。例如,考虑一种八位的显示模式:八位不足以为现实中的颜色编码,只可能为很少部分的 R G B值编码。作为替代,数据位被解释为整数,用于为R G B颜色值做索引。这个颜色表称为 c o l o r m a p(颜色表),有时,你也可以修改它以包含要使用的颜色,虽然这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 应用程序 开发 指南 21 16
限制150内