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

  • 相关阅读:
    最近在搞微信支付,说说流程,免得遗忘
    好记性不如烂笔头-Mysql查找如何判断字段是否包含某个字符串
    用jquery操作字体颜色覆盖当前页面的css设置
    页面白屏并且报错PHP Parse error: syntax error, unexpected end of file in 试了很久总算解决了
    bootstrap的datetimepicker.js的结束时间大于开始时间,当前日期之前的代码
    使用ClassLoader类装载器获取系统资源
    关于App class loader的总结
    ClassLoader 详解及用途(写的不错)
    webRequest
    Tomcat学习之ClassLoader
  • 原文地址:https://www.cnblogs.com/whl2012/p/4749320.html
Copyright © 2011-2022 走看看