OnPaint() 
{
CPaintDC dc(this); // device context for painting
SetFont();
CDC *wDC;
wDC=GetDC();
//////////////////////////////////
(*pDC).CreateCompatibleDC(wDC);//但是执行到这里就会出现错误
CRect rect;
this->GetClientRect(rect);
CBitmap bmpFace;
bmpFace.CreateCompatibleBitmap(wDC,rect.Width(),rect.Height());
CBitmap *pOldBmp=NULL;
pOldBmp=pDC->SelectObject(&bmpFace);
pDC->SetBkMode(TRANSPARENT);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
pDC->SelectObject(pBrush);
DrawFunc();
wDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),pDC,rect.left,rect.top,SRCCOPY);
//////////////////////////////////
pBrush->DeleteObject();
bmpFace.DeleteObject();
ReleaseDC(wDC);
DeleteDC(*pDC);
DeleteFont();
// Do not call CDialog::OnPaint() for painting messages
}出现的错误是unhandleexception *.exe MFC42D.DLL 0xc000005 access violation
是想在内存DC中绘制,之后再显示  防止屏刷很闪。
其中CDC *pDC;但是不知道为什么在ClassView中出现的是MemDC

解决方案 »

  1.   

    其中CDC *pDC;但是不知道为什么在ClassView中出现的是MemDC这个重新编译就好了,怎么没人理我呢??
      

  2.   

    pDC 是啥?我怎么看到,类中的变量还是全局变量?
      

  3.   

    GetDC()---> ReleaseDC() CreateDC()   和CreateIC()---> DeleteDC()确定你的DC是新的不?已经CreateCompatibleDC过,再次调用CreateCompatibleDC,就会出错
      

  4.   

    pDC 如果是全局的话,你得在onpaint最后把他释放掉,通常双缓冲的内存dc应该是局部的, dc只能创建一次,再次创建会报错,不会你下断点试,第一次不会报错..
      

  5.   

    @#2楼  pDC是全局的内存DC变量
      

  6.   


    DeleteDC(*pDC);
    这句话就是释放呀~
      

  7.   

    怎么搞了那么多DC了,双缓冲写法应该很容易写的
    CPaintDC dc(this);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    ....
    ...
    dc.BitBlt(...,&memDC,...SRCCOPY);
    memDC.DeleteDC();
    ...
      

  8.   


    SetFont();
    //////////////////////////////////
    pDC->CreateCompatibleDC(&dc);//这步出错
    CRect rect;
    this->GetClientRect(rect);
    CBitmap bmpFace;
    bmpFace.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
    CBitmap *pOldBmp=NULL;
    pOldBmp=pDC->SelectObject(&bmpFace);
    pDC->SetBkMode(TRANSPARENT);
    CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
    pDC->SelectObject(pBrush);
    DrawFunc();
    dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),pDC,rect.left,rect.top,SRCCOPY);
    //////////////////////////////////
    pBrush->DeleteObject();
    bmpFace.DeleteObject();
    pDC->DeleteDC();
    DeleteFont();我修改了   可是还是这种情况~  这个内存DC第一次用  完全不知道怎么使用,本来程序是用GetDC();得到的pDC进行绘画的,但是闪得实在厉害
      

  9.   


    闪的原因知道,就是整个图是自己绘画出来的,但是我只是想移动其中的一个圆,让它跟随鼠标移动,是想局部重画可能会比较好,我去查查。只是不明白自己pDC->CreateCompatibleDC(&dc);这步怎么会出错呢?
      

  10.   

    掉下去了,顶一下吧~  
    用InvalidateRect(rect,TRUE);
    UpdateWindow();
    感觉没什么反应,但是只是用前面一个画的话,会有很多阴影,然后速度还跟不上
    有阴影大概是我的绘图区域选的有点问题吧~
      

  11.   

    你断点跟进去,查看,运行到pDC->CreateCompatibleDC(&dc)时,pDC中的DC句柄是不是空的,如果不是空的,说明你之前赋值过,那肯定会出错
      

  12.   


    CPaintDC dc(this);
    这句话肯定是对dc赋值了,那应该怎么做呢?直接pDC->CreateCompatibleDC(NULL);?
    开始迷茫了~内存DC与DC到底是什么关系?我进行了局部刷新,可是
    InvalidateRect(rect,TRUE);
    UpdateWindow();
    执行之后之前画的内容还在,用什么可以擦除一下呢?
      

  13.   

    pDC->CreateCompatibleDC(&dc)  我说的是pDC中的值,你查看他的HDC之类的是不是为0。内存DC与DC到底是什么关系?
    具体的不清楚, 内存DC就是相当于把窗口放在内存中,在内存中直接画,画完后复制到屏幕的DC上,应该也叫做设备DC吧我的理解
      

  14.   

    哈,解决了,谢谢在座各位~
    是我用指针调用CreateCompatibleDC函数是不可以的不过能告诉我局部重绘的时候应该怎样就能将原来绘画的东西刷掉,是需要先用背景画刷刷一次吗???
      

  15.   

    (*pDC),pDC从外部传进来的时候已经Create好了,你不可以Create第二次,否则会有Assert Fialure。
      

  16.   

    InvalidateRect可以对局部进行刷新。
      

  17.   

    还有就是,C++中(*pDC).CreateCompatibleDC()这种写法可以改为pDC->CreateCompatibleDC()。
      

  18.   


    这个知道  只是我重绘的时候,以前绘制的还会在,弄得屏幕黑乎乎的
    关于CDC难道我有理解错了吗?我之前没有对pDC进行创建的,只是CDC *pDC定义了一下而已,但是指针调用函数就是不行的,因为指针没有初始化~
      

  19.   

    OnPaint里,你直接使用CPaintDC dcPaint(this)就可以了。
      

  20.   

    然后再dcPaint上作画。
    如果你要用双缓冲贴图。
    那就这样, CPaintDC dcPaint(this); CDC dcMem;
    dcMem.CreateCompatibleDC(&dcPaint); CBitmap bitmap;
    bitmap.LoadBitmap(IDB_BITMAP1); BITMAP bmpObj;
    bitmap.GetBitmap(&bmpObj); dcMem.SelectObject(bitmap); CRect rcClient;
    GetClientRect(rcClient);
    dcPaint.StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, bmpObj.bmWidth, bmpObj.bmHeight, SRCCOPY);
      

  21.   

    指针应该是可以调用那个函数的,你用指针的话,前面要new一个,之后还要记得delete掉。对指针不了解的话,还是用对象比较实在,不容易出错!
    如果可以的话,不必清空,直接覆盖即可
      

  22.   


    恩,new放在窗口初始化函数应该就可以不用delete了
      

  23.   

    恩,new放在窗口初始化函数应该就可以不用delete了错,放在WM_CLOSE函数中释放~
    因为如果运用到嵌入式系统,就会占用内存~
      

  24.   

    CreateCompatible... // 放在OnCreate种比较好