在iPhone下当显示界面从一个界面过渡到另一个界面时,会有一个过渡效果:显示窗口会从右至左缓缓显示出来,这是一个非常好的用户体验,那么在WINCE下如何实现该效果?
实现方法主要用到了“缓存DC”的概念,我们先把两个界面内容合并拷贝到一个内存DC里,然后在另一个界面显示时,依次从左自右将内存DC绘制到屏幕DC,这样就实现了界面的过渡效果。详细介绍请参照norains大侠博客http://blog.csdn.net/norains/archive/2010/06/14/5670538.aspx。在这里一并向norains前辈表示感谢,经常看他的文章,受益匪浅。
以下是具体的实现代码,测试用的WINCE设备的屏幕分辨率为800*480。
HDC hCurDC; // 当前屏幕DC句柄 HDC hMemDC; // 内存DC句柄 HBITMAP hBitmap,hOldBitmap; // 位图句柄 // 获取当前屏幕DC句柄 hCurDC=GetWindowDC(NULL); // 创建内存DC hMemDC=CreateCompatibleDC(hCurDC); // 创建兼容位图 hBitmap=CreateCompatibleBitmap(hCurDC,800*2,480); // 将兼容位图选入到内存DC hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap); // 将当前屏幕DC拷贝到内存DC BitBlt(hMemDC, 0, 0, 800, 480, hCurDC, 0, 0,SRCCOPY); // 将需要显示的窗口界面拷贝到内存DC(与当前的DC合并) RECT rect={800,0,1600,480}; DrawImage(hMemDC,L"//NAND2//back.bmp",rect); // 实现滑动效果(新界面从右往左滑动) for(DWORD dwPos = 0; dwPos <= 800;) { // 将内存DC绘制到目标窗口DC BitBlt(GetDC(hWnd), 0, 0, 800, 480, hMemDC, dwPos, 0, SRCCOPY); dwPos+=100;// 改增量可以控制滑动速度 }; // 恢复并释放环境 SelectObject(hMemDC,hOldBitmap); DeleteObject(hBitmap); DeleteDC(hMemDC);
基于以上原理,还可以实现界面的从左至右,从上至下以及从下至上的滑动显示。下面的代码实现了界面从屏幕顶端往底端滑动效果。
HDC hDC; // 当前窗体DC句柄 HDC hMemDC; // 内存DC句柄 HBITMAP hBitmap,hOldBitmap; // 位图句柄 // 获取当前窗体DC句柄 hDC=GetDC(hWnd); // 创建内存DC hMemDC=CreateCompatibleDC(hDC); // 创建兼容位图 hBitmap=CreateCompatibleBitmap(hDC,320,480); // 将兼容位图选入到内存DC hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap); // 将图片绘制到内存DC RECT rect={0,0,320,480}; DrawImage(hMemDC,L"//NAND2//clock.jpg",rect); // 实现滑动效果(界面从屏幕顶端往底端滑动) for(DWORD dwPos = 480; dwPos > 0;) { // 将内存DC绘制到目标窗口DC BitBlt(GetDC(hWnd), (800-320)/2, 0, (800-320)/2+320, 480, hMemDC, 0, dwPos, SRCCOPY); dwPos-=20;// 该增量可以控制滑动速度 }; // 恢复并释放环境 SelectObject(hMemDC,hOldBitmap); DeleteObject(hBitmap); DeleteDC(hMemDC);
界面从屏幕顶端往底端滑动显示效果图:
DrawImage实现代码:
/********************************************************************** 函数名: DrawImage 功能: 从文件中加载图片并绘制到DC 参数: [in]hdc: 目标DC [in]iconPath: 图片的路径 [in]rect 绘制区域 返回值: 无 说明: 支持bmp、jpg、png、gif等主流类型图片 创建者: firehood 2010-8-11 **********************************************************************/ void DrawImage(HDC hdc,LPCWSTR iconPath,RECT rect) { IImage * m_pImage=NULL; IImagingFactory * m_pImagingFactory=NULL; HRESULT hr; // COM初始化 if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED))) { goto END; } // 创建COM实例 if(FAILED(hr = CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**) &m_pImagingFactory))) { goto END; } // 从文件中创建图片 if(FAILED(hr = m_pImagingFactory->CreateImageFromFile(iconPath, &m_pImage))) { goto END; } // 绘制图片 if(FAILED(hr = m_pImage->Draw(hdc,&rect,NULL))) { goto END; } END: // 释放资源 if(m_pImage != NULL) { m_pImage->Release(); m_pImage = NULL; } if(m_pImagingFactory != NULL) { m_pImagingFactory->Release(); m_pImagingFactory = NULL; } CoUninitialize(); }