CTabControl



  • Hallo,

    ich habe z. Z. Probleme mit CTabControl. Ich habe mir auch schon alle Threads zu diesem Thema in diesem Forum durchgelesen, bekam aber trotzdem immer nur Fehlermeldungen.

    Ich bin wie folgt vorgegangen:

    1. Im Hauptdialog habe ich über Visual Studio ein TabControl eingefügt.

    2. Diesem TabControl habe ich die Steuerungsvariable mCtrl_Tab_Suche zugeordnet.

    void CHauptDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_TAB_Suche, mCtrl_Tab_Suche);
    }
    

    3. In der Funktion des Hauptdialoges OnInitDialog habe ich folgenden Code eingefügt:

    BOOL CHauptDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
            ...
    
    	// Initialisierung des TabControl
    	TCITEM tcItem1;
    	tcItem1.mask = TCIF_TEXT;
    	tcItem1.pszText = _T("Suche");
    
    	TCITEM tcItem2;
    	tcItem2.mask = TCIF_TEXT;
    	tcItem2.pszText = _T("Erweiterte Suche");
    
    	mCtrl_Tab_Suche.SetWindowText("TabControl");
    	mCtrl_Tab_Suche.ShowWindow(SW_SHOW);
    	mCtrl_Tab_Suche.InsertItem(0,&tcItem1);
    	mCtrl_Tab_Suche.InsertItem(1,&tcItem2);
    
    	return TRUE;  
    }
    

    Jetzt stehe ich vor folgenen Problemen:

    1. Warum erscheint das TabControl nicht, wenn ich den Source-Code kompeliere?

    2. Wie ordne ich den einzelnen Tabs Dialoge zu?

    Danke für Eure Hilfe im Voraus!

    Gruß,

    Elayas



  • http://www.codersource.net/mfc_ctabctrl.html ist ein relativ schlechtes Beispiel...



  • Danke für den Link. Ich habe es ausprobiert, erhalte aber immer wieder Fehlermeldungen, dass meine Dialog-IDs nicht bekannt sind, sobald ich die CMyCtrlTag in meine Klasse einfüge.

    Ich finde den Fehler nicht. Das Beispiel klappt, aber meine Klasse, obwohl ich zum Schluss alle Dateien kopiert habe, will nicht funktionieren.

    Deshalb versuche ich jetzt den Lösungsvorschlag vom folgenden Beitrag zu nutzen:
    http://www.tutorials.de/forum/visualstudio-mfc/222816-ctabctrl-seiten-aufbauen.html#post1370118

    Gruß,

    Elayas



  • Hmm wo ist eigentlich dein Problem?!
    Du musst halt gucken das du den Dialog nicht modal aufrufst, sondern ihn mit Create erstellst. Normal musst du ihn dann nur als lParam angeben(nach http://msdn2.microsoft.com/en-us/library/a4f1hs88(VS.80).aspx) ... dann evt noch anzeigen, falls es der aktuelle Dialog ist und fertig 🙂



  • So, ich habe es nun doch geschafft. Komischerweise wurde das TabControl-Element erst nach einer komplett neuen Kompelieren richtig angezeigt.

    Ich habe es jetzt wie folgt gelöst:

    // Code in der Header-Datei des Dialoges mit dem Tab
    // CForm_Tab ist der Dialog, der im Tab erscheinen soll
    CForm_Tab mDlg_Tab1; 
    CForm_Tab mDlg_Tab2;
    CTabCtrl mCtrl_Tab; // Controll-Variable des TabControl
    unsigned int mUI_SelectedTab; // Speichert die Nummer des aktivierten Tab
    
    // Code im OnInitDialog()
    // Initialisierung des TabControl
    ...
    CString strTitle;
    int iIndex;
    CRect rcItem;
    mCtrl_Tab.GetItemRect(0, &rcItem); // Dialoge positionieren
    rcItem.left += 3;
    rcItem.bottom += 4;
    // ---------------
    // Tab1
    // ---------------
    strTitle = _T("Tab1");   // Titel des Dialogs
    iIndex   = 0;                 // Tab-Index
    mDlg_Tab1.mStr_DBTable = "DB1"; // Variable die dem Dialog übergeben wird
    mDlg_Tab1.Create(CForm_Tab::IDD, &this->mCtrl_Tab);
    TCITEM item1;
    item1.mask    = TCIF_TEXT | TCIF_PARAM;
    item1.lParam  = (LPARAM)&mDlg_Tab1;
    item1.pszText = (LPTSTR)(LPCTSTR)strTitle;
    mCtrl_Tab.InsertItem(iIndex, &item1);   // Tab1 zu TabControl hinzufügen
    mDlg_Tab1.SetWindowPos(NULL, rcItem.left, rcItem.bottom, 0, 0, WP_NOSIZE | SWP_NOZORDER );	
    mDlg_Tab1.ShowWindow(SW_SHOW); // Dialog wird angezeigt
    
    // -----------------
    // Tab2
    // -----------------
    strTitle = _T("Tab2");   // Titel des Dialogs
    iIndex   = 1;                 // Tab-Index
    mDlg_Tab2.mStr_DBTable = "DB2"; // Variable die dem Dialog übergeben wird
    mDlg_Tab2.Create(CForm_Tab::IDD, &this->mCtrl_Tab);
    TCITEM item2;
    item2.mask    = TCIF_TEXT | TCIF_PARAM;
    item2.lParam  = (LPARAM)&mDlg_Tab2;
    item2.pszText = (LPTSTR)(LPCTSTR)strTitle;
    mCtrl_Tab.InsertItem(iIndex, &item2);   // Tab2 zu TabControl hinzufügen
    mDlg_Tab2.SetWindowPos(NULL, rcItem.left, rcItem.bottom, 0, 0, WP_NOSIZE | SWP_NOZORDER );
    mDlg_Tab2.ShowWindow(SW_HIDE); // Dialog wird nicht angezeigt
    ...
    
    // HauptDlg ist der Dialog mit dem TabControl
    // OnTcnSelchangeTabSuche ist ein Ereignishandler (TcnSelChange) auf den TabControl
    void CHauptDlg::OnTcnSelchangeTabSuche(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	TCITEM  item;
        CWnd*   pWnd;
        int     iNewTab = mCtrl_Tab.GetCurSel();
    
        item.mask = TCIF_PARAM;
    
        // aktuellen Tab ausblenden
    	mCtrl_Tab.GetItem(this->mUI_SelectedTab, &item);
        if( item.lParam )
        {
            pWnd = reinterpret_cast<CWnd*> (item.lParam);
            pWnd->ShowWindow(SW_HIDE);
        }
    
        // neuen Tab anzeigen
        mCtrl_Tab.GetItem(iNewTab, &item);
        if(item.lParam)
        {
            pWnd = reinterpret_cast<CWnd*> (item.lParam);
            pWnd->ShowWindow(SW_SHOW);
    		this->mUI_SelectedTab = iNewTab;
        }
    
        *pResult = 0;
    }
    

    Danke für Eure Hilfe!!! 👍



  • @ (D)Evil

    Du musst halt gucken das du den Dialog nicht modal aufrufst, sondern ihn mit Create erstellst.

    Welcher Dialog den in den ich das TabControl einbaue oder die die ich in das TabControl reinsetze? Zweiteres ist ja logisch!

    Beim ersteren frag ich mich, ob das der Grund für meine Probleme sein könnte. Ich bekomme einfach nicht den TabControl angezeigt, obwohl ich ihn einfach nur mit Hilfe des Resourcen Editors einfüge. Der Dialog welcher den TabControl enthält wird allerdings mit DoModal aufgerufen.



  • Hab' es selber raus bekommen. Also, auch wenn der Dialog welcher den Tab Control enthält mit DoModal() aufgerufen wird, wird der Tab Control angezeigt.
    Leider wird in meinen speziellen Dialog der Tab Control nicht angezeigt, deshalb programmiere ich nun einen neuen Dialog. So ein Scheiß 😡



  • Da wäre langsam mal ein Tutorial zu fällig. An diesem TabCtrl beiße ich mir
    auch momentan die Zähne aus 😡



  • [EDIT][/EDIT]



  • So, hier mal meine Umsetzung, welche mein TabControl und meinen Dialog nicht verheiraten möchte.
    Mein Dialog erscheint nicht im Control, sondern für sich allein auf dem Desktop. 😞

    .h

    CTabCtrl* m_pctrlTab;
       CLVSTgmDlg* m_LVSDlg;  // Abgeleitet von CDialog
    

    .cpp

    m_pctrlTab = (CTabCtrl*) GetDlgItem(IDC_TAB_TGM);
       m_LVSDlg = (CLVSTgmDlg*) new CLVSTgmDlg;
       m_LVSDlg->Create(IDD_DIALOG_LVS_B, m_pctrlTab);
    
       CString strTitle = _T("");
       TCITEM item;
    
       // Tab 1
       strTitle     = _T("LVS<-->MAT-K");
       item.mask    = TCIF_TEXT | TCIF_PARAM;
       item.lParam  = (LPARAM) &m_LVSDlg;
       item.pszText = (LPTSTR)(LPCTSTR) strTitle;
       m_pctrlTab->InsertItem(0, &item);
       CRect rcItem;   
       m_pctrlTab->GetItemRect(0, &rcItem);
       m_LVSDlg->SetWindowPos(NULL, rcItem.left, rcItem.bottom + 1, 0, 0, SWP_NOSIZE | SWP_NOZORDER );
    
       int iCount = m_pctrlTab->GetCurSel();
       m_pctrlTab->ShowWindow(iCount ? SW_HIDE : SW_SHOW);
       m_LVSDlg->ShowWindow(SW_SHOW);
    


  • Mach Dir doch ein Static oder ein Image Control in den Dialog und passe dann das TabControl an dessen Dimensionen an. Irgendwie sieht Dein Ansatz komisch aus. Du holst Dir die Positionsdaten des Tabcontrols und verschiebst dann den Dialog?!?



  • Ja, denn der Dialog muss doch in das Control quasi eingesetzt werden.
    Hat allet nur nich funktioniert. 😢

    Ich hab das TabControl jetzt genommen, Mülleimer auf und Abflug!!! 😡

    Neuer Ansatz:

    CPropertySheet und CPropertyPage mit Create() und schon wird es da und so angezeigt, wie ich das haben möchte, ohne das ich mir da einen abbrechen muss.

    Tja, ich hab versagt am CTabControl. 👎



  • Jetzt versteh ich erst mal, was Du vorhattest. M$ hat mit CPropertyPage/Sheet nicht umsonst was Komfortableres bereitgestellt 😉


Anmelden zum Antworten