最近在做一个显示波形,我的想法是采用双缓冲,先画一部分,然后按滚动条的时候,删除上次画的,然后重新绘制新的,但是现在程序实现的和我想的不一样,只有开头是画的,不知道是哪里的问题。就光开头一点能正常的现实,后面的数据就无法显示了!void CMovecountView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
nHPos=GetScrollPos(SB_HORZ);
         Invalidate();
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);

}void CMovecountView::OnDraw(CDC* pDC)
{ CMovecountDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CPoint ptCenter;
CRect rect,ellipseRect;
GetClientRect(&rect);
ptCenter = rect.CenterPoint();
CDC dcMem;                                                  //用于缓冲作图的内存DC
CBitmap bmp;                                                 //内存中承载临时图象的位图
dcMem.CreateCompatibleDC(pDC);               //依附窗口DC创建兼容内存DC
bmp.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//创建兼容位图
dcMem.SelectObject(&bmp);                          //将位图选择进内存DC
dcMem.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,不然会是黑色

if(m_openflag)
{

int size=0;
size=m_leftdatalist.GetSize();
CPen pen1(PS_SOLID,2,RGB(0,110,120));
CPen *pold=NULL;
pold=dcMem.SelectObject(&pen1);

for(int i=nHPos;i<nHPos+2000;i++)//nHPos为当前滚动条的位置,画当前数组中2000个点的数据
{
if (m_leftdatalist.GetAt(i)!=0&&i!=0)
{
dcMem.MoveTo(i,m_leftdatalist.GetAt(i)/10);
dcMem.LineTo(i,m_leftdatalist.GetAt(i+1)/10);
}
}
}


pDC->BitBlt(nHPos,0,rect.Width(),rect.Height(),&dcMem,nHPos,0,SRCCOPY);//将内存DC上的图象拷贝到前台
dcMem.DeleteDC();   
bmp.DeleteObject(); //删除句柄
}

解决方案 »

  1.   

    for(int i=nHPos;i<nHPos+2000;i++)//nHPos为当前滚动条的位置,画当前数组中2000个点的数据
    {
    if (m_leftdatalist.GetAt(i)!=0&&i!=0)
    {
    dcMem.MoveTo(i-nHPos,m_leftdatalist.GetAt(i)/10);
    dcMem.LineTo(i-nHPos,m_leftdatalist.GetAt(i+1)/10);
    }
    }
    }
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,nHPos,0,SRCCOPY);//将内存DC上的图象拷贝到前台
    dcMem.DeleteDC();  
    bmp.DeleteObject(); //删除句柄
    我随手改得,不知道对不对。
      

  2.   

    dcMem.LineTo(i+1-nHPos,m_leftdatalist.GetAt(i+1)/10);
      

  3.   


    还是不行,
    这句:bmp.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//创建兼容位图
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,nHPos,0,SRCCOPY);创建完了以后,始终是在0,0~width,height画了一个图像框架,并没有随着OnHScroll的按动有任何的变化
    是不是需要先把内存中的数据给删除掉再说?可是后面已经给删除掉了啊