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 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
Wie man manuel eine ID für die Klasse zuweist, kannst Du maybe aus der MFC nach dem Assistenten sehen.