你的问题不是是否分配内存,而是要用内存DC,有关内存DC的使用已经有太多的帖子,最近的是〈2、VC中如何预先在内存显示直线、文字等〉!

解决方案 »

  1.   

    首先创建内存DC:
    CClientDC dc(this);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);然后在memDC中进行你需要的绘制工作绘制完成后用
    dc.BitBlt(x, y, nWidth, nHeight, &memDC, xSrc, ySrc, SRCCOPY);将内存DC中已绘制好的内容拷贝到屏幕DC中。
    这种方法效率相当高,不会形成屏幕闪烁。试试看。
      

  2.   


    响应C???View的WM_ERASEBKGND消息,去掉CView::OnEraseBkgnd(pDC)的调用,直接返回TRUE;OnDraw代码示例:
    //采用100*100的MemDC,根据你的实际情况调整;
    void C???View::OnDraw(CDC* pDC)
    {
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);    CBitmap    bmpDC;
        bmpDC.CreateCompatibleBitmap(pDC, 100, 100);
        memDC.SelectObject(&bmpDC);
        //你的绘制代码
        DrawMyGraph(&memDC);    pDC->BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
        bmpDC.DeleteObject();
        memDC.DeleteDC();
    }void C???View::DrawMyGraph(CDC* pDC)
    {
        // 你的绘制代码,大小可变是你另外的控制,这里不提供!
        memDC.Rectangle(10, 10, 60, 60);
    }
      

  3.   

    如果要实现画一个变大的矩形这种简单的绘图,用SetROP2设置绘图模式为R2_NOTXORPEN
    对上一次的矩形重画来擦除,再重画就行了。
    C???view::OnTimer(...)
    {
    int iOldMode = m_pClientDC->SetROP2(R2_NOTXORPEN);
    rcBorder//上一次画的矩形
    m_pClientDC->Rectangle(&rcBorder);
    rcBorder.//增大,成为本次画的,
    m_pClientDC->Rectangle(&rcBorder);
    m_pClientDC->SetROP2(iOldMode);
    }
    如果要实现比较复杂的动画就的用内存dc了。如Holly所说,灵活变通就行了。