下面的代码在OnDraw时间里,OnTimer控制m_nPostion变量。
结果是一个时刻只能有一条直线,OnTimer每Invalidate一次。原来的直线没了。
怎么在内存绘图,OnTimer显示,保证原来的图像还有呢?
void CDynViewView::OnDraw(CDC* pDC)
{
CDynViewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
    CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen *oldpen;
oldpen=pDC->SelectObject(&pen);
pDC->MoveTo(m_nPositon,100);
pDC->LineTo(m_nPositon,100-m_nPositon);
pDC->SelectObject(oldpen);
// TODO: add draw code for native data here
}

解决方案 »

  1.   

    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    CBitmap bmp;
    CRect rc;
    GetWindowRect(&rc); bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
    dcMem.SelectObject(bmp);
    ;    CPen pen;
    pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
    CPen *oldpen;
    oldpen=dcMem->SelectObject(&pen);
    dcMem->MoveTo(m_nPositon,100);
    dcMem->LineTo(m_nPositon,100-m_nPositon);
    dcMem->SelectObject(oldpen);
    pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);
      

  2.   

    这不是内存绘图,呵呵~OnDraw会重画整个界面,所以你应当建立一个数据结构来储存你画的图,否则上次画的图保留不到下次的。
      

  3.   

    我是想用一个内存,直接在OnTimer事件改变
    变量的值,同时绘制内存块。再在OnDraw里面把
    内存copy一份出来,应该不用自定义的数据结构才是啊
      

  4.   

    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    CBitmap bmp;
    CRect rc;
    GetWindowRect(&rc); bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
    dcMem.SelectObject(bmp);
    ;    CPen pen;
    pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
    CPen *oldpen;
    oldpen=dcMem.SelectObject(&pen);
    dcMem.MoveTo(m_nPositon,100);
    dcMem.LineTo(m_nPositon,100-m_nPositon);
    dcMem.SelectObject(oldpen);
    pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);
    ======================================================================
    默认是黑色的,插入句:
    CBrush brush(RGB(xx,xx,xx));//颜色自己喜欢
    dcMem.FillRect(&rc,&brush);
      

  5.   

    为什么要用到:
    bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
    dcMem.SelectObject(bmp);
      

  6.   

    内存DC里的位图为默认的1x1单色位图,能画什么?keke
    所以要创建兼容位图并选入内存DC..
      

  7.   

    这样处理:把CDC dcMem和CBitmap bmp,*pOldBitmap放入类中,然后将它初始化..
    void CxxxView::ChuShiHua()
    {
    CDC *pDC = GetDC();
    dcMem.CreateCompatibleDC(pDC);
    CRect rc;
    GetClientRect(&rc);bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
    pOldBitmap = dcMem.SelectObject(&bmp);
    CBrush brush(RGB(xx,xx,xx));//颜色自己喜欢
    dcMem.FillRect(&rc,&brush); //刷..
    ReleaseDC(pDC);}
    然后可以在OnDraw或OnPaint里用dcMem绘图了..
    最后记得析构
    dcMem.SelectObject(pOldBitmap);
    dcMem.DeleteDC();
    bmp.DeleteObject();