2个CMFCTAB控件位于不同位置,但选项卡位于同一位置

2个CMFCTAB控件位于不同位置,但选项卡位于同一位置,mfc,mfc-feature-pack,Mfc,Mfc Feature Pack,我希望在CScrollView派生的类上有两组选项卡,所以我将两个CMFCTABCTR并排放置。选项卡控件中充满了对话框(当前为同一类,但用于测试的对象不同,以后为每个选项卡控件使用不同的对话框) 问题在于,当控件本身按照需要彼此放置在一起时。第二个选项卡控件中的选项卡或对话框显示在第一个选项卡控件的区域中,因此与第一个选项卡控件重叠。 在上面的图片上,左边的对话框(目前是测试的最低限度)实际上属于右边的控件。选项卡内的对话框是视图的子对象 对话框的资源: IDD_COMBATANTDLG D

我希望在CScrollView派生的类上有两组选项卡,所以我将两个CMFCTABCTR并排放置。选项卡控件中充满了对话框(当前为同一类,但用于测试的对象不同,以后为每个选项卡控件使用不同的对话框)

问题在于,当控件本身按照需要彼此放置在一起时。第二个选项卡控件中的选项卡或对话框显示在第一个选项卡控件的区域中,因此与第一个选项卡控件重叠。

在上面的图片上,左边的对话框(目前是测试的最低限度)实际上属于右边的控件。选项卡内的对话框是视图的子对象

对话框的资源:

IDD_COMBATANTDLG DIALOGEX 0, 0, 320, 331
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
    GROUPBOX        "Flotte",IDC_STATIC,19,18,192,175,BS_FLAT
    LTEXT           "Static",IDC_STATIC,91,94,19,8
    EDITTEXT        IDC_EDIT1,136,118,40,14,ES_AUTOHSCROLL
END
声明:

class SimDataInput : public CScrollView
{
protected: // create from serialization only
    SimDataInput();
    DECLARE_DYNCREATE(SimDataInput)

// Attributes
private:

    CMFCTabCtrl combatant_tabs[2];//tabs
    std::vector<CombatantDlg*> p2combatdlg[2];//stores pointers to dialog
    const CStringW attdef[2] = { L"Angreifer ", L"Verteidiger " };//standard labels for respective tab controls

毕竟,将CMFCTabCtrls父对象添加到包含的对话框可以纠正这种行为。我必须将指向前父项的指针存储在对话框中,以便于访问

通常,控件不是选项卡的子项,而是选项卡父项的子项,因此这可能是部分原因。除此之外,我们还需要看到更多与选项卡对话框放置相关的代码。通常,控件不是选项卡的子项,而是选项卡父项的子项-这里就是这种情况如果您尚未解决它,您可以显示更多代码吗?好的,您已经要求了:)。以下是所有相关代码
void SimDataInput::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();
    for (auto i = 0; i < 2;i++)
{
        CStringW label ( attdef[i]);
        RECT pos = RECT{ i * 400, 0, 400 + i * 400, 500 };
    combatant_tabs[i].Create(CMFCTabCtrl::STYLE_3D, pos, this,10000+i, CMFCTabCtrl::LOCATION_TOP,TRUE);//create tab
    combatant_tabs[i].EnableTabSwap(FALSE);
    combatant_tabs[i].EnableActiveTabCloseButton();
    //combatant_tabs[sim::ATT].EnableTabDocumentsMenu(TRUE);
    p2combatdlg[i].reserve(16);
    p2combatdlg[i].emplace_back();//create pointer
    p2combatdlg[i].back() = new CombatantDlg(this);//initialize pointer to the new dialog
    p2combatdlg[i].back()->Create(IDD_COMBATANTDLG, this);//create dialog
    //p2combatdlg[i].back()->SetWindowPos(&combatant_tabs[i], 400, 0, 0, 0, SWP_NOZORDER | SWP_SHOWWINDOW);//tried this -doesn't help
        label.AppendFormat(L"%d",1);
    combatant_tabs[i].InsertTab(p2combatdlg[i].back(),label , 0, -1, FALSE);//insert the first tab
    }
void SimDataInput::OnCombatant(UINT nID)//used by ON_COMMAND_RANGE for both tab controls
{
    nID -= ID_ATTACKER;

    if (combatant_tabs[nID].GetTabsNum() == 16)
        return; 
    CStringW label ( attdef[nID]);
    p2combatdlg[nID].emplace_back();
    label.AppendFormat(L"%d", p2combatdlg[nID].size());
    p2combatdlg[nID].back() = new CombatantDlg(this);
    p2combatdlg[nID].back()->Create(IDD_COMBATANTDLG, this);
    combatant_tabs[nID].InsertTab(p2combatdlg[nID].back(), label , combatant_tabs[nID].GetTabsNum(), -1, FALSE);
    combatant_tabs[nID].SetActiveTab(combatant_tabs[nID].GetTabsNum() - 1);
    // TODO: Add your command handler code here
}