zoukankan      html  css  js  c++  java
  • 如何在其他类中实现继承自CFormView类的对象

      今天项目开发中,我们创建了一个对话框资源,并创建了一个派生自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中重载它,类型为公开类型。

  • 相关阅读:
    Effective C# 原则37:使用标准的配置机制(译)
    Effective C# 原则31:选择小而简单的函数(译)
    Effective C# 原则24:选择申明式编程而不是命令式编程(译)
    Effective C# 原则34:创建大容量的Web API(译)
    Effective C# 原则27:避免使用ICloneable(译)
    Effective C# 第4章:创建基于二进制的组件(译)
    Effective C# 原则39:使用.Net验证(译)
    Effective C# 原则35:选择重写函数而不是使用事件句柄(译)
    Effective C# 原则25: 让你的类型支持序列化(译)
    Effective C# 原则38:使用和支持数据绑定(译)
  • 原文地址:https://www.cnblogs.com/whl2012/p/4749320.html
Copyright © 2011-2022 走看看