本文共 1533 字,大约阅读时间需要 5 分钟。
现在很多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来控制这个变换. 可以把大部分和窗口变换有关的代码统一起来.Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1355424