Neuen Tab einfügen

UInt

Mitglied
Hallo,

ich habe ein Tab-Control mit 2 Tabs auf dem von CFormView abgeleiten View bei der Initialisierung erzeugt. Es wäre aber gut danach bei Bedarf noch zusätzliche Tabs per Knopfdruck einfügen zu können. Wie mache ich das?

Ich habe versucht die neuen Tabs genau so wie bei der Initialisierung einzufügen, aber ich habe es nur geschafft leere Tabs einzufügen. Wenn ich mit .create einen Dialog an den neuen Tab anbinden will, bekomme ich keine Fehler beim kompilieren, dafür aber eine Meldung „Debug Assertion Failed“ (siehe angehängtes Bild), wenn ich einen neuen Tab mit dem Inhalt einfügen will (drucke die Taste "Tab einfügen").

Fehler:
Wincore.cpp
Line 624
ASSERT(pWnd->m_hWnd==NULL) //only do once

Ich nehme an, dass .create nur bei Initialisierung gut ist, aber was für ein Befehl benutze ich stattdessen?

Nun zum Code, den ich dank eurem Forum zusammengestellt habe:

.cpp
Code:
//////////////////////////////////////////////////////////////////////////////////////////////////
// Tabs bei Initialisierung

void CTest_8View::OnInitialUpdate()
{
	TCITEM TabItem;
	int iIndex;

	CFormView::OnInitialUpdate();

	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();
	
	
	// create the Tabs
	CString TabName = "Seite 1";
	iIndex = 0;
	TabItem.mask    = TCIF_TEXT | TCIF_PARAM;
	TabItem.lParam  = (LPARAM)&m_PropPage1;
	TabItem.pszText = (LPTSTR)(LPCTSTR)TabName;
	m_TabCtrl.InsertItem(iIndex, &TabItem);
	m_TabCtrl.SetItem(iIndex, &TabItem);
	
	TabName = "Seite 2";
	iIndex = 1;
	TabItem.mask    = TCIF_TEXT | TCIF_PARAM;
	TabItem.lParam  = (LPARAM)&m_PropPage2;
	TabItem.pszText = (LPTSTR)(LPCTSTR)TabName;
	m_TabCtrl.InsertItem(iIndex, &TabItem);
	m_TabCtrl.SetItem(iIndex, &TabItem);

	// create Dialogs
	m_PropPage1.Create(IDD_PROPPAGE_1, &m_TabCtrl);
	m_PropPage2.Create(IDD_PROPPAGE_2, &m_TabCtrl);
	
	
	// Dialog position
	CRect rcItem;
	m_TabCtrl.GetItemRect(0, &rcItem);
	m_PropPage1.SetWindowPos( NULL,
                       rcItem.left,
                       rcItem.bottom + 1,
                       0,
                       0,
                       SWP_NOSIZE | SWP_NOZORDER );
	
	
	m_PropPage2.SetWindowPos( NULL,
                       rcItem.left,
                       rcItem.bottom + 1,
                       0,
                       0,
                       SWP_NOSIZE | SWP_NOZORDER );

	// show the first dialog
	m_PropPage1.ShowWindow(SW_SHOW);
	m_PropPage2.ShowWindow(SW_HIDE);
	
	m_TabCtrl.SetCurSel(0);

}

void CTest_8View::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
    TCITEM  item;
    CWnd*   pWnd;
    int     iNewTab = m_TabCtrl.GetCurSel();

    item.mask = TCIF_PARAM;

    // aktuellen Tab ausblenden
    m_TabCtrl.GetItem(m_uiSelectedTab, &item);
    if( item.lParam )
    {
        pWnd = reinterpret_cast<CWnd*> (item.lParam);
        pWnd->ShowWindow(SW_HIDE);
    }

    // neuen Tab anzeigen
    m_TabCtrl.GetItem(iNewTab, &item);
    if(item.lParam)
    {
        pWnd = reinterpret_cast<CWnd*> (item.lParam);
        pWnd->ShowWindow(SW_SHOW);
    }

	*pResult = 0;
}

void CTest_8View::OnTcnSelchangingTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	m_uiSelectedTab = m_TabCtrl.GetCurSel();
	*pResult = 0;

}

/////////////////////////////////////////////////////////////////////////////////////////////////////
// Insert neue Tabs
// Mit leeren Tabs scheint zu funktionieren

static int TabIndex = 1;

bool CTest_8View::NewTab()
{
	TCITEM TabItem;
	TabIndex++;
	
	// create the Tabs
	CString s;
	s.Format(_T("Neuer Tab %d"), TabIndex+1);
	CString TabName = s;
	TabItem.mask    = TCIF_TEXT; // | TCIF_PARAM;
	//TabItem.lParam  = (LPARAM)&m_Dialog3;
	TabItem.pszText = (LPTSTR)(LPCTSTR)TabName;
	m_TabCtrl.InsertItem(TabIndex, &TabItem);
	m_TabCtrl.SetItem(TabIndex, &TabItem);
	

	// create Dialogs
	//m_Dialog3.Create(IDD_DIALOG_3, &m_TabCtrl);------> ASSERT FAILED

	
	
	// Dialog position
	
/*
	CRect rcItem;			------> ASSERT FAILED
	m_TabCtrl.GetItemRect(TabIndex, &rcItem);
	m_Dialog3.SetWindowPos( NULL,
                       rcItem.left,
                       rcItem.bottom + 1,
                       0,
                       0,
                       SWP_NOSIZE | SWP_NOZORDER );
 */  
	// show the first dialog		
	//m_Dialog3.ShowWindow(SW_SHOW);------> ASSERT FAILED
	
	m_TabCtrl.SetCurFocus(TabIndex);
	m_TabCtrl.SetCurSel(TabIndex);
	
	return true;
}

void CTest_8View::OnBnClickedButton1()
{
	NewTab();
}

Helft mir bitte, ich komme nicht weiter. :confused:
 

Anhänge

  • Fehler.jpg
    Fehler.jpg
    42 KB · Aufrufe: 30
Hmm, kann das sein, dass die Routine zweimal aufgerufen wird? Das ASSERT prüft nämlich, ob m_Dialog3 bereits ein HWND zugewiesen hat.

Setz mal einen Break-Point (oder Debug To Cursor) auf m_Dialog3.Create, und sieh da vor dem Aufruf nach, ob da das HWND schon gesetzt ist. Wenn ja, muß es irgendwo vorher schon einen Aufruf von Create geben. Evtl. hast du da einen Constructor aufgerufen?
 
Hey Endurion,
du hast Recht. Dialog3 habe ich schon vorher für einen anderen Tab-Control benutzt.
Ich habe einfach einen neuen Dialog für die neuen Tabs gemacht und, um mehrere Tabs mit demselben Dialog offnen zu können, habe ich einen Pointer auf Dialog gemacht.

Danke schön, du hast mir viel geholfen. :) :) :) :)
 

Neue Beiträge

Zurück