设为首页 收藏本站
查看: 1460|回复: 0

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

[复制链接]

尚未签到

发表于 2015-5-21 07:48:08 | 显示全部楼层 |阅读模式
  前几天开始写仿Win8 Metro界面文章,部分网友觉得不错,感谢各位的意见。本来今天一直在折腾Android VLC播放器,没时间写。不过明天休息,所以今天就抽时间先写一下。
  言归正传,我们都知道Win8的Metro界面只要手指一划,页面就跟着滑动(准确来说是按钮跟着滑动,背景其实没动),这个操作目前的Android和iPhone都是这种操作,个人感觉都是从iPhone借鉴来,滑动切换很早就有,不过按钮和壁纸分开滑动,这个还是iPhone时代开始。
   DSC0000.gif
  (这效果图是截了几张图弄的,所以看上去不流畅)
  类逻辑关系图
   DSC0001.jpg
  1、界面逻辑层次
  开始说滑动前,先要解析一下屏幕显示的原理。我们都知道屏幕最后呈现出来的画面,其实都是显存的数据,这个只有一份。也就是说最后用户看到的都是只有一张画面。如果你只是单纯按钮滑动,而背景不滑动,给人感觉是一个二维动画。
  没错,逻辑上的确是二维的,我们在显示逻辑上可以划分多个逻辑层,最后组合成一个显示画面。
  例如下面的结构体:
   DSC0002.jpg
  
  
  
  
  
  
  
  
  
  
  
  
  
  我这里区分了三个逻辑层
  1、背景层
  2、按钮层
  3、时间控件层
  这三个层次在逻辑上是分开的,最后需要显示的时候,才需要把他们组合起来,把画面绘画到兼容DC上,兼容DC再拷贝到屏幕DC上。这样才完成一次画面输出。这个有点想PhotoShop的图层,一张图片,由多个图层叠加完成。用过PS的人,应该很容易理解。
  为了实现两个页面滑动切换,我增加了一个Page类,(界面类之间关系,可以查看上一篇文章)用来管理每个页面的按钮,下面列出Page类的类声明。



//只支持2行
#define ROW_NUM 2
//识别操作
#define DEL_BTN 0x10
#define ADD_BTN 0x11
#define SWITCH_BTN 0x12
class CDUIPage:public CDUIBase
{
public:
CDUIPage(void);
~CDUIPage(void);
public:
//保存界面按钮的二维容器
vector m_pVUICtrlContent;
//保存界面按钮位置二维容器
vector m_pVUICtrlPos;
//标记是否按钮滑动
//BOOL m_slideBtn;
//标记是否滑动页面
//BOOL m_enterMouseMove;
//点击了按钮
    BOOL m_ClickBtn;
//按下点击点
    CPoint m_ClickDownPoint;
//内存DC,保存滑动时候背景
    CDC m_BackDC;//记录有多少方块(目前只支持两行)
int m_BlockNum[2];
//点击的是大按钮还是小按钮,大按钮为True
    BOOL m_BigBlock;
//点击第几行按钮
int m_BlockLine;
//点击第几个按钮
int m_BlockClickNum;
//删除区域
    CRect m_rcMainInterfaceDel;

   //...............
public:
//初始化一个页面
void InitPage(CDC * pDC, HWND MainWnd);
//画图
void Draw(CDC * pDC);
//响应窗口OnLButtonDown
    BOOL OnLButtonDown(POINT point);
//响应窗口OnLButtonUp
void OnLButtonUp(POINT point);
//响应窗口OnMouseMove
int OnMouseMove(POINT point, CDC * pDC, CDC * pBackDC);
//处理按钮移动交换
int OnLButtonUpDeal(int Page, POINT point);
//添加新的按钮
void AddItem(CDUIButton * btn, int lineNum);
//重新计算按钮位置
void ReloadBtnPos();
//设置偏移量
void SetOffsetPoint(int point);//插入项
void InsertItem(CDUIButton * btn, int lineNum, int Pos);//按钮排序//删除释放空按钮
void ReleaseBtn(int Line, int index);

   //...............
};
   从上面定义可以看出,这个Page类,其实主要作用就是管理Button类的,定义了一个二维向量容易,对应界面的二维布局,因为我那里界面屏幕分辨率相对比较固定。所以最多只能放两排按钮,所以最上面我定义了多少行现在。不过二维向量理论上没有限制多少行多少列。也就是说创建的所有CDUIButton对象都会被添加到二维向量里面,下面是添加的操作:



void CDUIPage::AddItem(CDUIButton * btn, int lineNum)
{
ASSERT(btn != NULL);
m_pVUICtrlContent.at(lineNum).push_back(btn);
//重新计算按钮位置
    ReloadBtnPos();
}
lineNum表示是第几行的按钮,添加傲二维向量容器后,会根据按钮大小,计算出这个按钮的位置。按钮的位置都是动态排布的,所以没有按钮滑动的时候显示区域是动态变化的。其实这个就是把屏幕划分为一个二维格子,有点像棋盘,每个按钮就是一个棋子,放到对应的格子上面。只是Metro界面棋子大小不一样,需要做些特殊处理,其中一种棋子占用了两个格子。其实这种设计思维在现在的Android界面上也同样如此,Android的Launcher就是按照一个个格子来放按钮和widget。至于iPhone,没看过源码,不敢确定。不敢按照它界面排布,多半也是类似的思想。
2、按钮绘画
按钮绘画的时候,是调用的Page的Draw函数,来绘画。我们看看Draw函数内容:



void CDUIPage::Draw(CDC * pDC)
{
//把原来的背景DC拷贝到控件内部DC
m_BackDC.BitBlt(0,0,ScreenWidth,ScreenHeight, pDC, 0, 0, SRCCOPY);
for (int outer=0; outer

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-68972-1-1.html 上篇帖子: Win8 Metadata 提供给大家 研究 下篇帖子: win8: ListView
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表