Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ VC++ / MFC » Registerkarten in mein Projekt aufnehmen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.01.2003, 16:40 Uhr
Uwe
C/C++ Master
(Administrator)


Autor U. Fröhlich

Die Entwickleroberfläche von VC++ bietet die Möglichkeit die verschiedensten Steuerelemente einzusetzen. In vielen Büchern ist die Verwendung der Standardsteuerelmente gut erläutert. Leider tuen sich viele Autoren sehr schwer, das Steuerelement Registerkarte zu erwähnen, beschrieben wird das Steuerelement in den meisten Büchern nicht. Hier folgt ein Beispiel, was den Umgang mit dem oben erwähnten verdeutlichen soll.

Projektformat: Dialoganwendung
Nach dem Anlegen des Projektes wird eine Klasse mittels des Klassenassistenten angelegt. Als Basisklasse muß hier CTabCtrl angegeben werden. Die neue Klasse erhält im Beispiel den Namen CMyTabCtrl. Als nächstes legen wir eine Registerkarte auf unser Anwendungsfenster. Der Name wird bei IDC_TAB1 belassen. Per Hand oder mit dem Klassenassi wird nun eine Membervariable für das Steuerelement in die Dialogklasse eingefügt.

Variablentyp : CMyTabCtrl
Variablenname: m_cTabCtrl

Für jedes "Register" muß nun ein eigener Dialog eingefügt werden. Jetzt kommt das eigentlich wichtige an der ganzen Sache. Die Dialoge müssen "Child" sein und dürfen KEINE Ränder besitzen.

Eigenschaften
ID : IDD_SEITE1
Stil: Untergeordnet
Rand: Keine

Dies gilt für jede neue Seite! Dann wird für jeden Dialog eine Klasse angelegt. Die Basisklasse bleibt CDialog. In der Klasse CMyTabCtrl fügen wir zwei Variable und einen Zeiger für die Anzahl der Seiten ein:

Variablentyp : int
Variablenname: m_aktuelleSeite

Variablentyp : int
Variablenname: m_Seitennummern

Variablentyp : CDialog*
Variablenname: m_tabellenSeite[2]

Jetzt können wir in der Klasse CMyTabCtrl den Construkter und Destrukter füllen.

C++:
CMyTabCtrl::CMyTabCtrl()
{
        m_tabellenSeite[0]=new CSeite1;
        m_tabellenSeite[1]=new CSeite2;

        m_Seitennummern=2;
}

CMyTabCtrl::~CMyTabCtrl()
{
        for(int nZaehler=0; nZaehler < m_Seitennummern; nZaehler++)
        {
                delete m_tabellenSeite[nZaehler];
        }

}


Der Code dürfte eigentlich aussagekräftig sein. Das Steuerlement, sprich unser Karteikasten muß später initialisiert werden. Dies erledigen wir mit einer Funktion.

Funktionstyp : void
Funktionsdeklaration: Initialisierung()

Die neu entstandene Funktion bearbeiten wir auch sofort.

C++:
void CMyTabCtrl::Initialisierung()
{
        m_aktuelleSeite=0;
        m_tabellenSeite[0]->Create(IDD_SEITE1, this);
        m_tabellenSeite[1]->Create(IDD_SEITE2, this);
        m_tabellenSeite[0]->ShowWindow(SW_SHOW);
        m_tabellenSeite[1]->ShowWindow(SW_HIDE);

        SetRec();
}


So weit, so gut. Doch was ist das SetRec() ? Wenn wir unser Projekt kompillieren gibt es an der Stelle ärger. Der Compiler wird uns erzählen, dass er die Funktion nicht kennt. Aber irgendwie muß unser Programm die Seiten auch korrekt zeichnen können. Bleibt uns nichts weiter übrig den Bereich zu definieren. Also eine neue Funktion muß her!

Funktionstyp : void
Funktionsdeklaration: SetRec()

Jetzt können wir unseren Bereich definieren.

C++:
void CMyTabCtrl::SetRec()
{
        CRect tabRec, itemRec;
        int nX, nY, nXz, nYz;

        GetClientRect(&tabRec);
        GetItemRect(0, &itemRec);

        nX=itemRec.left;
        nY=itemRec.bottom+1;
        nXz=tabRec.right-itemRec.left-1;
        nYz=tabRec.bottom-nY-1;

        m_tabellenSeite[0]->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_SHOWWINDOW);
        for(int nZaehler=1; nZaehler < m_Seitennummern; nZaehler++)
        {
                m_tabellenSeite[nZaehler]->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_HIDEWINDOW);
        }

}


Gut. Wir müssen nun noch dafür sorgen, dass unsere Anwendung reagieren soll falls die linke Maustaste auf einen unserer "Reiter" in der Tabelle klickt. Das ist recht simpel und wird mit einer Behandlungsroutine für WM_LBUTTONDOWN() realisiert. Dazu klickt man mit der linken Taste unserer Maus auf die Klasse CMyTabCtrl und wählt Neue Behandlungsroutine für Windows-Nachrichten.

C++:
void CMyTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
        // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen

        CTabCtrl::OnLButtonDown(nFlags, point);

        if(m_aktuelleSeite != GetCurFocus())
        {
                m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_HIDE);
                m_aktuelleSeite=GetCurFocus();
                m_tabellenSeite[m_aktuelleSeite]->ShowWindow(SW_SHOW);
                m_tabellenSeite[m_aktuelleSeite]->SetFocus();
        }

}


Unsere Anwendung muß nun noch wissen, dass das neue Element angezeigt werden soll. In der Dialogklasse müssen wir lediglich in BOOL CTabCtrlDlg::OnInitDialog() das Steuerelement initialisieren.

C++:
BOOL CTabCtrlDlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        // Hinzufügen des Menübefehls "Info..." zum Systemmenü.
        .....................
        .....................
        .....................

       // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen

        m_cTabCtrl.InsertItem(0, _T("Seite 1"));
        m_cTabCtrl.InsertItem(1, _T("Seite 2"));
        m_cTabCtrl.Initialisierung();

        return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
}


Jetzt kann das Projekt erstellt und ornungsgemäß ausgeführt werden. Auf den Seiten können jetzt weitere Steuerelemente untergebracht und verwendet werden. Das gesamte Projekt kann über Downloadbereich zum besseren Verständnis geladen werden.

--edit: Pablo. Tote Links wieder belebt :) --
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 28.09.2003 um 14:23 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: