我写了个小程序。通过CEdit框来输入MFC的类名称,在CListCrl中显示该类的继承关系。我的类名识别是这样实现的:
CRuntimeClass* CCRuntimeDlgDlg::CheckClass()
{
CRuntimeClass* pClass;
for (pClass = CDialog::GetRuntimeClass(); pClass != NULL; pClass = pClass->m_pBaseClass)
    {
       if (strcmp(m_classname, pClass->m_lpszClassName) == 0)
                return pClass;
    }
return NULL;}
这样的话这能实现CDialog类及其他的父类们。如何实现识别MFC中的每个类?

解决方案 »

  1.   

    从CObject派生的类都能通过RuntimeClass实现,但不是从CObject派生的就不好办了。
      

  2.   

    那我就实现CObject派生类。具体的代码如何实现?
      

  3.   

    // in MFC.H
    struct CRuntimeClass
    {
    // Attributes
    LPCSTR m_lpszClassName;
    int m_nObjectSize;
    UINT m_wSchema; // schema number of the loaded class
    CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
    CRuntimeClass* m_pBaseClass;
    // CRuntimeClass objects linked together in simple list
    static CRuntimeClass* pFirstClass; // start of class list
    CRuntimeClass* m_pNextClass; // linked list of registered classes
    };
    你每在CEdit中输入一个类名就必须有加上如下的宏
      DECLARE_DYNAMIC(CYourClassName); 
       IMPLEMENT_DYNAMIC(CYourClassName, YourBaseClassName)
    这样做是为了建立一个类型网,这样才能访问YourClassName的YourBaseClassName
    你的类型网都没有建立起来,所以不能访问基类的CRuntimeClass