我的程序中经常要用到下面的代码:
CDC* pDC=GetDC();
CDC frontDC;
frontDC.CreateCompatibleDC(pDC);为了使用方便,我把CDC frontDC;语句放在了头文件里,因为上面那段程序运行的时候很多,这样会经常执行CDC frontDC;我以为会影响速度的,没想到这么一做,编译是能通过,可是运行时候出错,请问这是为什么?

解决方案 »

  1.   

    我把CDC frontDC;语句放在了头文件里---------------------------------
    放在了哪里?
      

  2.   

    见msdn的帮助说明:
    cwnd::GetDC();
    该函数的返回值可能是临时的不能被保存以供将来使用!
      

  3.   

    首先可以看出
    CDC* pDC=GetDC();
    CDC frontDC;
    frontDC.CreateCompatibleDC(pDC);
    经常使用,说明frontDC是一个局部变量,
    会不停的被改写,
    而放到头文件里就完全不是这么回了,
    同二楼,它的值根本就不是你所想要的了
      

  4.   

    我把frontDC申明为:.h文件
    public:
        CDC frontDC;以后在使用的时候:.cpp文件
    CDC* pDC=GetDC();
    frontDC.CreateCompatibleDC(pDC);
    有什么不对?
      

  5.   

    public:
        CDC frontDC;那frontDC为你的类的成员,
    最好在构造函数里为其初始化.
    同时,在类里它是一个全局的,
    如果你多次调用就会有问题
      

  6.   

    第一:声明一个变量并不会占用太大的开销,到时候面Create...之类的开销较大。
    第二:你将其声明为类的成员变量也无不可,除了有些画蛇添足之外,但是你Create了一个DC,有没有DeleteDC()呢?当它是局部成员变量的时候,每次调用离开有效范围,该对象自动销毁了,因此资源泄漏没有造成后果。
      

  7.   

    先frontDC.DeleteDC();接着再CreateComatibleDC(...).就算frontDC无效DeleteDC也不会抛出异常。
      

  8.   

    保存HDC!用GetDC()获得的将是临时对象,但对应句柄则应该是唯一的.
    .h:HDC m_hDc ;
    .cpp:m_hDc = GetDC()->GetSafeHdc() ;
    附:GetDC()应该和ReleaseDC()配对使用,不然有资源泄漏
    临时对象的成因,参见:
    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=193097