窗体视图是实质上是一个包含控件的视图。 这些控件基于对话框模板资源进行布局。
第一部分 基础知识
1.1 类的继承派生关系
-->CWnd-->CDialog
-->CWnd-->CView-->CScrollView-->CFormView
CWnd是MFC的一个窗口类,这个类里几乎封装了所有关于窗口操作的API函数
另外很多窗口类都是继承于这个类,如CButtn 按钮类,CStatic CListBox等等。
2.2 两种创建方式
2.2.1 第一种是在创建单文档应用程序过程中直接将派生于CView类的CXXXView类的基类修改为CFormView,除了经典的文档视类结构之外,MFC将额外生成一个对话框资源,ID为"IDD_XXX_FORM".同时,该对话框通过枚举与"CXXXView"类关联.
2.2.2
按照默认流程创建完单文档应用程序了之后再创建基于CFormView类的对话框时最好不要手动修改CXXXView的基类为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的对象.
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);//重要的地方
第3步调用到了CMyClassDlg的Create函数,这个函数是继承CFormView类的,在CFormView中它是保护类型,为了可以访问它,我们要在CMyClassDlg中重载它,类型为公开类型。
参考:
https://docs.microsoft.com/zh-cn/cpp/mfc/reference/cformview-class?view=vs-2019