c++ - 如何在MFC中的CWnd中显示CFormView?

标签 c++ mfc

我有一个不支持文档/ View 的 SDI MFC 应用程序。我想将 CFormView 与在 ChildView 的资源编辑器中设计的控件一起嵌入。我该怎么做?

MFC向导生成了3个文件:

  • App.cpp(源自CWinApp)
  • MainFrame.cpp(源自CFrameWnd)
  • ChildView.cpp(源自CWnd)

现在,我已经生成了从 CFormView 派生的自定义类,其中 IDD_MYVIEW 是资源 GUI 的生成 ID。

class MyFormView: public CFormView
{
public:
    enum { IDD = IDD_MYVIEW  };

    MyFormView(): CFormView(IDD) {};
    virtual ~MyFormView() {};
}

如何在 ChildView 中显示这个 MyFormView?

当我尝试再次生成项目并在 MFC 向导中选中文档/ View 体系结构复选框并将 View 的基类更改为 CFormView 时。我意识到应用程序的初始化与最初生成的不同。

目前第一个应用程序初始化如下:

BOOL MfcApp::InitInstance() 
{
    // (...)

    CMainFrame* pFrame = new CMainFrame;
    if (!pFrame)
        return FALSE;
    m_pMainWnd = pFrame;
    // create and load the frame with its resources
    pFrame->LoadFrame(IDR_MAINFRAME,
        WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
        NULL);

    // The one and only window has been initialized, so show and update it
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateWindow();
    return TRUE;
}

此外,MainFrame 在 OnCreate 方法中初始化 ChildView。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    // create a view to occupy the client area of the frame
    if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    {
        TRACE0("Failed to create view window\n");
        return -1;
    }
}

其中m_wndViewChildView。我认为我应该在 ChildViewOnCreate 方法中初始化 CFormView,但我不知道该怎么做,也不知道如何“展示下。因为CFormView没有这些方法。

另一方面,文档/ View 架构的初始化如下所示。并且似乎自动涵盖了我想要实现的目标。

BOOL MfcApp::InitInstance() 
{
    // (...)
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CMFCPlaygroundDoc),
        RUNTIME_CLASS(CMainFrame),       
        RUNTIME_CLASS(CMFCPlaygroundView)); // <-- derived from CFormView
    if (!pDocTemplate)
        return FALSE;
    AddDocTemplate(pDocTemplate);
    // (...)
}

问题是,我看到在第二个生成的项目中,CFormView 被提供给 SingleDocTemplate 构造函数,我可以将控件放在那里。但在第一个生成的项目中,我不知道在哪里可以将 CFormView 连接到显示的 ChildView。我不知道如何以及在哪里连接我的新 CFormView。

我发现文档/ View 架构对于我需要的应用程序来说是压倒性的且不必要的,并且想继续它只是为了理解它。

最佳答案

由于 @RonTLV 没有发布他的链接作为答案,我将解释如何使用 Link 解决我的问题。 @RonTLV 提供。

简而言之:我缺少 CFormView 类的 DYNCREATE 宏,并且在 MainFrame (CFrameWnd) 中需要有一个指针,而不是指向 CFormView 的实例,该指针位于 MainFrame 的 OnCreate 方法中必须向下转型(通过宏)。

下面您可以找到带有必要宏的 CFormView 类 header :

class MyFormView : public CFormView
{
    DECLARE_DYNCREATE(MyFormView)

public:
    enum { IDD = IDD_RANGERCONTROLS  };

    MyFormView();// : CFormView(IDD) {};
    virtual ~MyFormView();

    DECLARE_MESSAGE_MAP()

public:
};

在 cpp 文件中,我添加了 IMPLMENT_DYNCREATE 宏,如下所示:

IMPLEMENT_DYNCREATE(MyFormView, CFormView)

MyFormView::MyFormView()
    : CFormView(MyFormView::IDD)
{
};

MyFormView::~MyFormView()
{
}

BEGIN_MESSAGE_MAP(MyFormView, CFormView)
END_MESSAGE_MAP()

最后在 MainFrame::OnCreate 方法中

CCreateContext ccx;
ccx.m_pNewViewClass = RUNTIME_CLASS(MyFormView);
m_pMainView = DYNAMIC_DOWNCAST(MyFormView, this->CreateView(&ccx));

if (NULL == m_pMainView)
{
    TRACE0("Creation of View failed.\n");
}

RecalcLayout();
m_pMainView->ShowWindow(SW_SHOW);
m_pMainView->OnInitialUpdate();
SetActiveView(m_pMainView);

其中,m_pMainView 被声明为 CMainFrame 的私有(private)成员:

MyFormView* m_pMainView;

关于c++ - 如何在MFC中的CWnd中显示CFormView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48540871/

相关文章:

c++ - C++ 中 atomic<uint64_t> 数据类型的格式说明符是什么?

C++ vector 访问元素

c++ - Windows 运行中的目录搜索如何工作?

c++ - MFC中如何改变进度条的颜色

mfc - 需要有关使用 WinCE、ARM9 内联汇编的信息

c++ - "warning: operation of ... may be undefined"用于三元运算——不是 if/else block

c++ - 减去包含重复元素的 vector

c++ - 如何从 ifstream 获取格式化输入

c++ - 在消息映射中创建按钮和引用

c++ - windows下如何监控进程网络使用情况