MDI neuen View öffnen

anmae

Erfahrenes Mitglied
Hallo,
habe zwar schon ne menge dazu gesucht aber noch nicht das passende gefunden, desshalb bau ich mal wieder auf eure hilfe.

Ich hab ne MDI Anwendung mit einer CReBar in welcher ein Dialog ist (unwichtig) und möchte nun einen neuen View mit einem bestimmten Parameter öffnen.
Ich habe dazu in den Konstruktor meiner CDoc eine Variable (long UID) eingefügt.

1. Problem: Wie mache ich einen Aufruf um ein neues Doc mit UID zu erstellen? - soll aus der ReBAr kommen - also garantiert AfxGetApp->irgendwas)

2. Problem: Wie lasse ich meinen neuen View auf die UID in seinem Doc zugreifen?

Danke
 
1)
Ein neues Dokument kannst du über die jeweilige DocTemplate (in MainFrame-OnInitialUpdate werden die ja registriert) über die Funktion CreateNewDocument erzeugen. Allerdings kannst du da an den Konstruktor keine Parameter übergeben.
Du kannst allerdings direkt nach dem Aufruf von CreateNewDocument die UID über eine Funktion in dein Dokument reinsetzen.

2)
Jeder View hat eine Funktion GetDocument. Ggf. musst du noch auf den passenden Dokumenttyp casten, und dann kannst du auf die UID zugreifen.
 
wo rufe ich denn CreateNewDocument() auf, bzw wozu gehört die?
Die hängt doch irgendwie am DocTemplate, aber wie benutze ich das, oder anders: was ist das überhaupt :)

Danke schonmal
 
Flixt, hatte mich vertan:

In deiner App::InitInstance werden die DocTemplates erzeugt und über AddDocTemplate registriert. Du müsstest dir einen Pointer auf die einzelnen Template-Typen merken und dann darüber das passende Dokument für deine neuen Daten erzeugen.
 
also ich habe nun ein neues Dokument erzeugt.
Allerdings wird da noch nichts angezeigt.
muß ich da den View auch noch manuell erstellen?
Wenn ich über die Menüleiste ein neues Dokument öffne, dann passiert ja alles irgendwie automatisch.
 
Nuja, wenn man bei MFC per Hand eingreift, muss man auch per Hand weitermachen :)

Du kannst über AddView im CDocument einen neuen View dazuhängen:

pView = new CMyView;

pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
rectDefault, this, AFX_IDW_PANE_FIRST + 1, NULL);

m_pDoc->AddView( pView );



Du kannst auch alternativ von deiner WinApp die Funktion OpenDocumentFile aufrufen. Bei MDI erhältst du dann aber meistens eine hässliche Dokumententyp-Auswahlbox.
 
ach mensch, probleme über probleme
ich bin nun soweit:

Code:
	CDocument* newDoc = pDocTemplate->CreateNewDocument();
	((CGWDoc*)newDoc)->SetGroup(UID);
	CGroupFormView* thisView;
	thisView = new CGroupFormView();
	thisView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,CRect(0, 0, 200, 150), this->GetMainWnd(), 1, NULL);
	newDoc->AddView(thisView);

Allerdings bekomme ich den Fehler das Create eine protected Methode des FormView ist, ich also nicht darauf zugreifen kann.
Das ganze ist in der App.
Was hab ich jetz schon wieder falsch? *schnüff*
 
Eigentlich sollte die Create-Funktion nicht private oder protected sein sondern immer public. Aber das solltest du ja leicht ändern können ;-)
 
hm, eigendlich schon.

ich hab halt ne formView klasse . den Konstruktor in public zu ändern war ja kein ding.
mit Create siehts aber schlimmer aus. Einfach eine Create Funktion als public zu definieren und an CFormView::Create weiterzureichen klappt nich, da er wegen einer redefinition der Create() meckert.
die OnCreate() ist public, kann ich die irgendwie benutzen?
 
Hab jetzt nochmal in meinem MFC-Monster-Programm Painter rumgekramt und das gefunden:

Also zum einfachen anlegen eines neuen Dokumentes benutze ich CDocTemplate::OpenDocumentFile, das Template habe ich aus dem InitInstance behalten.

Um einen neuen View zu einem vorhandenen Dokument hinzuzufügen, tue ich das:

Code:
CFrameWnd * pFrameWnd = theApp.pDocTemplate->CreateNewFrame( m_pDocument, NULL );

// error checking in case creation of frame or view fails
if ( pFrameWnd == NULL )
{
  return;
}

// let the frame do any initialization the framework needs,
// call the view's OnInitialUpdate()
theApp.pDocTemplate->InitialUpdateFrame( pFrameWnd, m_pDocument );

Dann sollte da der View dran sein.
 
Zuletzt bearbeitet:
Zurück