2 CMFCTabControls в другом месте, но вкладки остаются на одном месте

Я хотел бы иметь 2 набора вкладок в моем классе, производном от CScrollView, поэтому я поместил 2 CMFCTabCtrs рядом. Элементы управления вкладками заполнены диалогами (в настоящее время тот же класс, но разные объекты для целей тестирования, позже разные диалоги для каждого элемента управления вкладками).

Проблема в том, что сами элементы управления расположены рядом друг с другом, как хотелось бы. вкладки или диалоговые окна из второй вкладки появляются в области первой вкладки, таким образом перекрывая ее. введите здесь описание изображения

на картинке выше диалог слева (в настоящее время минималистичный для тестирования) на самом деле принадлежит элементу управления справа. диалоги внутри вкладки являются дочерними элементами представления.

Ресурс диалога:

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

............

из OnInitialUpdate():

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
}

person Andrey Pro    schedule 20.08.2014    source источник
comment
Обычно элементы управления являются не дочерними элементами вкладки, а дочерними элементами родительской вкладки, поэтому это может быть частью причины. Помимо этого нам нужно будет увидеть больше кода, связанного с размещением диалоговых окон с вкладками.   -  person user1793036    schedule 21.08.2014
comment
Обычно элементы управления являются не дочерними элементами вкладки, а дочерними элементами родительской вкладки - здесь так и есть.   -  person Andrey Pro    schedule 21.08.2014
comment
Если вы еще не решили эту проблему, можете ли вы показать больше кода, пожалуйста?   -  person user1793036    schedule 22.08.2014
comment
хорошо, вы просили об этом :). вот весь соответствующий код   -  person Andrey Pro    schedule 22.08.2014


Ответы (1)


В конце концов, создание родительских элементов CMFCTabCtrls для содержащегося диалогового окна исправило поведение. Мне пришлось хранить указатель на бывших родителей внутри диалогов, чтобы упростить доступ.

person Andrey Pro    schedule 23.08.2014