• 如何在其他类中实现继承自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中重载它,类型为公开类型。

  • 相关阅读:
    MySQL数据库8(十九)外键
    MySQL数据库8(十八)用户权限管理
    HTML基本样式
    HTML5之部分新特性
    MySQL数据库8(十七)数据库的备份还原
    MySQL数据库8(十六)子查询
    MySQL数据库(十五)联合查询与连接查询
    MySQL数据库8(十四)聚合函数和运算符
    MySQL数据库8(十三)高级数据操作之select指令
    MySQL数据库8(十二)高级数据操作
  • 原文地址:https://www.cnblogs.com/whl2012/p/4749320.html
Copyright © 2020-2023  润新知