Neuen View aus Menue aufrufen wenn kein View aktiv (MDI)
-
Hallo Leute
Das thema wurde in einem anderen Posting schon diskutiert
Jetzt habe ich etwas gefunden wie es funktionieren könnte:Gegeben:
MDI -Projekt
Dialog Ressource IDD_FORMVIEW , KLasse : CNewFormView
in C..App Membervariable CMultiDocTemplate * m_pNewFormViewEine Document-Klasse erstellen CFormViewDoc
in C..App.cpp folgende Dateien includieren:
#include "FormViewDoc.h" #include "NewFormView.h"
Button in der Menueleiste IDD_MAINFRAME erstellen zb 'FormView' und
in C..App eine COMMAND-Fubnktion erstellen.
Folgender Source in dieser Funktion einfügen:POSITION curTemplatePos = GetFirstDocTemplatePosition(); while(curTemplatePos != NULL) { CDocTemplate* curTemplate =GetNextDocTemplate(curTemplatePos); CString str; curTemplate->GetDocString(str,CDocTemplate::docName); if(str == _T("formview")) { curTemplate->OpenDocumentFile(NULL); return; } }
Nun noch in der Funktione InitInstance (nochmals vielen Dank an LowFly)
m_pDocFormView = new CMultiDocTemplate(IDD_FORMVIEW, RUNTIME_CLASS(CFormViewDoc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CNewFormView)); AddDocTemplate(m_pDocFormView);
So hatte ich mir das gedacht , nur das funktioniert nicht
Und zwar findet die Funktion GetNextDocTemplate(curTemplatePos) bzw
GetDocString() nur die Standard-Doc Klasse jedoch nicht meine neue
CFormViewDoc.Villeicht sieht von Euch ja jemand den Fehler ?
Danke und Gruß
Linus
-
LOL (ich lach jetzt nicht über dich) hab da grad wieder ein bischen rumgespielt. und die lösung ist so einfach und simpel das man sie leicht übersieht.
wie estartu schon bemerkt hat kann
CDocument *pDoc = (CDocument*)MDIGetActive()->GetActiveView()->GetDocument();
nicht funzen weil kein Document activ bzw. vorhanden ist.
jetzt denk mal ganz scharf nach was macht man wenn man nichts hat........
man erstellt sich ein neues Document
folgendes hab ich in der MainFrame stehn und es funzt einwandfrei
[b]CDocument *pDoc = new CDocument();[/b] CFrameWnd *frameWnd = ((CChangeViewsApp*)AfxGetApp())->m_pDocEditView->CreateNewFrame(pDoc, NULL); frameWnd->InitialUpdateFrame(pDoc, TRUE);
new edit;
nicht vergessendelete pDoc;
-
Danke für Deine Antwort.
Das hatte ich auch schon ausprobiertCDocument *pDoc = new CDocument()
Bei mir kommt dann folgende Fehlermeldung:
MainFrm.cpp c:\.. ..\mainfrm.cpp(109) : error C2259: 'CDocument': Instanz von abstrakter Klasse kann nicht erstellt werden aufgrund folgender Member: "CDocument::~CDocument(void)": ist abstrakt d:\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(4963): Siehe Deklaration von 'CDocument::~CDocument'
Mein Beispiel oben habe aus der MSDN abgeleitet
Dabei hat man natürlich bei jeder ansicht ein separates Document
Bei Dir benutzt man dagegen nur ein einziges (wen ich das richtig sehe)
-
Bei Dir benutzt man dagegen nur ein einziges (wen ich das richtig sehe)
hmmm meinst du damit das ich nur 1 document vom typ Formview aufmachen kann??
also ich kann über die Mainframe ätliche Documente vom Typ Formview aufmachen, da hier ja das menu nicht wechselt. sofern du es nicht in der NewFormView wechselst.
auch hab ich vc6 evtl macht das die vc8 nicht mehr mit new Document();.
kömisch
-
Ich hab's :xmas1:
Neue Doc-Klasse erstellen zB CNewFormDoc abgeleitet von CDocument
dann wir die neu Document-Klasse erstellt mit :
CNewFormDoc *pDoc = new CNewFormDoc();
in der C..App.cpp muss dann der Eintrag für Die CMultDocTemplate-Variable
geändert werden auf :m_pDocFormView = new CMultiDocTemplate(IDD_FORMVIEW, RUNTIME_CLASS(CNewFormDoc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CNewFormView));
Dann funktioniert es auch bei mir
Vielen Dank für Eure Hilfe
Gruß Linus