=============================================================
标题:wince滑屏效果的实现
摘要:
备注:wince 5.0 + vs2005
日期:2010.7.16
姓名:朱铭雷
=============================================================
之前读了norains侠的一篇文章——“IPhone平滑滚动效果的实现”,原文地址是:
http://blog.csdn.net/norains/archive/2010/06/14/5670538.aspx
觉得写的浅显易懂,有必要尝试一下。原理比较简单,中途又得到了n侠的指点,很快完成了该效果的测试。下面记录一下步骤。整屏滑动需要两张图片,一张滑出,一张滑入。
所采用的wince设备的分辨率为800*480,首先创建一个缓冲DC,大小为1600*480,然后将两幅位图一左一右紧挨着绘制到该缓冲DC中。代码如下:
hdc = ::GetDC(m_hWnd); hdcMem = CreateCompatibleDC(hdc); hBitmap = CreateCompatibleBitmap(hdc, 1600, 480); hOldMemBmp = (HBITMAP)SelectObject(hdcMem, hBitmap); hdcBmp = CreateCompatibleDC(hdc); hBmpDis = LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,0); hOldBmp = (HBITMAP)SelectObject(hdcBmp,hBmpDis); BitBlt(hdcMem,0,0,800,480,hdcBmp,0,0,SRCCOPY); hBmpDis = LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP2),IMAGE_BITMAP,0,0,0); SelectObject(hdcBmp,hBmpDis); BitBlt(hdcMem,800,0,1600,480,hdcBmp,0,0,SRCCOPY);
接下来的代码是实现滑屏效果的关键,其实是非常简单的。
//缓慢的左出右入 for(DWORD dwPos = 0; dwPos <= 800; ) { //将缓存HDC绘制到源HDC中,以实现平滑滚动的效果 BitBlt(hdc, 0, 0, 800, 480, hdcMem, dwPos, 0, SRCCOPY); dwPos = dwPos + 1; } //快速的左出右入 for(DWORD dwPos = 0; dwPos <= 800; ) { //将缓存HDC绘制到源HDC中,以实现平滑滚动的效果 BitBlt(hdc, 0, 0, 800, 480, hdcMem, dwPos, 0, SRCCOPY); dwPos = dwPos + 50; } //快速的右出左入 for(int dwPos = 800; dwPos >= 0; ) { //将缓存HDC绘制到源HDC中,以实现平滑滚动的效果 BitBlt(hdc, 0, 0, 800, 480, hdcMem, dwPos, 0, SRCCOPY); dwPos = dwPos - 50; }
下面的图显示屏幕正在滑动中: