你向内存DC上画什么,上面就显示什么,前提是内存DC必须先用SelectObject选中一个Bitmap。
OnPaint和内存DC不搭界的。

解决方案 »

  1.   

    一个可以画画的程序,我想在刷新页面后,所画的内容不会消失,可是画的内容不能放在OnPaint()里吧,我听说好象内存DC可以办到,请前辈们指教
      

  2.   

    下面的程序是从我最早的一个工程里拷出来的,写的很滥,但原理可以用用。
    首先在OnCreate里创建和初始化内存位图,然后在OnDraw里显示位图就可以了
    // CDC *MemDC;
    // CBitmap *BitmapDC;
    int CChessView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CView::OnCreate(lpCreateStruct) == -1)
    return -1;
    // TODO: Add your specialized creation code here
    srand((unsigned)time(NULL));
    CDC *DC=GetDC();
    MemDC=new CDC;
    BitmapDC=new CBitmap;
    MemDC->CreateCompatibleDC(DC);
    BitmapDC->CreateCompatibleBitmap(DC,640,480);
    MemDC->SelectObject(BitmapDC);
    CBitmap TempMap;
    TempMap.LoadBitmap(IDB_BOARD);
    MemDC->SelectObject(&TempMap);
    //以下还有若干行
    }void CChessView::OnDraw(CDC* pDC)
    {
    CChessDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    RECT rect;
    static BOOL IsFirst=TRUE;
    if(IsFirst==TRUE)
    {
    IsFirst=FALSE;
    pDC->GetClipBox(&rect);
    pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,MemDC,rect.left,rect.top,SRCCOPY);
    Begin();
    return;
    }
    pDC->GetClipBox(&rect);
    pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,MemDC,rect.left,rect.top,SRCCOPY);
    }
      

  3.   

    先建一个内存位图和一个内存DC,dc.SelectObject(位图),画图时画到这个DC上,实际就是把画的图像保存在了位图里,在OnDraw的时候直接BitBlt这个DC上的位图到屏幕DC上去就OK了。
      

  4.   

    谢谢sxbyl(痛苦的白菜)和gamedragon(gamedragon)
    我会给你们加分的
    我知道OnPaint()是响应WM_PAINT消息的,也见过OnDraw(),哪位能给我讲讲OnPaint()和OnDraw()的区别吗
      

  5.   

    就View来说可以认为是一样的,CWnd类接收WM_PAINT消息,调用OnPaint,CView类在OnPaint中调用OnDraw。OnDraw提供了一个CDC指针,这个DC的原点就是你的View的左上角(可能在可视范围外),你不用管当前的View是否滚动了(对于CScrollView)。而OnPaint里你只能用CPaintDC(this)得到当前客户区的DC,其原点就是可视范围的左上角。
    也就是说OnDraw比OnPaint方便了那么一点点。