GUI设计思路之二:Blender -- WinstateBlender/WinTransBlender

news/2024/7/8 3:36:45

现在很多GUI的窗口在显示的时候,都有淡入和淡出的效果. 或者是飞入/飞出的效果(是叫飞入飞出吗?呵呵.). 也就是说1:可以自由控制窗口在两个状态间进行融合. 2: 能自由控制窗口的变换--旋转和缩放等.
为此我把窗口独立成一个个状态:
struct _XUI_API_ xuiWindowState_t
{
          char                                  m_Name[32];
           xColor_4f                        m_color;
           xColor_4f                        m_textcolor;
           xuiWindowBorder_t      m_border;
           xuiRegion                       m_Region;
};

再定义一个混合器
class _XUI_API_ xuiWindowStateBlender
{
          xuiWindowState_t  m_Start;
          xuiWindowState_t  m_End;
          long              m_time;
          long              m_totalTime;
          xuiWindow*        m_pWindow;
 
public:
          xuiWindowStateBlender(xuiWindow* pWindow);
          virtual ~xuiWindowStateBlender();
          virtual bool update(long passedTime);
          virtual bool isInBlending() const;
          virtual bool stop();
          virtual bool setState(xuiWindowState_t* pStartState , xuiWindowState_t* pEndState , long _time);
          virtual bool setState(xuiWindowState_t* pEndState , long _time);
};


这些状态都可以写在xml里. 比如"normal"状态, "hide"状态. 那么窗口从隐藏到显示的变换过程就是hide 到 normal的变化过程.
以下为show的代码
xuiDialog::show()
{
       xuiWindowState _hideState = findState("hide");
       xuiWindowState _normalState = findState("normal");
       m_pWinStateBlender->setState(hideState  , normalState , 200);//200 ms混合完毕.
}
以下为按钮按下的处理
xuiButton::onLButtonDown()
{
       xuiWindowState _pressState = findState("press");
       xuiWindowState _normalState = findState("normal");
       m_pWinStateBlender->setState(pressState , normalState , 200);//200 ms混合完毕.
}

这样的代码.能够基本把所有状态切换的过程全部统一起来. 已经能完成alpha过渡,位置过渡等. 不过要完成两个图片融合还需要再绘制的时候做一些额外的事情.

对于旋转等效果.我们可以用同样的方式处理xuiWindowTransform . 为窗口引入一个xuiWindowTransform的对象表示窗口的变换, 用xuiWindowTransBlender来控制这个变换. 可以把大部分和窗口变换有关的代码统一起来.






http://www.niftyadmin.cn/n/3647775.html

相关文章

GUISystem设计思路之三:HotArea的概念。

很多时候,我们希望有些GUI的toolbar能自动消失。这个可以通过循环检测来实现。还有些时候 我们希望鼠标在某个区域动一下或者点一下就让消失掉的toolbar能自动显示出来。或者在一个窗口以外的地方点击的时候就能让窗口自动关闭。这个时候,我们去生写代码…

Mozilla XULRunner 的编译。

Mozilla XULRunner 的编译。潘李亮 2006-10-31Mozilla里有很多好东西。 比如那个js引擎和嵌入式渲染引擎。这段时间在想如果能在游戏里嵌入一个浏览器该多好啊。这个想法用mozilla的渲染引擎来实现在再好不过的了。Mozilla的渲染引擎叫xulrunner。它和firefox 用的是同一个代码…

极限边缘.

极限边缘.最近突然发现自己已经比以前长胖了好多。朋友拿着以前的我的照片都已经认不出来。于是开始决定出去锻炼。突然发现好多以前自己认为是非常剽悍的领域已经都是明日黄花,今天已是我挑战极限的运动。前两个星期和大学舍友一起去踢球。虽然知道以前能满场非的我…

Mozilla浏览器和应用程序的整合---第一步,显示

前段时间终于学会了编译Mozilla XULRunner.顺便修改修改了uBrowser的代码。把它的代码整合到我的引擎中。现在已经能把网页面显示出来了。回头弄弄一个DLL的路径。现在第一次运行的时候会报告有些mozilla的插件找不到。不过似乎第二次就好了。下一个步可以加入键盘鼠标的响应。…

Nebula2探秘14-nGuiServer的创建与使用

Nebula2探秘14-nGuiServer的创建与使用happykevins文关于nGui: nGui是Nebula2本身集成的GUI系统。虽然Radon在mangalore中已经集成了对CEGUI的支持,但是nGui相比之下更加简单易用,而且紧密地与Nebula2结合,不存在CEGUI诸多的兼容性问题。另…

Nebula2探秘15-Simple Application Framework

Nebula2探秘15-Simple Application Frameworkhappykevins文 在经历了前14章的学习之后,本章将介绍一个简单的Nebula2应用程序框架nAppFrame。 nAppFrame可以说是nApplication的最简化版本,去掉了状态机和所有不必要的Packages和Servers。 nAppFrame的代…

Bug经典回放(四)

Bug现象: 还是调试别人的程序. 这次是GUI. 我们的GUI是基于SDL OpenGL的. 程序运行以后进行视频播放.在出现的工具条上不停的点击几下后. 整个GUI系统均停止响应. 工具条有个属性.在开始播放音乐或者视频后.会根据播放引擎通过一个引擎来设置toolbar的属性. 比如.在同一…

一般拓扑学--From百度(看了这个,终于明白什么是拓扑了)

用点集的方法研究拓扑不变量的拓扑分支。它的前身是点集拓扑学。点集拓扑学产生于19世纪。G.康托尔建立了集合论,定义了欧几里得空间中的开集、闭集、导集等概念,获得了欧几里得空间拓扑结构的重要结果。1906年M.-R.弗雷歇把康托尔的集合论与函数空间的研…