<Win32_15>用纯C语言来实现WP8中磁贴动态翻转的功能「建议收藏」

今年年初入手了一部诺基亚新款WP8手机——Lumia620经典蓝,用起来感觉很不错,很流畅、界面很清新到现在,用了大概有大半年时间了,一直很好奇WP8中磁贴动态翻转的实现算法——使用过WP8手机的朋友都知道,这个功能很有3D的效果,看起来感觉很不错但是,它到底是如何实现的呢? 今儿,我就来和大家一起剖析一下它的实现细节WP8中磁贴动态翻转功能细节:(1)将当

大家好,又见面了,我是你们的朋友全栈君。

本文由BlueCoder编写   转载请说明出处:

http://blog.csdn.net/crocodile__/article/details/10486095

我的邮箱:bluecoder@yeah.net    欢迎大家和我交流编程心得

我的微博:BlueCoder_黎小华    欢迎光临^_^

今年年初入手了一部诺基亚新款WP8手机——Lumia 620 经典蓝,用起来感觉很不错,很流畅、界面很清新

<Win32_15>用纯C语言来实现WP8中磁贴动态翻转的功能「建议收藏」

到现在,用了大概有大半年时间了,一直很好奇WP8中磁贴动态翻转的实现算法——使用过WP8手机的朋友都知道,这个功能很有3D的效果,看起来感觉很不错

但是,它到底是如何实现的呢?

 

今儿,我就来和大家一起剖析一下它的实现细节


WP8中磁贴动态翻转功能细节

(1)将当前图标逐渐缩小(这个缩小的倍率很讲究)

(2)当前图标缩小到一定程度——基本上看不太清楚的时候——就变换另外一张图标

(3)将另外一张图标逐渐放大,直至和原图标大小一致为止

(4)停顿一会儿,继续(1)、(2)、(3)的操作

由此,可见这个看似有3D效果的磁贴翻转功能也就是使用2D技术实现的——毕竟是在一个平面上——但是这个过程比较快,人的肉眼有记忆推迟特点,因此看起来很连贯,就像是将一张图360°翻转过来一样(其实和看视频的原理差不多)


使用过WP8手机的朋友应该都知道”天气通”这个应用吧,它可以产生磁贴放到WP8手机桌面中,并能实现翻转功能,我也就借用这个应用的图标来模拟

下面来看看,我模拟的程序的实现效果:

<Win32_15>用纯C语言来实现WP8中磁贴动态翻转的功能「建议收藏」

 

 

怎么样,还不错吧?呵呵^_^

 

…………

 

 

功能细节大家知道了,可是我们如何用win32纯c语言来实现呢?

OK,我的对策是“对症下药”

<1>首先必须实现缩放位图的功能,这个可以使用StretchBlt这个方法(熟悉Win32的应该知道这个函数吧),它可以按照指定的大小来缩放这个位图

<2>其次,所谓”逐渐缩放”、”停顿一会儿”——当然第一时间想到的就是计时器和Sleep这个函数来实现

 

 

使用到的技术主要就是这两个,下面着重讲解一下具体的代码细节:

<1>变量浏览

//全局变量(用来控制每一次缩放的大小,注意:只是缩放位图的高度、宽度不变)
int		height[] = {144, 88, 32, 10, 75, 137, 200};

 

//回调函数中的静态局部变量
static HBITMAP	hBmp[2];			//存放正反面位图句柄
static SIZE		sBmp, sClient;		//位图大小、客户区大小(用于缩放)
static POINT	ptBmp;				//位图位置(保证始终居中显示)
static int		curIndex, isFirst;	//当前索引(height数组)、是否为正面(用于交换位图)

 

<2>WndProc中的实现细节:

case WM_CREATE:
	//加载位图
	hInstance = ((LPCREATESTRUCT)lParam)->hInstance;

	hBmp[0] = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
	hBmp[1] = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2));

	GetObject(hBmp[0], sizeof(BITMAP), &bmp);

	sBmp.cx	= bmp.bmWidth;
	sBmp.cy	= bmp.bmHeight;

	//设置计时器
	SetTimer(hwnd, ID_TIMER, 120, NULL);
  	return 0;

 

case WM_SIZE:
	//获取客户区大小
	sClient.cx	= LOWORD(lParam);
	sClient.cy	= HIWORD(lParam);

	//修改位图当前位置坐标
	ptBmp.x		= (sClient.cx - sBmp.cx) / 2;
	ptBmp.y		= (sClient.cy - sBmp.cy) / 2;
	return 0;

 

	case WM_PAINT:
		//按照一定比例缩放位图
		hdc = BeginPaint(hwnd, &ps);

		hdcMem = CreateCompatibleDC(hdc);
		SelectObject(hdcMem, hBmp[isFirst]);

		SetStretchBltMode(hdc, COLORONCOLOR);
		StretchBlt(hdc, ptBmp.x, ptBmp.y, sBmp.cx, sBmp.cy, hdcMem, 0, 0, 200, 200, SRCCOPY);

		DeleteDC(hdcMem);
		EndPaint(hwnd, &ps);
		return 0;

 

	case WM_TIMER:
		//修改当前显示的位图高度
		sBmp.cy		= height[curIndex];

		//如果位图高度变为最小(也就是几乎看不太清的程序),就交换位图
		if(sBmp.cy == height[3])
		{
			isFirst = !(isFirst & 1);
		}

		//如果位图高度之前是原始大小,那么应该停顿一会儿,这里停顿当前线程1秒
		else if(sBmp.cy == height[0])
		{
			Sleep(1000);
		}

		//修改位图显示位置,保证居中显示
		ptBmp.y		= (sClient.cy - sBmp.cy) / 2;

		//索引下一个高度(height)
		curIndex = (curIndex + 1) % NUM;

		//重绘
		InvalidateRect(hwnd, NULL, TRUE);
		return 0;

 

 

点击下载源代码以及相关资源

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129150.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • top命令 详解_top命令的用法

    top命令 详解_top命令的用法top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.1...

    2022年9月25日
    3
  • 使用Java代码过滤掉乱码字符

    使用Java代码过滤掉乱码字符转自:http://www.cnblogs.com/en-heng/p/5320024.html最近在日志数据清洗时遇到中文乱码,如果只要有非中文字符就将该字符串过滤掉,这种方法虽简单但并不可取,因为比如像Xperia™主題、天天四川麻将Ⅱ这样的字符串也会被过滤掉。1.Unicode编码Unicode编码是一种涵盖了世界上所有语言、标点等字符的编码方式,简单一点说

    2022年6月11日
    95
  • 教授就是大学[通俗易懂]

    教授就是大学[通俗易懂]教授就是大学有一则广为流传的关于艾森豪威尔将军的故事。话说家喻户晓的二战英雄艾森豪威尔将军在1952年接受了哥伦比亚大学的聘请,担任这家著名常青藤大学的校长。上任伊始,将军在下属的陪同下巡视校园,会见校董会、行政人员和学生,最后参加了学校教授为他举行的欢迎大家。在一阵热烈的掌声之后,将军致辞。他首先谦恭地对有机会会见在场的全体哥伦比亚大学的“雇员”们表示万分的荣幸。这时,只见哥大德高望重的物理

    2022年9月29日
    4
  • PyQt5布局管理之QVBoxLayout(二)[通俗易懂]

    PyQt5布局管理之QVBoxLayout(二)[通俗易懂]QVBoxLayout前言采用QVBoxLayout类,按照从上到下的顺序添加控件本节内容较少,演示两个实例,便于明白QVBoxLayout(垂直布局)的使用实例:QVBoxLayout的正常使用importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QVBoxLayout,QPushButt…

    2022年6月16日
    70
  • PLC编程基础[通俗易懂]

    PLC编程基础[通俗易懂]1.开始一个新的工程按照以下步骤来建立一个新的工程:  (1)选择工具栏中的新建按钮。      (2)定义工程的设备条目。  (3)保存工程当一个新的PLC被添加到工程中的时候,将创建以下空表:1)空的本地符号表;2)全局符号表;3)IO表;4)PLC内存数据;5)PLC设置数据。2.编写一个梯形图程序下面以一个交通灯次序控制为例说明,该交通灯次序是一个标准的英国交通灯次序,顺序如下:只有红灯→…

    2025年10月5日
    3
  • centOS yum命令详解

    centOS yum命令详解一 yum 介绍 Yum 全称为 YellowdogUpd Modified 是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器 基于 RPM 包管理 能够从指定的服务器自动下载 RPM 包并且安装 可以自动处理依赖性关系 并且一次安装所有依赖的软件包 无须繁琐地一次次下载 安装 yum 提供了查找 安装 删除某一个 一组甚至全部软件包的命令 而且命令简洁而又好记

    2025年8月31日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号