处理CFormView类 -- 保护类型的构造函数和Create函数(讨厌的东西!!!)

我们创建一个对话框资源后,然后创建一个类(假设为CMyClass)来管理它。如果这个类(CMyClass)是从CFormView派生出来的,并且要在其他类中使用CMyClass的对象,则应如下处理。

因为CFormView的构造函数和析构函数都是保护类型的,所以在其他类中是无法访问的,因此无法直接在其他类中声明CMyClass的对象。那么要使用CMyClass,该如何做呢?有两种方法:

方法一:

在CMyClass类的头文件中声明其他类为友元类。显然不是太爽

方法二:

1.在其他类的头文件中声明CMyClass类的指针,如:

CMyClass *m_pMyCls;

(注: 这里不一定要作为类的成员变量, 如果只是需要创建而不需要管理该对象时, 完全可以作为临时变量)

2.在其他类的构造函数中,添加如下代码:

m_pMyCls = (CMyClass*)(RUNTIME_CLASS(CMyClass)->CreateObject());//最重要的地方

http://wangqingyun84.blog.163.com/blog/static/790836172010921101218514/

(注: 既然CMyClass是自定义类, 那么这里当然可以把构造函数public一下了. 不过关键是这种方法不错, 值得借鉴 -- 即如何创建构造函数是protected成员的对象, 即使用CRuntimeClass的CreateObject()函数).

3.在其他类的OnCreate函数中,添加如下代码:

RECT rect;
GetClientRect(&rect);
m_pMyCls->Create(NULL, "Option window", WS_CHILD|WS_VISIBLE, rect, this, 0, NULL);//重要的地方

(注: 不知道为什么非要在人家类的OnCreate函数中创建, 实际上个人认为只要在父窗口的窗口结构体被创建以后都是可以的, 因为我试过了在构造函数中是不可以的, 呵呵. 我试了其它的地方, 比如CView::OnInitialUpdate和CDialog::OnInitDialog都应该没有问题的)

4.因为第3步调用到了CMyClass的Create函数,这个函数是继承CFormView类的,在CFormView中它是保护类型,因此,为了可以访问它,我们要在CMyClass中重载它,类型为公开类型。

(注: 方法很简单, 只需要加上该函数(在VC6的ClassWizard中给该类增加虚函数Create即可, 默认类型即是公开的, 且不需要修修改其代码)

方法三(自己加的):

当分隔窗口时可以直接创建对象, 如下:

splitterWnd.CreateView(0,0,RUNTIME_CLASS(CMyClass),CSize(400,100),pContext);

你可能感兴趣的:(类,对话框,CFormView)