去年用VC做了一个仿Win8 Metro风格的界面,感觉挺有意思,最近打算把实现过程和一些技术原理记录下来。

主要是风格上类似Win8,其实功能上很多借鉴了Android的操作方式。界面只支持两种大小的Metro磁铁。

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3157205.html

1、主要实现了以下功能:

  • 手指滑动切换页面。
  • 图标位置交换。
  • 从全部列表拖动添加到主页面。
  • 主页面按钮拖动添加删除操作。
  • 主页面按钮拖动添加到导航栏上。
  • 背景更换

下面是一张最终桌面效果图:

程序是运行在Wince上,不过是使用MFC开发,所以对PC开发也是同用。

2、类图关系

要实现滑动操作和按钮拖动操作最基本的就是需要有一个支持滑动拖动的按钮。VC上微软的Button拖动效率太

低而且不好操作,所以很多重载Button类的控件都用不了。做嵌入式开发,需要一个绚丽点的界面,基本只有一条

路径,就是重绘。所以我们这里使用的按钮和其他控件都是基于重绘的。

做这个界面主要时为了兼顾程序健壮性,所以使用了MVC模式,所有界面元素都是独立于对话框,我把它们

都放在一个DUIInterface的目录下。还有一点这个界面逻辑是基于DirectUI的思想来做,基于一个窗体上绘

画不同的窗口和控件。不过这个并没有完整的使用DirectUI,消息分发方面还没有独立处理,仍然依赖窗口

的消息队列。

先把我界面结构类图画出来:

3、基类CDUIBase

CDUIBase是所有类的基类,是一个虚基类,提供了基本的点击接口、滑动接口、绘画控件接口

/*************************************************
2012. Co., Ltd.
Edited by OWL
Class name: CDUIBase Description:
绘图控件基类,定义了绘画操作的动作
*************************************************/ #pragma once class CDUIBase
{
public:
CDUIBase(void);
~CDUIBase(void); public:
//画图
virtual void Draw(CDC * pDC); //响应窗口OnLButtonDown
virtual BOOL OnLButtonDown(POINT point); //响应窗口OnLButtonUp
virtual void OnLButtonUp(POINT point); //响应窗口OnMouseMove
virtual int OnMouseMove(POINT point, CDC * pDC, CDC * pBackDC);
};

VC里面界面响应回调主要就是依靠OnLButtonDown、OnLButtonUp、OmMouseMove。这三个回调函数

基本构成了所以界面操作的基础。不仅仅是VC,其他的软件界面响应,其实底层都是基于这三个接口,然后根据

这三个接口数据就可以延伸出很多界面操作,例如手势操作。最近也在研究Android手势支持部分模块,Android

的手势支持很好,很多手势动作都可以识别出来。例如基本的滑动,按下拖动等等。不过这些操作都可以利用

OnLButtonDown、OnLButtonUp、OmMouseMove来混合实现。(多点触摸手势除外,这个需要底层屏幕驱动支持)。

例如判断手指向右拖动,可以根据OnLButtonUp的X坐标减去OnLButtonDown里面X坐标,得到结果如果是正数,

证明向右滑动,至于滑动距离也可以算出来。如果加上up和down之间的响应时间,就可以计算出这次滑动的速度是多少。

4、按钮类CDUIButton

这个Button类代码比较多,我就不贴出来了。主要就是继承实现CDUIBase里面的四个接口,另外因为Button点击

一般要处理事情,所以增加一个回调函数,在OnLbuttonUp的时候调用。

//定义点击按钮的响应回调函数
typedef void (CALLBACK* DUIBtnCallBack)(CWnd *pWnd, CString cmd, CString name, CString Animate);

pWnd是回调的窗口,cmd是按钮按下的识别命令,name是按钮名称,Animate是按钮按下需要执行的动画。

这几个可以根据需要调整,加入动画是为了操作看上去比较流畅。自从iPhone出来以后,做界面不加动画就是反人类 -_-!

class CDUIButton: public CDUIBase
{
public:
CDUIButton(void);
~CDUIButton(void);
private:
//按钮区域
CRect m_btnRc;
//标题的区域
CRect m_FontRc;
//按钮未选中状态图片路径
CString m_btnPic;
//按钮选中状态图片路径
CString m_btnPicSel;
//按钮动画效果图片路径
CString m_AnimatePic;
//按钮打开动画
CString m_AnimateType;
//点击按钮识别命令行
CString m_BtnClickCMD;
//按钮按下状态,TRUE为按下
BOOL m_ClickState;
//是否处于滑动
BOOL m_mouseMove;
//PNG图片正常状态透明度
BYTE m_Alpha;
//PNG图片按下透明度
BYTE m_AlphaSel;
//字体大小
int m_fontSize;
//.......... public:
//初始化按钮
void CreateBtn(CWnd * OwerWnd, HWND mainWnd, CString btnPic, CString btnPicSel, CRect rc);
//画图
void Draw(CDC * pDC);
//响应窗口OnLButtonDown
BOOL OnLButtonDown(POINT point);
//响应窗口OnLButtonUp
void OnLButtonUp(POINT point);
//响应窗口OnMouseMove
int OnMouseMove(POINT point, CDC * pDC, CDC * backDC);
//画按钮的名称
void DrawBtnText(CDC * pDC);
//..........
};

上面是定义的CDUIButton的一部分属性和方法,按钮一般都有按下、焦点、不可用、普通和点击5种状态。

不过我这里只需要用到普通和按下两种状态,所以只有两种属性,如果有需要可以把其他状态都加入进去。

这种只是一种虚拟的按钮,简单来说就是定义屏幕某个区域,然后在这个区域贴一张图片,如果你点击了这张图片,

把图片刷新成点击的状态,然后执行某个操作。就完成了一个按钮需要做的事情。至于按钮的数据是使XML配置,

然后读取XML配置的时候解析XML自动生成这个按钮对象,再放到管理容器里面。这方面的内容,后面会分开说明。

    使用这种自绘的Button的好处就是,你要拖动这个按钮,其实只是拖动一张图片,整个系统消耗是很小的。
如果你要拖动重载的微软控件,还涉及闪烁、拖动慢、刷新慢等问题。例如下面的截图,我把电子词典这个按钮
拖动出来,其实只要绘画一张图片就可以。

按钮都是用PNG图片来显示,所以操作的时候都加入了半透明效果,至于PNG图片显示和使用,我已经写了两篇文章,
有兴趣的可以看看:

1、Wince PNG贴图类

http://www.cnblogs.com/mythou/archive/2013/06/13/3133606.html

2、Wince/VC高效PNG贴图,自定义Alpha算法

http://www.cnblogs.com/mythou/p/3150396.html

今天就先说到这里,其他逻辑实现,我会后面接着写。

PS:代码问题,这个项目因为是公司的项目,所以代码无法上传,我后面会自己写一个demo,然后上传上来。

发现那里写错的朋友,欢迎留言指出!

VC/Wince 实现仿Win8 Metro风格界面2——页面滑动切换(附效果图)

VC/Wince 实现仿Win8 Metro风格界面1——设计概述和自绘Button(附效果图)的更多相关文章

  1. VC/Wince 实现仿Win8 Metro风格界面2——页面滑动切换(附效果图)

    前几天开始写仿Win8 Metro界面文章,部分网友觉得不错,感谢各位的意见.本来今天一直在折腾Android VLC播放器,没时间写.不过明天休息,所以今天就抽时间先写一下. 言归正传,我们都知道W ...

  2. VC/Wince 实现仿Win8 Metro风格界面3——按钮移动交换、删除、添加快捷方式(附效果图)

    上一篇文章写了如何进行页面滑动切换,今天我讲一下如何实现两个按钮拖动交换位置,包括同一个页面按钮交换或者两个页面之间的按钮交换.另外就是如何拖动删除界面上的快捷方式.按钮交换和拖动删除,这两个功能基本 ...

  3. Win8 Metro风格的Web桌面HteOS

    前言     曾经天天折腾ExtJS,折腾累了.近期这段时间開始用jquery来做一些东西,发现还是蛮有意思的.可是做到最后才发现,原来做好设计真的很重要. 上图就是HteOS项目的截图,眼下正在开发 ...

  4. android仿win8 metro磁贴布局

    代码下载     //更新代码,   这里是更新后的代码 //////////////////////// 1,含一个图片无限滚动的控件,自己实现的 2.可新增删除每个磁贴 3.来个图片吧 ////* ...

  5. windows8开发-关于wp7应用迁移到win8 metro风格

    虽然微软说,wp7应用移植到win8上面是比较简单,只需要修改部分API和设计原则上的细节,同时它也提供了一份比较简洁的参考文档: 而实际上这种移植的工作量还是不小的,尤其当应用引用了较多底层的API ...

  6. Android 仿Win8的metro的UI界面(上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23441455 昨晚没事手机下载了一些APP,发现现在仿win8的主界面越来越多, ...

  7. devexpress实现模仿Win8桌面metro风格

    1.devexpress强大的控件库,可很容易的实现Win8桌面metro风格.使用的TileControl控件,拖动与Win效果相同.所有图片均来自网络资源.每个块也可实现如图所示的四种大小,如何实 ...

  8. 仿win8磁贴界面以及功能

    做移动产品界面占很大的一部分,同时也是决定一款产品好的的重要因素,最近看见有人放win8的界面效果,搜了两款,一款是只是仿界面没有特效,另一款是自定义组件能够实现反转效果,今天分析一下这两类界面. 仿 ...

  9. Metro风格的Android界面应用

    最近项目中需要一个选择月份查询客户余额的功能,原先的android只能满足查询当月,不可以查询任意月份.当然改起来还是很简单的,服务端增加一个月份参数,客户端传入这个参数即可.闲来无事,月份的选择风格 ...

随机推荐

  1. 【SqlServer】在SqlServer中把数据导入导出为Excel文件

    这里笔者介绍利用SqlServer数据库操作EXECEL文件. 1.将Excel表中的数据导入为SqlServer数据库 把Excel表中的数据导入为SqlServer数据库中的数据. 新建一个Exc ...

  2. 【php】thinkphp以post方式查询时分页失效的解决方法

    好久没有写博客了,最近说实话有点忙,各个项目都需要改bug.昨天晚上一直没有解决的php项目中的bug,就在刚才终于搞定,在这里还需要感谢博客园大神给的帮助! 具体问题描述 最近遇到一个非常棘手的问题 ...

  3. Oracle 12C -- truncate的级联操作

    在之前的版本中,存在外键约束时,无法直接truncate父表.在12C中,对truncate操作添加了级联操作特性. 前提是创建外键约束时,使用了"on delete casacde&quo ...

  4. HDU - 4511 小明系列故事――女友的考验(AC自己主动机+DP)

    Description 最终放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候.女朋友告诉他.她在电影院等他,小明过来的路线必须满足给定的规则:  1.如果小明 ...

  5. 从sys/power/state分析并实现S3C2416的睡眠和唤醒

    环境: PC: debian-7.6.0 ARM CPU: S3C2416 Linux-Kernel: 3.6.0(FriendlyARM) U-boot: 1.3.4 一.问题来源 依据须要,在S3 ...

  6. java基础知识总结(二)

    +=隐含了强制类型转换. x+=y;等价与:x = (x的数据类型)(x + y); 函数重载? 函数名同样.參数列表不同.跟返回值不关,就是函数重载 封装是什么? 隐藏对象的属性和详细的实现细节,仅 ...

  7. Mapped Statements collection does not contain value for com.xxxx.dao.impl.AreaDAOImpl.findByCode

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Persiste ...

  8. HTML5无刷新修改URL

    HTML5新添加了两个api分别是pushState和replaceState,DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,可以在用户的访问记录中前进和 ...

  9. 亿级Web系统搭建:单机到分布式集群【转】

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  10. vivado烧写bin文件到flash 中

    点击 bitstream setting ,将 bin_file 勾上,点击 OK. 2)点击 generate bitstream ,生成 bit 文件和 bin 文件 3)点击 open hard ...