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. |