[X] Zusammenhänge der Klassen einer SDI in der MFC
-
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:- C...App von CWinApp abgeleitet
ist für globale Aufgaben zuständig.
z.B. Datenbankinstanz bereithalten - CMainFrame
ist für die Abarbeitung und Weiterleitung von Menübefehlen zuständig. - C...Doc von CDocument abgeleitet
ist für die Datenhaltung zuständig.
Hier kommen z.B. die Recordsets hin. - C...View von CView (oder was auch immer gewählt wurde) abgeleitet
ist für die Anzeige zuständig.
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.C...App
An die C...App kommt man von JEDER Klasse der Anwendung aus mit
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...App* pApp = dynamic_cast<C...App*>(AfxGetApp()); ASSERT(pApp); // zur Sicherheit
CMainFrame
An CMainFrame kommt man mit
CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); ASSERT (pFrame);
Das ist aber nicht nötig, wenn man nur eine Nachricht senden will, z.B.
AfxGetMainWnd()->SendMessage(WM_CLOSE); AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_SAVE);
C...Doc
An das Document kommt man mit
C...Doc* pDoc = dynamic_cast<C...Doc*>(AfxGetMainWnd()->GetActiveDocument()); ASSERT(pDoc);
Falls man mehrere Dokumente hat (was dann genaugenommen 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...Doc* pDoc = dynamic_cast<C...Doc*>(GetDocument()); ASSERT(pDoc);
C...View
Den View bekommt man mit
C...View* pView = dynamic_cast<C...View*>(AfxGetMainWnd()->GetActiveView()); ASSERT(pView);
Falls man mehrere Views hat (was dann genaugenommen aber kein echtes SDI ist), bekommt man damit den View, der den Focus 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.Teilweise ist dies auch auf Dialoganwendungen übertragbar:
Die C...App ist gleich.
Der CMainFrame ist dort der C...Dlg, also mit AfxGetMainWnd zu erreichen.
Doc und View gibt es nicht.
- C...App von CWinApp abgeleitet
-
So, es ist zwar ziemlich kurz - aber da es oft gefragt wird, wollte ich es gerne dabei haben.
Habe ich alles? Oder habe ich etwas vergessen?MDI kann ich leider nicht...
-
Mir gefällt der Artikel, das wichtigste kurz und knackig dargestellt (Das war ja auch deine Absicht).
Nur eins, könntest du den folgenden Teil evtl. anders formulieren, mich hat er erstmal verwirrt
Teilweise ist dies auch auf Dialoganwendungen übertragbar:
Die C...App ist gleich.
Der CMainFrame ist dort der C...Dlg, also mit AfxGetMainWnd zu erreichen.
Doc und View gibt es nicht.
-
GPC schrieb:
Mir gefällt der Artikel, das wichtigste kurz und knackig dargestellt (Das war ja auch deine Absicht).
Schön, dann habe ich das erreicht, was ich wollte.
Nur eins, könntest du den folgenden Teil evtl. anders formulieren, mich hat er erstmal verwirrt
Teilweise ist dies auch auf Dialoganwendungen übertragbar:
Die C...App ist gleich.
Der CMainFrame ist dort der C...Dlg, also mit AfxGetMainWnd zu erreichen.
Doc und View gibt es nicht.Was genau hat dich verwirrt?
Ich wollte das nicht so ausführlich machen wie die SDI, nur kurz erwähnen, da es auch immer wieder gefragt wird.Hilft das hier?
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.
-
estartu_de schrieb:
Hilft das hier?
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.Hilft
-
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:- C...App von CWinApp abgeleitet
ist für globale Aufgaben zuständig.
z.B. Datenbankinstanz bereithalten - CMainFrame
ist für die Abarbeitung und Weiterleitung von Menübefehlen zuständig. - C...Doc von CDocument abgeleitet
ist für die Datenhaltung zuständig.
Hier kommen z.B. die Recordsets hin. - C...View von CView (oder was auch immer gewählt wurde) abgeleitet
ist für die Anzeige zuständig.
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.C...App
An die C...App kommt man von JEDER Klasse der Anwendung aus mit
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...App* pApp = dynamic_cast<C...App*>(AfxGetApp()); ASSERT(pApp); // zur Sicherheit
CMainFrame
An CMainFrame kommt man mit
CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); ASSERT (pFrame);
Das ist aber nicht nötig, wenn man nur eine Nachricht senden will, z.B.
AfxGetMainWnd()->SendMessage(WM_CLOSE); AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_SAVE);
C...Doc
An das Document kommt man mit
C...Doc* pDoc = dynamic_cast<C...Doc*>(AfxGetMainWnd()->GetActiveDocument()); ASSERT(pDoc);
Falls man mehrere Dokumente hat (was dann genaugenommen 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...Doc* pDoc = dynamic_cast<C...Doc*>(GetDocument()); ASSERT(pDoc);
C...View
Den View bekommt man mit
C...View* pView = dynamic_cast<C...View*>(AfxGetMainWnd()->GetActiveView()); ASSERT(pView);
Falls man mehrere Views hat (was dann genaugenommen aber kein echtes SDI ist), bekommt man damit den View, der den Focus 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.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.
- C...App von CWinApp abgeleitet
-
Also ich hab nichts mehr auszusetzen...
-
Schön.
Noch eine zweite Meinung, zur Sicherheit?
-
Keine? Na dann wirds schon passen.
Rechtschreibprüfung bitte.
-
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:
~Klammern gesetzt~- C...App (von CWinApp abgeleitet)
ist für globale Aufgaben zuständig,
z.B. Datenbankinstanz bereithalten. - CMainFrame
ist für die Abarbeitung und Weiterleitung von Menübefehlen zuständig. - C...Doc (von CDocument abgeleitet)
ist für die Datenhaltung zuständig.
Hier kommen z.B. die Recordsets hin. - C...View (von CView (oder was auch immer gewählt wurde) abgeleitet)
ist für die Anzeige zuständig.
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.C...App
An die C...App kommt man von JEDER Klasse der Anwendung aus mit
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...App* pApp = dynamic_cast<C...App*>(AfxGetApp()); ASSERT(pApp); // zur Sicherheit
CMainFrame
An CMainFrame kommt man mit
CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); ASSERT (pFrame);
Das ist aber nicht nötig, wenn man nur eine Nachricht senden will, z.B.
AfxGetMainWnd()->SendMessage(WM_CLOSE); AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_SAVE);
C...Doc
An das Document kommt man mit
C...Doc* pDoc = dynamic_cast<C...Doc*>(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...Doc* pDoc = dynamic_cast<C...Doc*>(GetDocument()); ASSERT(pDoc);
C...View
Den View bekommt man mit
C...View* pView = dynamic_cast<C...View*>(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 ~IMHO sollte hier das deutsche Wort hin. Lasse mich aber gerne überstimmen/-zeugen.~ 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.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.
- C...App (von CWinApp abgeleitet)
-
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:- C...App (von CWinApp abgeleitet)
ist für globale Aufgaben zuständig,
z.B. Datenbankinstanz bereithalten. - CMainFrame
ist für die Abarbeitung und Weiterleitung von Menübefehlen zuständig. - C...Doc (von CDocument abgeleitet)
ist für die Datenhaltung zuständig.
Hier kommen z.B. die Recordsets hin. - C...View (von CView (oder was auch immer gewählt wurde) abgeleitet)
ist für die Anzeige zuständig.
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.C...App
An die C...App kommt man von JEDER Klasse der Anwendung aus mit
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...App* pApp = dynamic_cast<C...App*>(AfxGetApp()); ASSERT(pApp); // zur Sicherheit
CMainFrame
An CMainFrame kommt man mit
CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); ASSERT (pFrame);
Das ist aber nicht nötig, wenn man nur eine Nachricht senden will, z.B.
AfxGetMainWnd()->SendMessage(WM_CLOSE); AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_SAVE);
C...Doc
An das Document kommt man mit
C...Doc* pDoc = dynamic_cast<C...Doc*>(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...Doc* pDoc = dynamic_cast<C...Doc*>(GetDocument()); ASSERT(pDoc);
C...View
Den View bekommt man mit
C...View* pView = dynamic_cast<C...View*>(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.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.
- C...App (von CWinApp abgeleitet)
-
Ich find deinen Artikel echt klasse hätte ich den nur mal etwas früher gehabt, dann hätte ich dich wahrscheinlich nur halb so oft belästigen müssen
Ich hab mal auf Rechtschreibung gelesen aber nichts gefunden ausser das versehentliche [/quote] und dann nochmal der gleiche Text aber ich mein das ist ja kein Rechtschreibfehler.
Naja ich als nicht Rechtschreib-Profi würde sagen es ist I.O.
-
Polofreak schrieb:
Ich find deinen Artikel echt klasse hätte ich den nur mal etwas früher gehabt, dann hätte ich dich wahrscheinlich nur halb so oft belästigen müssen
Danke. Schön, mal wieder was von dir zu lesen.
Ich hab mal auf Rechtschreibung gelesen aber nichts gefunden ausser das versehentliche [/ quote] und dann nochmal der gleiche Text aber ich mein das ist ja kein Rechtschreibfehler.
Naja ich als nicht Rechtschreib-Profi würde sagen es ist I.O.Das mit dem [/quote] ist ein Bug im Striptags - dabei hatte ich doch grade nen anderen behoben...
PS1: Ich hoffe, ich hab ihn jetzt, muss die Texte nochmal vergleichen.
PS2: So, ist raus - danke für den Tip, ich hab es tatsächlich nicht gesehen.
-
schön wieder einen Beitrag von dir zu sehen, les sachen von dir immer wieder gerne