如何在MFC中的CWnd中显示CFormView?

时间:2018-01-31 11:17:56

标签: c++ mfc

我有一个没有文档/视图支持的SDI MFC应用程序。我想在子视图中使用资源编辑器中设计的控件嵌入CFormView。我该怎么做?

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向导中选中Document / View体系结构复选框并将View的基类更改为CFormView时。我意识到App初始化与最初生成的初始化不同。

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

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。我认为我应该初始化CFormView的{​​{1}}方法OnCreate,但我不知道如何做到这一点,也不知道如何“显示”它。因为ChildView没有这些方法。

另一方面,Doc / View架构的初始化看起来像这样。并且似乎自动涵盖了我想要达到的目标。

CFormView

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

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

1 个答案:

答案 0 :(得分:1)

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

简而言之:我错过了我的CFormView类和MainFrame(CFrameWnd)的DYNCREATE宏,需要一个指针而不是CFormView的实例,必须在MainFrame的OnCreate方法中进行下调(通过宏观)。

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

class MyFormView : public CFormView
{
    DECLARE_DYNCREATE(MyFormView)

public:
    enum { IDD = IDD_RANGERCONTROLS  };

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

    DECLARE_MESSAGE_MAP()

public:
};

在cpp文件中,我添加了IMPLEMENT_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的私有成员:

MyFormView* m_pMainView;