文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>X Window研究笔记(11)-对象装饰

X Window研究笔记(11)-对象装饰

时间:2009-08-07  来源:lixianjing

X Window研究笔记(11)-对象装饰

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

11.X Window扩展机制--对象装饰

Decorator模式是一个非常重要的模式,它在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。X Server是用C开发的,不方便使用正统的装饰模式,但大量使用了类似装饰模式的扩展方式。可以被装饰的对象有:

1. 屏幕: ScreenRec
2. 窗口:WindowRec
3. 图片: PixmapRec
4. 绘图上下文: GC
5. 颜色映射: Colormap
6. 客户端:ClientRec

其实现过程可以这样理解:

1. 初始化时,把原始对象的部分函数指针保存下来,并用自己的函数去替代它。
2. 调用时,装饰之后的函数被调用,在该函数中,完成一些装饰性功能,并适当的位置调用原始的函数。

其中,用得最多的是对ScreenRec的装饰,下面我们以sprite模块中对ScreenRec的装饰为例,分析一下它的实现原理:

sprite指像鼠标指针一类的屏幕精灵,它的特点是,形状可能不规则,可以在屏幕上移动,会覆盖当前位置的图像,当它移动到新的位置时,自动恢复先前位置的图像。

sprite的初始化是在miSpriteInitialize中完成的:

Bool
miSpriteInitialize (pScreen, cursorFuncs, screenFuncs)
ScreenPtr pScreen;
miSpriteCursorFuncPtr cursorFuncs;
miPointerScreenFuncPtr screenFuncs;
{
miSpriteScreenPtr pPriv;
VisualPtr pVisual;
#ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif

if (miSpriteGeneration != serverGeneration)
{
miSpriteScreenIndex = AllocateScreenPrivateIndex ();
if (miSpriteScreenIndex < 0)
return FALSE;
miSpriteGeneration = serverGeneration;
miSpriteGCIndex = AllocateGCPrivateIndex ();
}
if %2
相关阅读 更多 +
排行榜 更多 +
空闲的鲨鱼世界

空闲的鲨鱼世界

休闲益智 下载
枪手跑酷手机版

枪手跑酷手机版

休闲益智 下载
割绳子大师

割绳子大师

休闲益智 下载