首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2013-08-04 
急急急!!滚动条滚动之后出现白条问题-绘图软件(CSrollView)在线等!!在滚动条滚动之后出现一条条白线,有没

急急急!!滚动条滚动之后出现白条问题-绘图软件(CSrollView)在线等!!
在滚动条滚动之后出现一条条白线,有没有遇见类似的情况的,如下图显示:
急滚动条滚动之后出现白条有关问题-绘图软件(CSrollView)!

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);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
}

}

画图软件 滚动条 VS2010
[解决办法]
感觉是内存不足了,这种情况是用完资源后没释放,下次又申请资源,你把类似CBitmap bitmap;//定义位图对象
    CBitmap* pOldBitmap;
这样的定义放在头文件里,只定义一次,然后用完就释放,包括其它需要释放的都要释放
[解决办法]
pDC->GetClipBox(client);
你这里的矩形区域大小对不对啊。调试看看
[解决办法]
看着有点像是滚动导致刷新不及时,或者可以参考下我博客里的一篇文章
[解决办法]
CDC dc;//定义一个设备上下文
    CDC* pDrawDC;
    CBitmap bitmap;//定义位图对象
    CBitmap* pOldBitmap;
    CRect client;
    CRect rect;
    CBrush brush;
在头文件里定义,然后在构造函数里把指针初始化成NULL就行了,不过用完后指针要释放,同时选择的画刷等用完后也要释放,就是选择时要保存原先的,用完后再选择原先的,你程序里已有了,就是用SelectObject

热点排行