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

现在很多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来控制这个变换. 可以把大部分和窗口变换有关的代码统一起来.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值