在一个基于对话框的程序中dialog 和他上面的 Static 是什么关系呢?
我在自己的dialog中加入一个Static对象然后在Static中GetParent()->GetDC();为什么得不到dialog的DC呢?我跟进去看了一下。到GetParent()得到的指针地址与dialog一样的,但一GetDC()得到的指针就与在dialog中得到的不同了。为什么?如何解决?还望高手赐教

解决方案 »

  1.   

    测试了一下,dialog与其上的static应该是父子关系阿。GetParent没有问题。
    CDC *pDCC = GetDC();
    CDC *pDC = m_S.GetParent()->GetDC();
    m_S是个CStatic对象。获取的CDC对象是一样的。当然,指针地址不一样,但都是对话框的CDC
      

  2.   

    我也试过了,我用的是GetDlgItem得到的Static也没有问题的:CDC *p = GetDlgItem(IDC_STATIC)->GetParent()->GetDC();
    p->TextOut(100,100,"sdfsdfsdf");
    this->GetDC()->TextOut(120, 120, "ffffff");
      

  3.   

    是不是这样
    每次GetDC()都会给对话框生成一个DC如果上一个DC还没有释放,那么肯定就不一样了。
      

  4.   

    是不是这样
    每次GetDC()都会给对话框生成一个DC如果上一个DC还没有释放,那么肯定就不一样了。
    ===========================================================================
    完全正确!
    CDC资源是有限的。对于每个窗口来说,最多只有5个。所以你用完了赶紧释放吧。
      

  5.   

    1 对于dialog 和他上面的控件属于所属关系. 空间从属于dialog 窗口的。可以根据handle 来获得它的DC MSDN 上说
    对于公用的设备环境,GetDC每次获得设备环境时都给它赋予缺省值。对于属于类的或者私有的设备环境,GetDC保持原来的属性不变。在随后的图形设备接口(GDI)函数中可以使用设备环境以在客户区中绘图.由于在同一时刻只有五个公用设备环境可供使用,因此如果释放设备环境时失败,可能导致其它应用程序不能访问设备环境。 可能每次取得都是不同的DC 吧。 CStatic* mStHandle = (CStatic*) GetDlgItem (IDC_STATIC);
    CWnd* mWnd=  mStHandle->GetParent () ;
    CDC* mDC =mWnd->GetDC (); mDC->TextOut (0,100,"sdfds"); CDC* mDC2 = this->GetDC ();
    mDC2->TextOut (100,100,"sdfdsf");如我的测试在我的环境中mDC 的值为:0x00421120 而 mDC2 的值就为0x004210e0 这样当然不同了