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中重载它,类型为公开类型。

  • 相关阅读:
    MongoDB数据库学习总结
    windows及linux环境下永久修改pip镜像源的方法
    enumerate枚举函数
    sum求和函数
    zip拉链函数
    python实现面对面快传
    redis实现发布订阅
    python自定义classmethod
    Nginx为什么支持那么高的并发量?
    java进阶(28)--Map集合
  • 原文地址:https://www.cnblogs.com/whl2012/p/4749320.html
Copyright © 2011-2022 走看看