我在Visual Studio 2015中创建了一个C ++ MFC应用程序。 我想在应用程序中添加一个新选项卡,并在mainFrame类中创建此函数:
void CMainFrame::OnCustomerNewcustomer()
{
const CObList &tabGroups = GetMDITabGroups();
CMFCTabCtrl *wndTab = (CMFCTabCtrl*)tabGroups.GetHead();
CCustomerList *customer = (CCustomerList*)RUNTIME_CLASS(CCustomerList)->CreateObject();
((CWnd*)customer)->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, CRect(0, 0, 20, 20), this, IDD_FORMVIEW_NEW_CUSTOMER);
wndTab->AddTab(customer, _T("New Customer"), -1, 1);
}
新选项卡显示在选项卡控制器中,但如果我选择选项卡,则它不显示IDD_FORMVIEW_NEW_CUSTOMER
中的框架,它仅显示最后选择的选项卡框架。有谁知道如何解决这一问题?
答案 0 :(得分:0)
您混合了两个不应该的概念:MDI Child Windows和CMFCTabCtrl选项卡。
我假设您的CMainFrame类是CMDIFrameWndEx或类似的后代。如果您想要一个MDI应用程序,您应该阅读有关文档/视图架构的更多信息。
您需要至少有一个CMultiDocTemplate(或派生类)对象,它具有{Document,Child Frame,View}的关联
OnInitInstance上的代码如下所示:
CYourDocument* pDoc = /*WriteFunctionToGetApplicationDocument*/();
if (!pDoc)
{
ASSERT(FALSE);
return FALSE;
}
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_YOUR_DOCUMENT_TYPE,
RUNTIME_CLASS(CYourDocument),
RUNTIME_CLASS(CYourChildFrame),
RUNTIME_CLASS(CYourView));
if (!pDocTemplate)
{
CoUninitialize(); // if you did CoInitailize before
return FALSE;
}
AddDocTemplate(pDocTemplate);
在您要添加新标签的过程中,请参阅该模板并指示创建相应的框架:
CYourChildFrame* pFrame = NULL;
// add code to see pFrame is already open
if (!pFrame)
{
CWaitCursor wc;
CDocTemplate* pDocTemplate = /*WriteFunctionToGetApplicationMultiDocTemplate*/();
if (!pDocTemplate)
{
ASSERT(FALSE);
return;
}
pFrame = dynamic_cast<CYourFrame*>(pDocTemplate->CreateNewFrame(pDoc, NULL));
if (!pFrame)
{
ASSERT(FALSE);
return;
}
pDocTemplate->InitialUpdateFrame(pFrame, pDoc);
}
if (pFrame)
MDIMaximize(pFrame);