assertion fehler beim Registerkarten erstellen



  • hi.

    ich habe versucht in einer SDI anwendung mit der CTabCtrl Registerkarten anzulegen, jedoch stehe ich vor einem mir nicht zu lösendem Problem. habe großteils nur hilfen für Dialogfeld basierende Anwendungen gefunden und kenne mich noch nicht so gut aus wie man solche programme auf SDI anwendungen umschreibt.

    laut meiner hilfe muss ich den folgenden code in die ::OnInitDialog elementfunktion initialisieren bei meiner SDI anwendung habe ich sie aber jedoch in meine OnInitUpdate() funktion geschrieben damit die tabs am start der anwendung initialisiert werden, jedoch bekomme ich immer einen assertion fehler(Debug Assertion Failed!) wenn er m_cTab.InsertItem(i, &tcItem); aufruft:

    void Ctab1View::OnInitialUpdate(void)
    {	
    	int i;
    	CTabCtrl m_cTab;
    	TC_ITEM tcItem;
    	PSTR pszTabItems[] = {_T("site1"), _T("site2"), _T("site3"), NULL};
    	i=0;
    
    	for (i = 0; pszTabItems[i] != NULL; i++)
    	{
    		tcItem.mask = TCIF_TEXT;
    		tcItem.pszText = pszTabItems[i];
    		tcItem.cchTextMax = strlen(pszTabItems[i]);
    		m_cTab.InsertItem(i, &tcItem);
    	}
    }
    

    der code sieht eigentlich nach standard erstellung für tabs aus, welche ich öfters gefunden habe doch fand ich keine lösung für das problem.

    irgendwelche ideen für mich?

    danke



  • Hallo,

    Du must in Deiner View-Klasse eine Membervariable vom Typ CTabCtrl erstellen.
    Dann erzeugst Du das Control in OnCreate.

    Nach der Erstellung mit Create in OnCreate fügst Du deine Tabs ein.

    Danach schreibst Du einen Nachrichtenhandler für WM_SIZE (also OnSize)
    in der Du mit z.B. SetWindowPos das Tabulator-Control Deinem Clientbereich
    anpaßt.

    Etwas Code der Dir weiterhelfen sollte:

    int CTabView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
    	// erzeuge des TabControls 
    	if ( !m_wndTabCtrl.Create(TCS_TABS|TCS_FIXEDWIDTH|WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, AFX_IDW_PANE_FIRST) )
    		return -1;
    
    	// 5 Tabs dem Control hinzufügen
    	for ( int i = 0; i < 5; i++ )
    	{
    		CString strTabulator;
    		strTabulator.Format(_T("Tab #%02d"), i);
    		TCITEM tci;
    		tci.mask = TCIF_TEXT;
    		tci.pszText = (LPSTR)(LPCTSTR)strTabulator;
    
    		m_wndTabCtrl.InsertItem(i, &tci);
    	}
    
    	return 0;
    }
    
    void CTabView::OnSize(UINT nType, int cx, int cy)
    {
    	CWnd::OnSize(nType, cx, cy);
    
    	// TabControl dem Clientbereich anpassen
    	if ( m_wndTabCtrl.GetSafeHwnd() )
    		m_wndTabCtrl.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOZORDER);
    }
    

    Gruss
    EB



  • hat sich erledigt, danke:)



  • die tabs an sich funktioneren eigentlich nur wie kann ich jetzt zwischen ihnen hin und her switchen und immer die aktuelle view wählen. also wie find ich heraus welcher tab gerade aktiv ist ?


Anmelden zum Antworten