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

来源(博客频道 - CSDN.NET)

From: http://blog.csdn.net/xuqiang918/article/details/29592239

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

标签: 对话框类CFormView

2014-06-09 16:51 1528人阅读

分类:【win32 MFC】(66)

我们创建一个对话框资源后,然后创建一个类(假设为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);

Link: http://www.asm32.net/article_details.aspx?id=7197


浏览次数 0 发布时间 2017-04-18 08:00:03 从属分类 C/C++ 【评论】【 】【打印】【关闭
 
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | Python | 书签 | ASP.Net书签 | 京ICP备09029108号-1