博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GUI设计思路之二:Blender -- WinstateBlender/WinTransBlender
阅读量:4191 次
发布时间:2019-05-26

本文共 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

你可能感兴趣的文章
openstack juno 配置vmware(vcenter、vsphere)
查看>>
远程debug调试(eclipse)之openstack windows
查看>>
PAAS平台对比:OpenShift VS CloudFoundry【51CTO调研报告】
查看>>
JAX-RS(java restful实现讲解)(转)
查看>>
Spring MVC与JAX-RS比较与分析
查看>>
openstack官方docker介绍
查看>>
头痛与早餐
查看>>
[转]在ASP.NET 2.0中操作数据::创建一个数据访问层
查看>>
Linux命令之chmod详解
查看>>
【java小程序实战】小程序注销功能实现
查看>>
Java中子类能否继承父类的私有属性和方法
查看>>
JVM内存模型详解
查看>>
(二)Git--工作区和暂存区、管理修改与撤销
查看>>
(七)Git--自定义Git
查看>>
(五)Git--分支管理
查看>>
(四)Git--远程仓库
查看>>
(六) Git--标签管理
查看>>
java中继承,子类是否继承父类的构造函数
查看>>
什么是Spring Cloud ?
查看>>
pyqt实现界面化编程
查看>>