WINCE下实现类似iphone滑动效果_人生几何_新浪博客

在iPhone下当显示界面从一个界面过渡到另一个界面时,会有一个过渡效果:显示窗口会从右至左缓缓显示出来,这是一个非常好的用户体验,那么在WINCE下如何实现该效果?

      实现方法主要用到了“缓存DC”的概念,我们先把两个界面内容合并拷贝到一个内存DC里,然后在另一个界面显示时,依次从左自右将内存DC绘制到屏幕DC,这样就实现了界面的过渡效果。详细介绍请参照norains大侠博客http://blog.csdn.net/norains/archive/2010/06/14/5670538.aspx。在这里一并向norains前辈表示感谢,经常看他的文章,受益匪浅。

      以下是具体的实现代码,测试用的WINCE设备的屏幕分辨率为800*480。

 

[cpp]  view plain copy
  1. HDC hCurDC;                 // 当前屏幕DC句柄  
  2. HDC hMemDC;                 // 内存DC句柄  
  3. HBITMAP hBitmap,hOldBitmap; // 位图句柄  
  4.   
  5. // 获取当前屏幕DC句柄  
  6. hCurDC=GetWindowDC(NULL);  
  7. // 创建内存DC  
  8. hMemDC=CreateCompatibleDC(hCurDC);  
  9. // 创建兼容位图  
  10. hBitmap=CreateCompatibleBitmap(hCurDC,800*2,480);  
  11. // 将兼容位图选入到内存DC  
  12. hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);  
  13. // 将当前屏幕DC拷贝到内存DC  
  14. BitBlt(hMemDC, 0, 0, 800, 480, hCurDC, 0, 0,SRCCOPY);  
  15. // 将需要显示的窗口界面拷贝到内存DC(与当前的DC合并)  
  16. RECT rect={800,0,1600,480};  
  17. DrawImage(hMemDC,L"//NAND2//back.bmp",rect);  
  18.   
  19. // 实现滑动效果(新界面从右往左滑动)  
  20. for(DWORD dwPos = 0; dwPos <= 800;)     
  21. {          
  22.          // 将内存DC绘制到目标窗口DC  
  23.     BitBlt(GetDC(hWnd),     
  24.         0,     
  25.         0,     
  26.         800,     
  27.         480,     
  28.         hMemDC,     
  29.         dwPos,     
  30.         0,    
  31.         SRCCOPY);  
  32.     dwPos+=100;// 改增量可以控制滑动速度  
  33. };  
  34. // 恢复并释放环境  
  35. SelectObject(hMemDC,hOldBitmap);  
  36. DeleteObject(hBitmap);    
  37. DeleteDC(hMemDC);  

      基于以上原理,还可以实现界面的从左至右,从上至下以及从下至上的滑动显示。下面的代码实现了界面从屏幕顶端往底端滑动效果。

 

[cpp]  view plain copy
  1. HDC hDC;                    // 当前窗体DC句柄  
  2. HDC hMemDC;                 // 内存DC句柄  
  3. HBITMAP hBitmap,hOldBitmap; // 位图句柄  
  4.   
  5. // 获取当前窗体DC句柄  
  6. hDC=GetDC(hWnd);  
  7. // 创建内存DC  
  8. hMemDC=CreateCompatibleDC(hDC);  
  9. // 创建兼容位图  
  10. hBitmap=CreateCompatibleBitmap(hDC,320,480);  
  11. // 将兼容位图选入到内存DC  
  12. hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);  
  13. // 将图片绘制到内存DC  
  14. RECT rect={0,0,320,480};  
  15. DrawImage(hMemDC,L"//NAND2//clock.jpg",rect);  
  16.   
  17. // 实现滑动效果(界面从屏幕顶端往底端滑动)  
  18. for(DWORD dwPos = 480; dwPos > 0;)     
  19. {          
  20.     // 将内存DC绘制到目标窗口DC  
  21.     BitBlt(GetDC(hWnd),     
  22.         (800-320)/2,     
  23.         0,     
  24.         (800-320)/2+320,     
  25.         480,     
  26.         hMemDC,     
  27.         0,     
  28.         dwPos,    
  29.         SRCCOPY);  
  30.     dwPos-=20;// 该增量可以控制滑动速度  
  31. };  
  32. // 恢复并释放环境  
  33. SelectObject(hMemDC,hOldBitmap);  
  34. DeleteObject(hBitmap);    
  35. DeleteDC(hMemDC);  

界面从屏幕顶端往底端滑动显示效果图:

 

 

DrawImage实现代码:

 

[cpp]  view plain copy
  1.     
  2. void DrawImage(HDC hdc,LPCWSTR iconPath,RECT rect)  
  3. {  
  4.     IImage * m_pImage=NULL;  
  5.     IImagingFactory * m_pImagingFactory=NULL;  
  6.   
  7.     HRESULT hr;  
  8.   
  9.     // COM初始化  
  10.     if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))  
  11.     {    
  12.         goto END;  
  13.     }  
  14.   
  15.     // 创建COM实例  
  16.     if(FAILED(hr = CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**) &m_pImagingFactory)))  
  17.     {  
  18.         goto END;  
  19.     }  
  20.   
  21.     // 从文件中创建图片  
  22.     if(FAILED(hr = m_pImagingFactory->CreateImageFromFile(iconPath, &m_pImage)))  
  23.     {  
  24.         goto END;  
  25.     }  
  26.     // 绘制图片  
  27.     if(FAILED(hr = m_pImage->Draw(hdc,&rect,NULL)))  
  28.     {  
  29.         goto END;  
  30.     }  
  31.   
  32. END:  
  33.     // 释放资源  
  34.   
  35.     if(m_pImage != NULL)  
  36.     {  
  37.         m_pImage->Release();  
  38.         m_pImage = NULL;  
  39.     }  
  40.   
  41.     if(m_pImagingFactory != NULL)  
  42.     {  
  43.         m_pImagingFactory->Release();  
  44.         m_pImagingFactory = NULL;  
  45.     }  
  46.   
  47.     CoUninitialize();  
  48. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值