gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:51 24 4
gpt4 key购买 nike

我有一个不支持文档/ 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 时。我意识到 App 初始化与最初生成的不同。

目前第一个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。我认为我应该在 ChildViewOnCreate 方法中初始化 CFormView,但我不知道该怎么做,也不知道如何“展示下。因为 CFormView 没有这些方法。

另一方面,Doc/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。

我发现 Doc/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 文件中,我添加了 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 的私有(private)成员:

MyFormView* m_pMainView;

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com