CDC* pDC2;
pDC2->FromHandle(gdipDraw.hMemDC);//获取类成员HDC,报错跳出

解决方案 »

  1.   

    CDC* pDC2; 
    你的指针都没有分配空间,不出错才怪~
      

  2.   

    因为FromHandle本身是静态函数,从语法上讲这样使用是没有问题的,通常都是这样用:
      CDC* pdc = CDC::FromHandle(hdc);
    或者
      CDC* pdc = NULL;
      pdc = pdc->FromHandle(hdc);
    这两种用法是一样的,看起来是空指针,但静态函数调用是允许使用空指针的。你的问题不是语法,而是FromHandle的内部机制,MFC会把一些句柄资源永久或者临时缓存起来,只有被缓存的句柄才能用FromHandle转换成类指针,而只有MFC创建的句柄才会被缓存(比如CDC::CreateDC/CWnd::Create之类),外部句柄没有机会缓存,恰好你代码中提供的HDC是外部创建的(看名称貌似是GDI+创建的),超出了MFC的管理范围,不能被FromHandle查询到。解决方案:
    CDC dc;
    dc.Attach(gdipDraw.hMemDc);
    // do something
    dc.Detach();
      

  3.   

    如果说,我CDC dc dc.Attach(gdipDraw.hMemDc);//dc局部变量.Attach()不需要Deach()
      

  4.   

      pDC = new CDC();
      

  5.   

    不调用Detach()的话,CDC类的析构函数里会调用Detact操作,还会做DeleteDC删除DC操作
      

  6.   

    FromHandle是静态函数,是不需要分配,但是如果你后面使用pDC,比如绘制东西的话,肯定会出错的。