在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实现代码:
- 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();
- }