VS2019缺失CFormView的解决方案
"在Visual Studio 2019 (VS2019) 中,当你尝试创建一个MFC项目时,可能会发现默认的类模板不包含CFormView。CFormView是MFC(Microsoft Foundation Classes)框架中用于显示基于对话框的视图类,通常用于构建用户界面。为了解决这个问题,你需要手动创建CFormView的子类并配置相关代码。" 在VS2019中创建MFC项目时,如果你希望使用CFormView,你需要遵循以下步骤: 1. 手动创建类:首先,你需要创建一个新的头文件(例如,`CDisplayView.h`)和对应的源文件(例如,`CDisplayView.cpp`)。这些文件将定义你的自定义视图类,它将继承自CFormView。 2. 编写头文件:在`CDisplayView.h`中,包含必要的头文件,如`#include "pch.h"`,`#include "resource.h"`,以及`CFormView`的头文件。声明你的类`CDisplayView`,并使用`DECLARE_DYNCREATE`宏声明动态创建支持。定义类的构造函数和析构函数,以及模态窗口的ID(在这里是`IDD_DISPLAYVIEW`)。为了调试,可以使用`DECLARE_MESSAGE_MAP`宏来声明消息映射。 ```cpp #pragma once #include "pch.h" #include "resource.h" class CDisplayView : public CFormView { DECLARE_DYNCREATE(CDisplayView) protected: CDisplayView(); public: virtual ~CDisplayView(); enum { IDD = IDD_DISPLAYVIEW }; // IDD_DISPLAYVIEW 是模态窗口的ID #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); protected: DECLARE_MESSAGE_MAP() }; ``` 3. 编写源文件:在`CDisplayView.cpp`中,包含头文件`#include "CDisplayView.h"`,并实现`DECLARE_DYNCREATE`宏所声明的`IMPLEMENT_DYNCREATE`,以支持动态创建。还要提供类的构造函数和析构函数的实现,以及消息映射的开始和结束。对于调试,可提供`AssertValid`和`Dump`方法的实现。 ```cpp #include "pch.h" #include "CDisplayView.h" // CDisplayView IMPLEMENT_DYNCREATE(CDisplayView, CFormView) // IDD_DISPLAYVIEW 模态框的ID CDisplayView::CDisplayView() : CFormView(IDD_DISPLAYVIEW) { } CDisplayView::~CDisplayView() { } BEGIN_MESSAGE_MAP(CDisplayView, CFormView) END_MESSAGE_MAP() #ifdef _DEBUG void CDisplayView::AssertValid() const { CFormView::AssertValid(); } #ifndef _WIN32_WCE void CDisplayView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif #endif ``` 4. 创建资源对话框:在资源编辑器中,创建一个新的对话框资源,例如命名为IDD_DISPLAYVIEW。调整对话框的大小和布局以满足你的需求,并添加所需的控件。确保对话框的ID设置为`IDD_DISPLAYVIEW`,与你在类定义中的IDD值相匹配。 5. 关联对话框和视图:在资源文件`.rc`中,找到你的对话框资源,确认其ID正确无误。在MFC应用程序中,通常会有一个自动创建的对话框类,但因为你是在手动创建视图类,所以需要手动完成这一部分。在视图类的初始化列表中,使用`//{{AFX_DATA_INIT(CDisplayView)}`和`//}}AFX_DATA_INIT`注释来定义对话框数据成员,这样在运行时才能正确处理对话框控件的数据交换。 6. 更新消息映射:在消息映射中添加与对话框控件交互所需的消息处理函数。例如,如果有一个按钮,你可能需要添加`ON_BN_CLICKED(IDC_BUTTON1, &CDisplayView::OnBnClickedButton1)`。 7. 实现消息处理函数:在`CDisplayView.cpp`中,为消息映射中定义的每个函数提供实现。这些函数将处理用户与对话框控件的交互。 通过以上步骤,你就可以在VS2019中创建并使用自定义的CFormView子类了,即使在默认的类模板中没有提供。这个过程虽然比直接使用内置模板复杂一些,但它提供了更多的灵活性,允许你根据项目需求自定义视图和对话框的行为。