在晚上找了一些资料,也下了一些程序,看过一些FAQ,之后自己动手写了一下,发现按照经典的步骤:
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));//绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();之后又重载了:WM_ERASEBKGND消息我自己的程序:
void CSlidView::OnPaint() 
{
CPaintDC dc(this); 
CRect clientRect;
GetClientRect( &clientRect );
CDC MemDC;
CBitmap Membitmap;
Membitmap.CreateCompatibleBitmap( &dc, clientRect.Width(), clientRect.Height() );
MemDC.CreateCompatibleDC( &dc );
CBitmap *pOldBitmap = MemDC.SelectObject( &Membitmap );
MemDC.FillSolidRect( 0, 0, clientRect.Width(), clientRect.Height(), RGB( 255, 255, 255 ) );
MemDC.Ellipse( &clientRect );
dc.BitBlt( 0, 0, clientRect.Width(), clientRect.Height(), &MemDC, 0, 0, SRCCOPY );
MemDC.DeleteDC();
Membitmap.DeleteObject();
}BOOL CSlidView::OnEraseBkgnd(CDC* pDC) 
{
return CView::OnEraseBkgnd(pDC);
}

解决方案 »

  1.   

    发现自己的程序运行后,和没有使用双缓存的程序效果是一样的,郁闷ing
      

  2.   

    汗~~在View类里边请重载OnDraw
    在Dialog类里边才是重载OnPaint不信的话,你可以新建一个空白的MFC Dialog based程序,把你这里的OnPaint贴到这个程序的OnPaint中,就能看到效果了。
      

  3.   

    你把双缓存的程序放到OnPaint函数中,当然什么用处也没有了。本身用双缓存的方法就是为了替换OnPaint来消除抖动的。
    将双缓存程序另建一个函数。在需要刷新的地方调用这个函数,而不是去调用OnPaint。
      

  4.   

    void CSlidView::OnDraw(CDC* pDC)
    {
    CSlidDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc); CPaintDC dc(this); 
    CRect clientRect;
    GetClientRect( &clientRect );
    CDC MemDC;
    CBitmap Membitmap;
    Membitmap.CreateCompatibleBitmap( &dc, clientRect.Width(), clientRect.Height() );
    MemDC.CreateCompatibleDC( &dc );
    CBitmap *pOldBitmap = MemDC.SelectObject( &Membitmap );
    MemDC.FillSolidRect( 0, 0, clientRect.Width(), clientRect.Height(), RGB( 255, 255, 255 ) );
    MemDC.Ellipse( &clientRect );
    dc.BitBlt( 0, 0, clientRect.Width(), clientRect.Height(), &MemDC, 0, 0, SRCCOPY );
    MemDC.DeleteDC();
    Membitmap.DeleteObject();
    }多谢两位的指点^_^
    如果我没有理解错的话,我把重载的OnPaint函数删掉,放到OnDraw之后,应该是这样吧?
    这下连椭圆都没有了......
      

  5.   

    void CSlidView::OnDraw(CDC* pDC)
    {
    CSDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc); CRect clientRect;
    GetClientRect( &clientRect );
    CDC MemDC;
    CBitmap Membitmap;
    Membitmap.CreateCompatibleBitmap( pDC, clientRect.Width(), clientRect.Height() );
    MemDC.CreateCompatibleDC( pDC );
    CBitmap *pOldBitmap = MemDC.SelectObject( &Membitmap );
    MemDC.FillSolidRect( 0, 0, clientRect.Width(), clientRect.Height(), RGB( 255, 255, 255 ) );
    MemDC.Ellipse( &clientRect );
    pDC->BitBlt( 0, 0, clientRect.Width(), clientRect.Height(), &MemDC, 0, 0, SRCCOPY );
    Membitmap.DeleteObject();
    MemDC.DeleteDC();
    }
      

  6.   

    在OnDraw里就好好的用系统提供的pDC
      

  7.   

    已经有一个pDC了,为什么还要CPaintDC dc(this);
      

  8.   

    TO:pomelowu(羽战士)哈哈,说的对啊......我在继续研究,等到我搞定双缓存了,就结帖啊^_^顺便说一句,你给的程序段我试过了......还是抖动
      

  9.   

    抖动的话,在OnEraseBkgnd()里面
    return TRUE;
      

  10.   

    借贵宝地问一下 其实重载OnPaint 和重载OnDraw有些什么不同呢?需要注意些什么?
      

  11.   

    OnPaint是对WM_PAINT消息的直接响应,而OnDraw则是在OnPaint中调用的。