MFC界面拖动出错问题(闪动与没正确显示背景)

本文介绍了MFC界面在拖动时出现闪动问题的解决方案,通过双缓冲技术有效防止闪屏。同时,针对拖动后背景图片无法正确显示的问题,提出使用CScrollView的GetTotalSize函数来获取滚动视图的总尺寸,从而确保背景完整填充。通过修改OnDraw函数,实现了拖动界面时背景图片的正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置比较大的界面时,拉动界面会出现闪动问题,而闪动问题可以用双缓冲的方法来解决,双缓冲方法具体方法如下:

同样是在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();

}

 

以上便是个人一点小小的总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值