急急急!!滚动条滚动之后出现白条问题-绘图软件(CSrollView)在线等!!

asdjy123 2013-07-23 11:46:56
在滚动条滚动之后出现一条条白线,有没有遇见类似的情况的,如下图显示:


OnDraw()代码:
void CDrawYunView::OnDraw(CDC* pDC)
{
if (!pDC)
return;

CDrawYunDoc* pDoc = GetDocument();//获得文档类对象指针,向导自动添加的
ASSERT_VALID(pDoc);////验证文档对象

if (!pDoc)
return;

//添加代码
CDC dc;//定义一个设备上下文
CDC* pDrawDC = pDC;
CBitmap bitmap;//定义位图对象
CBitmap* pOldBitmap;

// only paint the rect that needs repainting只绘画需要绘画的区域
CRect client;
pDC->GetClipBox(client);//该函数得到一个能够完整包含当前可见区域的最小矩形的大小。该可见区域由当前的剪切区域定义或由剪切路径所定义或者由任何重叠的窗口所定义
CRect rect = client;
DocToClient(rect);//调整坐标系,因View派生于CScrollView的,在OnPaint里面还要调用DocToClient()进行下坐标转换的

if (!pDC->IsPrinting())//CDC类成员,IsPrinting 确定正在使用的设备上下文是否用于打印
{
// draw to offscreen bitmap for fast looking repaints
if (dc.CreateCompatibleDC(pDC))//该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联。//建立一個相容的DC重畫來加速視覺更新
{
if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))//该函数创建与指定的设备环境相关的设备兼容的位图//為相容DC提供畫布
{
OnPrepareDC(&dc, NULL);//在OnDraw成员函数调用前被框架函数调用用于屏幕显示
pDrawDC = &dc;

// offset(偏移) origin(原点) more because bitmap(位图) is just piece(块) of the whole drawing(整张图)
dc.OffsetViewportOrg(-rect.left, -rect.top);//只是调节视口原点的偏移量,//令装置座标(rect.left, rect.top)位于view视窗的左上角
pOldBitmap = dc.SelectObject(&bitmap);//SelectObject:选取GDI绘制对象
dc.SetBrushOrg(rect.left % 8, rect.top % 8);//設置Brush起點

// might as well clip to the same rectangle:还不如夹相同的矩形
dc.IntersectClipRect(client);//该函数创建了一个新的剪切区域,该区域是当前剪切区域和一个特定矩形的交集。
}
}
}

// paint background 绘制背景
CBrush brush;
if (!brush.CreateSolidBrush(pDoc->GetPaperColor()))//CreateSolidBrush()该函数创建一个具有指定颜色的逻辑刷子。
return;

brush.UnrealizeObject();//重设brush
pDrawDC->FillRect(client, &brush);//该函数用指定的画刷填充矩形,此函数包括矩形的左上边界,但不包括矩形的右下边界

if (!pDC->IsPrinting() && m_bGrid)
DrawGrid(pDrawDC);//调用绘制网格线函数

pDoc->Draw(pDrawDC, this);//函数包括绘制对象和绘制8或2点的句柄光标。

if (pDrawDC != pDC)
{
pDC->SetViewportOrg(0, 0);//设置视区起点
pDC->SetWindowOrg(0,0);//设置设备上下文的窗口起点
pDC->SetMapMode(MM_TEXT);//设置当前映射模式,MM_TEXT 每个逻辑单位转换为1设备像素。 正x是在右侧;正y向下递增
dc.SetViewportOrg(0, 0);//设置视区起点
dc.SetWindowOrg(0,0);//设置设备上下文的窗口起点
dc.SetMapMode(MM_TEXT);//设置当前映射模式,MM_TEXT 每个逻辑单位转换为1设备像素。 正x是在右侧;正y向下递增。
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&dc, 0, 0, SRCCOPY);//BitBlt()用于从原设备中复制位图到目标设备,SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
dc.SelectObject(pOldBitmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
}

}
...全文
564 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdjy123 2013-07-24
  • 打赏
  • 举报
回复
引用 3 楼 happyparrot 的回复:
pDC->GetClipBox(client); 你这里的矩形区域大小对不对啊。调试看看
根据你的提示我扩大client的范围之后解决了此问题,谢谢
引用 8 楼 hdg3707 的回复:
CDC dc;//定义一个设备上下文 CDC* pDrawDC; CBitmap bitmap;//定义位图对象 CBitmap* pOldBitmap; CRect client; CRect rect; CBrush brush; 在头文件里定义,然后在构造函数里把指针初始化成NULL就行了,不过用完后指针要释放,同时选择的画刷等用完后也要释放,就是选择时要保存原先的,用完后再选择原先的,你程序里已有了,就是用SelectObject
我把上面6个变量没有定义在.h文件中,还是定义在OnDraw()中,但在运行了几十次OnDraw()函数之后查看任务管理器的内存情况,发现内存没有增加,是否是因为OnDraw()是成员函数里的局部变量,编译器自动释放了(注:我没有进行释放资源)
hdg3707 2013-07-24
  • 打赏
  • 举报
回复
CDC dc;//定义一个设备上下文 CDC* pDrawDC; CBitmap bitmap;//定义位图对象 CBitmap* pOldBitmap; CRect client; CRect rect; CBrush brush; 在头文件里定义,然后在构造函数里把指针初始化成NULL就行了,不过用完后指针要释放,同时选择的画刷等用完后也要释放,就是选择时要保存原先的,用完后再选择原先的,你程序里已有了,就是用SelectObject
asdjy123 2013-07-23
  • 打赏
  • 举报
回复
引用 4 楼 fishion 的回复:
看着有点像是滚动导致刷新不及时,或者可以参考下我博客里的一篇文章
求有链接? 开始我也怎么猜测的 但我调试时鼠标按下滚动条进行滚动时就立马进入OnDraw()进行重绘了,发觉挺及时的
asdjy123 2013-07-23
  • 打赏
  • 举报
回复
引用 3 楼 happyparrot 的回复:
pDC->GetClipBox(client); 你这里的矩形区域大小对不对啊。调试看看
调试时client的值 {top=309 bottom=304 left=-390 right=488} GetClipBox()是系统函数怎么判断区域大小对不对??
asdjy123 2013-07-23
  • 打赏
  • 举报
回复
引用 2 楼 hdg3707 的回复:
感觉是内存不足了,这种情况是用完资源后没释放,下次又申请资源,你把类似CBitmap bitmap;//定义位图对象 CBitmap* pOldBitmap; 这样的定义放在头文件里,只定义一次,然后用完就释放,包括其它需要释放的都要释放
我把里面的都在.h中定义,但出现内存出错,
CDC dc;//定义一个设备上下文
	CDC* pDrawDC;
	CBitmap bitmap;//定义位图对象
	CBitmap* pOldBitmap;
	CRect client;
	CRect rect;
	CBrush brush;
其中指针我在构造函数指向NULL,其它的初始化怎么进行, ”这样的定义放在头文件里,只定义一次,然后用完就释放,包括其它需要释放的都要释放“您的意思的释放是在OnDraw()函数里吗,能举下例子吗?
fishion 2013-07-23
  • 打赏
  • 举报
回复
看着有点像是滚动导致刷新不及时,或者可以参考下我博客里的一篇文章
快乐鹦鹉 2013-07-23
  • 打赏
  • 举报
回复
pDC->GetClipBox(client); 你这里的矩形区域大小对不对啊。调试看看
hdg3707 2013-07-23
  • 打赏
  • 举报
回复
感觉是内存不足了,这种情况是用完资源后没释放,下次又申请资源,你把类似CBitmap bitmap;//定义位图对象 CBitmap* pOldBitmap; 这样的定义放在头文件里,只定义一次,然后用完就释放,包括其它需要释放的都要释放
asdjy123 2013-07-23
  • 打赏
  • 举报
回复
1、白线的出现好像的在滚动条滚动一段距离出现的,滚动速度越快,两条线的距离约大。 2、好像是在滚动重绘时重绘的区域小了(就小一条白线的的面积)。 3、各位大神看看OnDraw()哪里修改下 顶

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧