设置比较大的界面时,拉动界面会出现闪动问题,而闪动问题可以用双缓冲的方法来解决,双缓冲方法具体方法如下:
同样是在OnDraw(CDC *pDC)中:
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图
MemDC.MoveTo(……); MemDC.LineTo(……); //将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
双缓冲能解决闪屏问题
但是有些界面时有背景图片的,那样不仅仅是闪动的问题,而且伴随而来的是不能正确显示背景图的问题,主要问题出在:
GetClientRect(rect);///取得客户区域
这个只能获得当前显示的区域,也就是拉动后才出现的区域GetClientRect()函数是读不到的,这样的话就会导致界面拖动一些背景图片设置不能正确显示的问题,此时可以利用GetTotalSize()函数,函数详情如下
CScrollView::GetTotalSize
CSize GetTotalSize( ) const;
返回值:
返回以逻辑单位表示的滚动视的总尺寸。水平尺寸被保存在CSize返回值的cx成员中。垂直尺寸被保存在cy成员中。
说明:调用GetTotalSize来获取滚动视的当前水平和垂直尺寸。
从而,具体解决该类问题的方案,本人尝试过的方法是在OnDraw()函数中修改
void CMgcheck::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
CSize cs=((CScrollView*)this)->GetTotalSize();
CRect rect;
rect=CRect(0,0,cs.cx,cs.cy);
//GetClientRect(rect);///取得客户区域
//pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域
//双缓冲解决闪屏问题
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,cs.cx,cs.cy);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillRect(rect,&m_brushBackground);
pDC->BitBlt(0,0,cs.cx,cs.cy,&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
以上便是个人一点小小的总结