CTabCtrl "ferngesteuert" umblättern



  • hi, ich kämpfe mal wieder mit dem CTabCtrl. Wie kann ich vom einem CDialog der die Seite 1 des CTabCtrl darstellt mit einem CButton.click dem CTabCtrl anweisen auf die Seite 2 umzublättern und den entsprechenden CDialog anzuzeigen.
    (also es soll genau das passieren, wie wenn ich selbst auf den Reiter2 geclickt hätte.)

    was ist hier der einfachste weg?
    geht es nur über WM_NOTIFY?
    und wie genau müßte der code hierfür aussehen?

    vielen dank für eure hilfe.



  • du must dir in der Klasse die die Tabcontrols erstellt & kontroliert eine Funktion zulegen mit der du die einzelnen Dialoge an & ausschaltest. ich kopier dir hier mal schnell die funktion rein wie ich es gamcht hab.

    in der header

    CDialog *m_pDialogs[3]; 
    CTableDlg3 m_TableDlg3; 
    CTableDlg2 m_TableDlg2; 
    CTableDlg1 m_TableDlg1; 
    int m_PreviousTab;
    

    in der cpp

    CTableCtrl::CTableCtrl(): m_PreviousTab(0)
    { 
        m_pDialogs[0] = &m_TableDlg1; 
        m_pDialogs[1] = &m_TableDlg2; 
        m_pDialogs[2] = &m_TableDlg3; 
    } 
    ... 
    void CTableCtrl::SetActiveTab(int nTab) 
    { 
    /*****************************************************************************
         WECHSELT AUF DEN NÄCHSTEN DIALOGE 
    *****************************************************************************/
        if (m_PreviousTab == nTab) return; 
    
        m_pDialogs[m_PreviousTab]->EnableWindow(FALSE); 
        m_pDialogs[m_PreviousTab]->ShowWindow(SW_HIDE); 
    
        m_PreviousTab = nTab; 
    
        SetCurSel(m_PreviousTab); 
    
        m_pDialogs[m_PreviousTab]->EnableWindow(TRUE); 
        m_pDialogs[m_PreviousTab]->ShowWindow(SW_SHOW); 
    }
    


  • wunderbar! danke. das ist was ich gesucht hab. habs ein wenig umgebaut, so dass ich den Code in den CDialog1 schreiben kann. (da ich es nur dort brauche)

    das ganze sieht dann so aus:

    CMainFrame* pMainFrm = (CMainFrame*)AfxGetMainWnd();
    
    pMainFrm->pTaskTabCtrl->TabDlg[0]->EnableWindow(FALSE);
    pMainFrm->pTaskTabCtrl->TabDlg[0]->ShowWindow(SW_HIDE);
    
    pMainFrm->pTaskTabCtrl->m_TabCtrl->SetCurSel(1);
    
    pMainFrm->pTaskTabCtrl->TabDlg[1]->EnableWindow(TRUE);
    pMainFrm->pTaskTabCtrl->TabDlg[1]->ShowWindow(SW_SHOW);
    

    jedoch erscheint der CDialog2 nach dem "automatischen" umblättern an einer anderen Position (er ragt oben in die Reiter und überdeckt sie).

    so sehen OnTabSelChanging und OnTabSelChange aus:

    void CTaskTab::OnTabSelChanging(NMHDR *pnmhdr, LRESULT *pResult)
    {
    	int sel_index = m_TabCtrl->GetCurSel();
    	m_DlgArray[sel_index]->ShowWindow(SW_HIDE);
    	*pResult = false;
    
    }
    
    void CTaskTab::OnTabSelChange(NMHDR *pnmhdr, LRESULT *pResult)
    {
    	RECT rc;
    	m_TabCtrl->GetItemRect(0, &rc);
    
    	int sel_index = m_TabCtrl->GetCurSel();
    	m_DlgArray[sel_index]->SetWindowPos(NULL, rc.left, rc.bottom - 5, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
    
    	m_DlgArray[sel_index]->SetFocus();
    
    }
    


  • Du must die Dialoge mit der ON_WM_SIZE Funktion in der Klasse die die Dialoge kontroliert neu positionieren.

    NEW EDIT:
    denke das ist die Klasse CTaskTab bei dir



  • ok. hab mich geirrt: der dialog erscheint richtig... (hatte da noch einen anderen fehler)

    jedoch habe ich jetzt die zeilen:

    pMainFrm->pTaskTabCtrl->TabDlg[0]->EnableWindow(FALSE);
    
    ...und....
    
    pMainFrm->pTaskTabCtrl->TabDlg[1]->EnableWindow(TRUE);
    

    entfernt.
    Zeile 1 bewirkt das der Dialog mit einem Mausklick danach zwar wieder angezeigt werden kann, aber eben Disabled bleibt (=keine Funktion)
    Zeile 2 ist überflüssig (in meinem Fall, da die Dialoge alle immer Enable sind.

    Danke dir LowFly .


Anmelden zum Antworten