VC/Wince 实现仿Win8 Metro风格界面1——设计概述和自绘Button(附效果图)
去年用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(附效果图)的更多相关文章
- VC/Wince 实现仿Win8 Metro风格界面2——页面滑动切换(附效果图)
前几天开始写仿Win8 Metro界面文章,部分网友觉得不错,感谢各位的意见.本来今天一直在折腾Android VLC播放器,没时间写.不过明天休息,所以今天就抽时间先写一下. 言归正传,我们都知道W ...
- VC/Wince 实现仿Win8 Metro风格界面3——按钮移动交换、删除、添加快捷方式(附效果图)
上一篇文章写了如何进行页面滑动切换,今天我讲一下如何实现两个按钮拖动交换位置,包括同一个页面按钮交换或者两个页面之间的按钮交换.另外就是如何拖动删除界面上的快捷方式.按钮交换和拖动删除,这两个功能基本 ...
- Win8 Metro风格的Web桌面HteOS
前言 曾经天天折腾ExtJS,折腾累了.近期这段时间開始用jquery来做一些东西,发现还是蛮有意思的.可是做到最后才发现,原来做好设计真的很重要. 上图就是HteOS项目的截图,眼下正在开发 ...
- android仿win8 metro磁贴布局
代码下载 //更新代码, 这里是更新后的代码 //////////////////////// 1,含一个图片无限滚动的控件,自己实现的 2.可新增删除每个磁贴 3.来个图片吧 ////* ...
- windows8开发-关于wp7应用迁移到win8 metro风格
虽然微软说,wp7应用移植到win8上面是比较简单,只需要修改部分API和设计原则上的细节,同时它也提供了一份比较简洁的参考文档: 而实际上这种移植的工作量还是不小的,尤其当应用引用了较多底层的API ...
- Android 仿Win8的metro的UI界面(上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23441455 昨晚没事手机下载了一些APP,发现现在仿win8的主界面越来越多, ...
- devexpress实现模仿Win8桌面metro风格
1.devexpress强大的控件库,可很容易的实现Win8桌面metro风格.使用的TileControl控件,拖动与Win效果相同.所有图片均来自网络资源.每个块也可实现如图所示的四种大小,如何实 ...
- 仿win8磁贴界面以及功能
做移动产品界面占很大的一部分,同时也是决定一款产品好的的重要因素,最近看见有人放win8的界面效果,搜了两款,一款是只是仿界面没有特效,另一款是自定义组件能够实现反转效果,今天分析一下这两类界面. 仿 ...
- Metro风格的Android界面应用
最近项目中需要一个选择月份查询客户余额的功能,原先的android只能满足查询当月,不可以查询任意月份.当然改起来还是很简单的,服务端增加一个月份参数,客户端传入这个参数即可.闲来无事,月份的选择风格 ...
随机推荐
- 【Redis】解析Redis和Java传递数据
在Java中使用Redis之前需要导入 jedis.jar 包,由于Redis是基于key-value进行数据存储,java中的数据存储到Redis中有许多方式,这里笔者介绍采用JSON字符串和对象序 ...
- 【Linux】双向重导向命令tee
想个简单的东西,我们知道 > 会将数据流整个传送给文件或装置,因此我们除非去读取该文件或装置, 否则就无法继续利用这个数据流.万一我想要将这个数据流的处理过程中将某段信息存下来,应该怎么做? 利 ...
- TCP网络编程杂谈
作为一名IT工程师,网络通信编程相信都会接触到,比如Web开发的HTTP库,Java中的Netty,或者C/C++中的Libevent,Libev等第三方通信库,甚至是直接使用Socket API,但 ...
- Python 爬虫实例(13) 下载 m3u8 格式视频
Python requests 下载 m3u8 格式 视频 最近爬取一个视频网站,遇到 m3u8 格式的视频需要下载. 抓包分析,视频文件是多个 ts 文件,什么是 ts文件,请去百度 ...
- php分享二十四:数组
1:isset() 对于数组中为 NULL 的值不会返回 TRUE,而 array_key_exists() 会. 2:利用array_filter和strlen快速过滤数组中等于0的值 $path ...
- MySql(十八):MySql架构设计——高可用设计之 MySQL 监控
前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一个系统,无论如何设计如何维护,都无法完全避免出 ...
- 用“网建”平台发手机短信的C#代码
一直都用这个平台发手机短信的,今天做新项目的时候用到了,但是上来博客搜索不到,只好翻以前的源代码翻了好久才找到了,先记下来,以作备用: using System; using System.Colle ...
- WCF推送
http://www.cnblogs.com/server126/archive/2011/08/11/2134942.html
- PxCook(像素大厨)
PxCook(像素大厨)是一款切图设计工具软件.自2.0.0版本开始,支持PSD文件的文字,颜色,距离自动智能识别. 优点在于将标注.切图这两项设计完稿后集成在一个软件内完成,支持Windows和Ma ...
- 【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念
注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple F ...