Auf Mainframe objekt zugreifen

Hallo,
ich arbeite grad an einem MFC - SDI Projekt und mit MS Visual Studio 6.
Ich habe eine Funktion in der Mainframe Klasse die ich gerne durch einen Mausklick auslösen würde. Wie bekomme ich in meiner View an das Objekt oder einen zeiger auf den MainFrame?
Nach langem suchen bin ich auf die Funktion AfxGetMainWnd()gestoßen, habe aber keine Ahnung was es damit auf sich hat.
Ich hoffe ihr könnt mir helfen.
gruß DR

Hallo,

Ich habe eine Funktion in der Mainframe Klasse .Wie bekomme ich in
meiner View an einen zeiger auf den MainFrame?
Nach langem suchen bin ich auf die Funktion
AfxGetMainWnd()gestoßen, habe aber keine Ahnung was es damit

Du hast es doch schon gefunden.

Nur ist Dir warscheinlich die *Logik* wie daraus nun ein Pointer werden soll nciht ganz klar .

CWnd* AFXAPI AfxGetMainWnd( );

Es liefert also einen Zeiger auf ein CWnd

CWnd* pMainWnd = AfxGetMainWnd();

Wir brauchen aber nicht CWnd sondern CFrameWnd.

Da CFrameWnd von CWnd kommt konnen wir den Typ CASTEN

von CWnd zu CFrameWnd, sowas macht man dann mit eine Klammer
also

CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();

und schon ist pMainWnd dein Pointer auf den MainFrame.

Zwischen Views wechseln
Vielen Dank Rakon Dark für den Tipp mit dem Casten, habe es aber ein bisschen anders gemacht. klappt aber trotzdem:

CMainFrame\* pFrame = (CMainFrame\*)AfxGetMainWnd();
pFrame-\>SwitchView();

Nun hat sich alledrings ein weiteres Problem aufgetan: Ich möchte eine SDI Anwendungen mit mehreren Views erstellen. Das habe ich probiert so zu realisieren:

void CMainFrame::SwitchView(void)
{
 CView \*pOldView;
 CView \*pNewView;
 //pOldView-\>MessageBox("In Switch View");

 //Zeiger Auf aktives View holen
 pOldView=GetActiveView();
 //Zeiger auf das aktive View retten
 m\_pCFirstView=pOldView;

 //Zweites View erstellen
 CRuntimeClass \*pCR=RUNTIME\_CLASS(CNextView);
 m\_pCSecondView = static\_cast(pCR-\>CreateObject());
 //ID des Views ungleich AFX\_IDW\_PANE\_FIRST setzen
 m\_pCSecondView-\>Create(NULL,NULL,AFX\_WS\_DEFAULT\_VIEW,rectDefault,this,AFX\_IDW\_PANE\_FIRST+1,NULL);

 pNewView = m\_pCFirstView;

 //IDs austauschen
 int nChildID=pNewView-\>GetDlgCtrlID();
 pNewView-\>SetDlgCtrlID(AFX\_IDW\_PANE\_FIRST);
 pOldView-\>SetDlgCtrlID(nChildID);

 //Zeiger auf das Dokument holen
 CDocument \*pDoc= pOldView-\>GetDocument();

 //View mit Dokument verbinden
 pDoc-\>AddView(pNewView);
 pDoc-\>RemoveView(pOldView);

 //Aktives View dem Rahmenfenster mitteilen
 SetActiveView(pNewView);
 //Und Viewgröße neu berechnen

 RecalcLayout();
 //View anzeigen bzw. verbergen
 pNewView-\>ShowWindow(SW\_SHOW);
 pOldView-\>ShowWindow(SW\_HIDE);

}

Bei der Ausführung ergibt sich aber beim Verbinden der Views mit den Dokumenten ein Laufzeitfehler. Was mache ich falsch? Bitte um Hilfe!
gruß DR

//Zeiger auf das aktive View retten
m_pCFirstView=pOldView;

Du rettest den Zeiger vom Aktiven Fenster
m_pCFirstView

//Zweites View erstellen
CRuntimeClass *pCR=RUNTIME_CLASS(CNextView);
m_pCSecondView =
static_cast(pCR->CreateObject());
//ID des Views ungleich AFX_IDW_PANE_FIRST setzen
m_pCSecondView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,rectDefault,this,AFX_IDW_PANE_FIRST+1,NULL);

erstellt wurde m_pCSecondView

pNewView = m_pCFirstView;

jetzt soll neuer View plötzlich wieder der Aktive view sein ???.

Und da denk ich mal ist dein erster Fehler

pNewView = m\_pCSecondView;

//IDs austauschen
int nChildID=pNewView->GetDlgCtrlID();
pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
pOldView->SetDlgCtrlID(nChildID);

hier ist aber OldView == NewView ???

//Zeiger auf das Dokument holen
CDocument *pDoc= pOldView->GetDocument();

//View mit Dokument verbinden

Hier Addierst du (pNewView = m_pCFirstView)

pDoc->AddView(pNewView);

wohl den aktiven gerade noachmal

pDoc->RemoveView(pOldView);

und entfernst ihn wieder .

Das Beispiel aus dem MFC Tutorial funktioniert nur wenn man die bool variable auf True setzt.

P.S. ich hoffe du rufst die Funktion nur einmal auf .

Danke für deine Antwort

Und da denk ich mal ist dein erster Fehler

pNewView = m_pCSecondView;

Ja das stimmet wohl, jetzt klappt es auch.

P.S. ich hoffe du rufst die Funktion nur einmal auf .

Ja ist auch nur zur übung gedacht.

Nun hat sich aber ein neuer Fehler aufgetan:
Ich habe eine Klasse (CMyFormView, die von CFormView erbt) dem Projekt hinzugefügt. Wenn ich jetzt versuche

m\_pCFormView-\>Create(NULL,NULL,AFX\_WS\_DEFAULT\_VIEW,rectDefault,this,AFX\_IDW\_PANE\_FIRST+1,NULL);

auszuführen erscheint folgender Compilerfehler:

error C2248: ‚CFormView::Create‘: Kein Zugriff auf protected Element, dessen :smiley:eklaration in der Klasse „CFormView“ erfolgte.

Ich habe schon alle Funktionen in meiner Klasse auf public gesetzt, der Fehler erscheint weiterhin. Und wenn ich die Funktion in der Klasse CFormView in afxext.h auf public setzte bekomme ich Linkerfehler (7stück…). Was kann ich tun??
gruß DR

Nun hat sich aber ein neuer Fehler aufgetan:
Ich habe eine Klasse (CMyFormView, die von CFormView erbt) dem
Projekt hinzugefügt. Wenn ich jetzt versuche

warscheinlich aber nicht mit dem Assistenten. Das musst du aber, weil die MFC brauch eine ID dafür .
Dann nur constructor und destructor public .
OnInitial Update überschreiben :smile:

Wie man manuel eine ID für die Klasse zuweist, kannst Du maybe aus der MFC nach dem Assistenten sehen.