小弟是一VC新手,最近做一类似画笔的绘图程序
现在希望在绘图时候能同时在内存DC中绘图,再在窗口
刷新时进行重绘,参照一些资料和自己的理解,在
ondraw中写了如下代码:
if(NULL == this->m_pMemDC){
this->m_pBitmap=new CBitmap;
this->m_pMemDC=new CDC;
this->m_pMemDC->CreateCompatibleDC(pDC);
this->m_pBitmap->CreateCompatibleBitmap(this->m_pMemDC,1024,768);
this->m_pMemDC->SelectObject(this->m_pBitmap);
}
pDC->BitBlt(0,0,1024,768,this->m_pMemDC,0,0,SRCCOPY);
绘图的时候也对m_pMemDC做了和pDC同样的操作,但编译出错.
请指教

解决方案 »

  1.   

    http://search.csdn.net/Expert/topic/2274/2274735.xml?temp=.7932703
    编译出错是写法的问题
      

  2.   

    抱歉啊 失误 不是编译时出错,编译通过的 是运行的时候出错
    在CMyDrawView类里定义了 CDC* m_pMemDC和CBitmap *m_pBitmap
    mousemove里时间里做了一些绘图工作 如:
    pDC->MoveTo(m_ptStart);
    pDC->LineTo(point);
    m_pMemDC->MoveTo(m_ptStart);
    m_pMemDC->LineTo(point);
    然后就在ondraw函数中写有上述语句,希望能将当前客户区内保存在内存DC中,并在重绘的时候显示
      

  3.   

    我具体的绘图是在mousemove里写的
    是不是这样的话无法绘制到内存DC中?
      

  4.   

    我的view类中CDC* m_pMemDC和CBitmap *m_pBitmap是成员
    是不是因为在ondraw时候才对m_pMemDC进行初始化
    而造成了在mousemove时候出错?
      

  5.   

    CDC MemDC;
    CBitmap bitmap;
    bitmap.LoadBitmap(IDB_BITMAP1);             // Load bitmap from resource
    MemDC.CreateCompatibleDC(pDC);
    CBitmap* pOldbit = MemDC.SelectObject(&bitmap);
    pDC->BitBlt(0,0,300,300,&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(pOldbit);                // Restore driver context
      

  6.   

    我随手写了一个,你参考一下:
    void CA1View::OnDraw(CDC* pDC)
    {
    CA1Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CDC cdc;
    cdc.CreateCompatibleDC(pDC); CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(pDC, 400, 500); cdc.SelectObject(&bitmap);
    cdc.TextOut(0, 0, "afasfadfasdfgadsfad"); pDC->BitBlt(0, 0, 400, 500, &cdc, 0, 0, SRCCOPY);
    // TODO: add draw code for native data here
    }
      

  7.   

    你这种的我也试过了 也成功 不过是在ONDRAW函数里绘图才行
    我在ONMOUSEMOVE里绘图就不行了
    以下是我的程序部分了
    void CMyDrawView::OnDraw(CDC* pDC)
    {
    CMyDrawDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here if(NULL == this->m_pMemDC){
    this->m_pBitmap=new CBitmap;
    this->m_pMemDC=new CDC;
    this->m_pMemDC->CreateCompatibleDC(pDC);
    this->m_pBitmap->CreateCompatibleBitmap(this->m_pMemDC,1024,768);
    this->m_pMemDC->SelectObject(this->m_pBitmap);
    }
    pDC->BitBlt(0,0,1024,768,this->m_pMemDC,0,0,SRCCOPY);
    this->m_pBitmap->DeleteObject();
    this->m_pMemDC->DeleteDC();
    }
    void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    CDC *pDC=GetDC();
    CPen pen;
    pen.CreatePen(PS_SOLID,this->m_nLineWidth,this->m_cLineColor);
    pDC->SelectObject(&pen);
    this->m_pMemDC->SelectObject(&pen);
    if (m_bLMouseDown)
    {
    if(m_nDrawType==1)
    {
    pDC->MoveTo(m_ptStart);
    pDC->LineTo(point); m_pMemDC->MoveTo(m_ptStart);
    m_pMemDC->LineTo(point);
    m_ptStart=point;
    }
                      .........
              }
              m_ptOld=point;
    ReleaseDC(pDC);
    }
      

  8.   

    你的GDI对象没有释放
    创建新的画笔时,要保存旧的画笔
    oldpen=dc.selectobject(&newpen)
    然后在画笔用完结束后重新选择
    dc.selectobject(oldpen);恢复旧画笔最后
    newpen.deleteobject()
    新的画笔对象就被释放了
    不知道是不是这样
      

  9.   

    this->m_pBitmap->DeleteObject();
    this->m_pMemDC->DeleteDC();
    可能这两句导致错误,你释放掉后没有赋为NULL,下一次内存没有分配就直接使用,导致失败!
    其实没必要在OnDraw(...)中分配内存DC内存,
    可以在构造函数里进行New, 在析构函数中释放,
    不管在什么地方释放内存,如下格式供参考:
    /*xxx --- 指针 */if (xxx != NULL)
    {
        delete xxx;
        xxx = NULL;
    }