C ++ MFC应用程序CMFCBaseTabCtrl选项卡不可见

时间:2016-01-17 18:54:01

标签: c++ mfc

我在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中的框架,它仅显示最后选择的选项卡框架。有谁知道如何解决这一问题?

1 个答案:

答案 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);