Dieser und noch weitere Artikel wurde von estartu erstellt.


Folgende Themen werden von diesem Artikel berührt:


Druckversion des Artikels


1 Übersicht

Das SDI (Single Document Interface) ist einer der Anwendungstypen, die man mit Hilfe des Assistenten erstellen kann.
Es besteht aus mehreren Klassen, die jede ihre eigene Aufgabe haben:


Was eigentlich der Übersichtlichkeit dienen soll, macht Anfängern aber eher Probleme, denn sie finden die "Brückenschläge" zwischen den einzelnen Klassen nicht.
Hier möchte ich Abhilfe schaffen.

2 C...App

An die C...App kommt man von JEDER Klasse der Anwendung aus mit
C++:
AfxGetApp();

Da das aber noch nicht den richtigen Typ hat, muss gecastet werden. Ich nutze dynamic_cast, weil dieser am sichersten ist (RTTI muss eingeschaltet sein).
Ein einfacher C-Cast funktioniert meistens auch - wenn er aber mal nicht funktioniert, wird es problematisch.
C++:
C...App* pApp = dynamic_cast<C...App*>(AfxGetApp());
ASSERT(pApp); // zur Sicherheit


3 CMainFrame

An CMainFrame kommt man mit
C++:
CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());
ASSERT (pFrame);

Das ist aber nicht nötig, wenn man nur eine Nachricht senden will, z.B.
C++:
AfxGetMainWnd()->SendMessage(WM_CLOSE);
AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_SAVE);


4 C...Doc

An das Document kommt man mit
C++:
C...Doc* pDoc = dynamic_cast<C...Doc*>(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument());
ASSERT(pDoc);

Falls man mehrere Dokumente hat (was dann genau genommen aber kein echtes SDI ist), bekommt man damit das aktuell angezeigte.
Vom Mainframe aus kann man das AfxGetMainWnd weglassen.

Von der Viewklasse aus gibt es eine "Abkürzung":
C++:
C...Doc* pDoc = dynamic_cast<C...Doc*>(GetDocument());
ASSERT(pDoc);


5 C...View

Den View bekommt man mit
C++:
C...View* pView = dynamic_cast<C...View*>(((CMainFrame*)AfxGetMainWnd())->GetActiveView());
ASSERT(pView);

Falls man mehrere Views hat (was dann genau genommen aber kein echtes SDI ist), bekommt man damit den View, der den Fokus hat.
Vom Mainframe aus kann man das AfxGetMainWnd weglassen.

Und das war es auch schon. :)
Mit diesen wenigen Befehlen kommt man von überall her an jede beliebige Klasse und deren Member.

6 Dialoganwendungen

Teilweise ist dies auch auf Dialoganwendungen übertragbar:
Die C...App ist gleich.
Das Hauptfenster ist der C...Dlg (bei SDI: CMainFrame).
Doc und View gibt es nicht.

Sie können Kommentare zu diesem Artikel im Forum schreiben. (Eine Registrierung ist nicht notwendig.)

Logo-Design: MastaMind Webdesign