看了网上的一篇文章,里面介绍怎么实现Iphone的平滑效果。
网站地址:http://www.itwis.com/html/net/netother/20100618/8578.html
效果如图:
两个不同的图片代表的是不同的窗口,红色的方框指代的是我们的屏幕。当我们从左到右进行绘制时,如果绘制的帧数足够多,在红色框框中看到的,就是平滑的滚动。
如果以伪代码的形式,那么我们的程序结构就可以如此:
//获取两个窗口的HDC
HDC hdcWnd1 = GetRealDC(hWnd1);
HDC hdcWnd2 = GetRealDC(hWnd2);
//将两个窗口DC组合成一个缓存HDC
HDC hdcAll = CombineDC(hdcWnd1,hdcWnd2);
//源HDC,即真正绘制到屏幕上的HDC。
HDC hdcSource = GetDC(NULL);
//如果绘制的起点等于HDC的一半时,意味着已经绘制到最后,直接跳出循环
for(DWORD dwPos = 0; dwPos < GetWidthForDC(hdcAll) / 2; ++ dwPos)
{
//将缓存HDC绘制到源HDC中,以实现平滑滚动的效果
BltBit(hdc,
0,
0,
ScreenWidth,
ScreenHeight,
hdcAll,
dwPos,
0,
SRCCOPY)
}
根据这个,我也想试下这个效果。于是我就拿以前做的例子做下试验。
这是一个控件使用的例子,左边按钮,右边显示标签页。
然后想改进标签页的切换。
然后在按钮里面添加这些内容做测试。
// 测试
CDC* pDC=GetDC();
CRect Rect2;
Rect2.left = 112;
Rect2.top = 20;
Rect2.bottom = Rect2.top + 190;
Rect2.right = Rect2.left + 370;
DWORD width = Rect2.right - Rect2.left;
DWORD hight = Rect2.bottom - Rect2.top;
HDC hdcwnd1 = ::GetDC(App[2]->GetSafeHwnd()); // App[] 是标签页的类实例 ,由App[0]->Create(IDD_DIALOG1,this); 之类创建
HDC hdcwnd2 = ::GetDC(App[1]->GetSafeHwnd());
if (hdcwnd1 == NULL || hdcwnd2 == NULL)
{
MessageBox(_T("得不到句柄"));
}
HDC hdcAll = CreateCompatibleDC(hdcwnd2);
HBITMAP hBitMap=CreateCompatibleBitmap(pDC->m_hDC,width*2,hight);
SelectObject(hdcAll,hBitMap);
BitBlt(hdcAll,0,0,width,hight,hdcwnd1,0,0,SRCCOPY);
BitBlt(hdcAll,width,0,width,hight,hdcwnd2,0,0,SRCCOPY);
for (DWORD dwPos = 0;dwPos <= width;dwPos += 2)
{
BitBlt(pDC->m_hDC,
Rect2.left,
Rect2.top,
width,
hight,
hdcAll,
dwPos,
0,
SRCCOPY
);
}
效果如图,虽然得到切换的效果,不过得不到标签页的HDC,显示的东西很奇怪。
恩,修改后不用标签页,然后就对不准了,而且切换还是错的,最后跳的才是正确的也没,好糟~~~~
恩,第三次修改
切换时没问题啦,不过好像getdc 只能得到看得见的窗口的内容~~,有个方案,不用getdc ,而是用对话框的图片,好像能行,不过要生成图片好像也挺麻烦的。
这一次修改其实还可以,就是有一个bug,你要切换的话,至少得截屏一次,如果三个页面的话,至少有两次会有空白,如果每个页面都访问到了的话,之后就正常了。