Wie kann ich von CDocument auf CFrameWnd zureifen?

NinjaOne

Erfahrenes Mitglied
Hallo,
ich habe mir eine SDI-Anwendung mit dem MFC-Anwendungs-Assistenten erstellt.
Nun frage ich mich wie ich von CDocument auf CFrameWnd zugreifen kann?
Wenn ich mit CSingleDocTemplate das Fenster erstelle bleibt mir ja nur der Zeiger auf CDocument. Schaffe es aber nicht von CDocument auf CFrameWnd zuzugreifen.

Kann mir jemand sagen wie ich das anstellen kann?

Danke und Bye.
 
Meines Wissens gibt es keine Möglichkeit, von CDocument auf CFrameWnd zuzugreifen. Ich habe auch schon mal probiert, eine Möglichkeit zu finden, ist mir nicht gelungen. Alle Möglichkeiten, die der Compiler nicht angemeckert hat, lieferten immer einen Null-Zeiger. Allerdings ist das auch nur logisch - in CDocument speichere ich meine Daten, die ich in CView oder CMainFrm oder anderen Funktionen verarbeite. Deshalb reicht da eine Einbahnstrasse. Aber vielleicht weiß ja jemand einen Trick.

Mfg

langer
 
Ich meine das m_pMainWnd-Member der CWinApp sollte das FrameWindow sein (zumindest bei SDI und MDI). Allerdings ist es nur ein CWnd*, man müsste es casten.
Und da die App in MFC immer über theApp. erreichbar ist sollte es so gehen:

( (CMainFrm*)theApp.m_pMainWnd )->

Ich mache mir dann meistens eine zweite Member-Variable vom Typ CMainFrm*, um mir das dauernde Gecaste zu sparen.
 
Hi MCoder,
was du schreibst klappt, wenn ich nur ein SDI habe.
Ich habe leider mehrere SDI's geöffnet und möchte anhand meines Zeigers auf das Doc-Objekt das duzugehöhrige Frame-Objekt ermitteln. Hast da auch ne Idee?
Dein Beispiel bezieht sich immer auf das Frame-Objekt von Main-Fenster.
 
Hmm, ich dachte eigentlich, in jeder SDI-Applikation gibt es nur ein FrameWindow (MainFrame) mit einem oder mehreren Views.

Nachtrag:
Alle ChildFrames sollten dann aber über den MainFrame erreichbar sein, da dieser das Parent-Fenster für sie sein sollte.
 
Zuletzt bearbeitet:
OK, wieder was dazugelernt, mit AfxGetMainWnd() klappt es auch in CDocument. Allerdings erst nach der kompletten Erstellung des Fensters. Im Konstruktor der Doc-Klasse geht's nicht und in OnNewDocument streikt die Methode auch. Aber in allen anderen Funktionen hab ich den Zeiger ohne Probleme bekommen.
Endurions Methode hab ich auch ausprobiert, klappt, aber auch nicht im Konstruktor und in OnNewDocument.
Allerdings wollte ich einfach nur ausprobieren, ob's überhaupt geht. Denn bisher hatte ich noch nie das Problem, daß ich von CDocument auf eine andere Klasse zugreifen mußte. Und der Lerneffekt ist erreicht. :suspekt:

Mfg

langer
 
Hab es geschafft.
Aus der OnCreate-Funktion von Frame übergebe ich einen Zeiger von Frame an CDocument.

Code:
((CMyRichEditDoc*)GetActiveDocument())->m_Frame=this;

Das ganze scheint auch zu klappen.

Bye.
 
Zurück