您的位置:首页 > 其它

如何在其他类中实现继承自CFormView类的对象

2015-08-21 23:41 232 查看
  今天项目开发中,我们创建了一个对话框资源,并创建了一个派生自CFormView的类(假设为CMyClassDlg)来管理它。

CMyClassDlg.h

#pragma once
// CMyClassDlg 窗体视图

class CMyClassDlg : public CFormView
{
DECLARE_DYNCREATE(CMyClassDlg)

protected:
CMyClassDlg();           // 动态创建所使用的受保护的构造函数
virtual ~CMyClassDlg();

public:
enum { IDD = IDD_TASK_DLG };
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
};


CMyClassDlg.cpp

// MyClassDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "Test.h"
#include "MyClassDlg.h"

// CMyClassDlg
IMPLEMENT_DYNCREATE(CMyClassDlg, CFormView)

CMyClassDlg::CMyClassDlg()
: CFormView(CMyClassDlg::IDD)
{
}

CMyClassDlg::~CMyClassDlg()
{
}

void CMyClassDlg::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMyClassDlg, CFormView)
END_MESSAGE_MAP()

// CMyClassDlg 诊断
#ifdef _DEBUG
void CMyClassDlg::AssertValid() const
{
CFormView::AssertValid();
}

#ifndef _WIN32_WCE
void CMyClassDlg::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif //_DEBUG

// CMyClassDlg 消息处理程序


问题:如何在其他类中使用CMyClassDlg对象?

  由于CFormView的构造函数和析构函数都是保护类型的,故在其他类中是无法访问的,导致无法直接在其他类中声明CMyClass的对象。

如何破?-->(两种方案)

方案一:

  在CMyClassDlg类的头文件中声明其他类为友元类。

方案二:

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

CMyClassDlg *m_pMyClassDlg;


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

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


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

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


  4.因为第3步调用到了CMyClassDlg的Create函数,这个函数是继承CFormView类的,在CFormView中它是保护类型,为了可以访问它,我们要在CMyClassDlg中重载它,类型为公开类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: