Varrius Geschrieben 6. Dezember 2005 Geschrieben 6. Dezember 2005 Hallo, ich habe ein SDI-Projekt erstellt und möchte zwischen verschiedenen Dialogen wechseln, das hab ich nach dieser Anleitung getan. Allerdings möchte ich nun die Switch Funktion aufrufen, wenn ich auf einen Button drücke. Das Problem ist nun, das ich in der View Klasse den Zeiger oder das Objekt des MainFrame brauche, aber nicht weis wie ich da ran komme. Mein Dozent konnte mir da auch nicht helfen Eine Frage die sich danach für mich ergeben würde ist, wie ich einer View einen bestimmten Dialog zuordnen kann. Ich habe 2 Dialoge erstellt ( IDD_* ) und es wird immer der erste geöffnet, wie kann ich diese Zuweisung ändern? Programmieren tu ich mit VS 6.0. Vielen Dank für eure Hilfe Varrius Zitieren
Hexagon Geschrieben 6. Dezember 2005 Geschrieben 6. Dezember 2005 Moin! Zum Ersten: Schau dir mal "AfxGetMainWnd( );" an. Da bekommst die einen CWnd-Zeiger zurück den du dann auf deinen MainFrame casten kannst. Zum Zweiten: Es gibt irgendwo etwas Namens "SetTemplate" oder so ähnlich. Einfach mal danach suchen, vielleicht hilft dir das ja schon weiter. Zitieren
Varrius Geschrieben 11. Dezember 2005 Autor Geschrieben 11. Dezember 2005 habe mit AfxGetMainWnd() die Funktion nun aufrufen können und habe eine weitere CFormView Klasse erstellt, der ich ein Dialog zuordnen musst. wenn ich nun meine Switch Funtkion aufrufe, bekomme ich leider Fehler während des Laufens void CMainFrame::SwitchView(int view) { CView *pOldView; CView *pNewView; // Zeiger auf aktives View holen pOldView = GetActiveView(); // Falls dies der erste Aufruf der Methode ist, ist das erste View // das aktive View und der Zeiger darauf muss noch gerettet werden if (m_pKundenverwaltung == NULL) m_pKundenverwaltung = pOldView; // Falls zweites View noch nicht erstellt if (m_pSpielmittel == NULL) { CRuntimeClass *pCR = RUNTIME_CLASS(CSpielmittelView); m_pSpielmittel = static_cast<CView*>(pCR->CreateObject()); // ID des Views ungleich AFX_IDW_PANE_FIRST setzen! m_pSpielmittel->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,rectDefault, this,AFX_IDW_PANE_FIRST+1,NULL); } // Neues aktives View bestimmen if (view == IDD_SPIELMITTEL_FORM) pNewView = (CView *)m_pSpielmittel; else pNewView = (CView *)m_pKundenverwaltung; // Aktives View muss die ID AFX_IDW_PANE_FIRST besitzen // IDs deshalb austauschen int nChildId = pNewView->GetDlgCtrlID(); pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); pOldView->SetDlgCtrlID(nChildId); // Zeiger auf Dokument holen CDocument *pDoc = pOldView->GetDocument(); // View mit Dok verbinden pDoc->AddView(pNewView); pDoc->RemoveView(pOldView); // Aktives View dem Rahmenfenster mitteilen SetActiveView(pNewView); // Und Viewgroesse neu berechnen lassen RecalcLayout(); // View anzeigen bzw. verbergen pNewView->ShowWindow(SW_SHOW); pOldView->ShowWindow(SW_HIDE); m_iActiveView = view; } bei m_pSpielmittel->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,rectDefault, this,AFX_IDW_PANE_FIRST+1,NULL); tritt während des Laufens folgende Fehlermeldung im Debug auf "ERROR: Dialog with IDD 0x0082 must have the child style." wenn ich nun aus AFX_WS_DEFAULT_VIEW WS_CHILD mache, kommt immernoch diese Fehlermeldung. meine MSDN gibt mir da keine Tips bzw. fehlt ihr etwas Zitieren
Hexagon Geschrieben 12. Dezember 2005 Geschrieben 12. Dezember 2005 Moin, also bei mir ist das so: // common style for form views #define AFX_WS_DEFAULT_VIEW (WS_CHILD | WS_VISIBLE | WS_BORDER) Da scheint mehr schief zulaufen. Ist den das Teil im Resourceneditor ordentlich drin? Auch mit den ganzen Styles und so... Auch ist mir irgendwie schleiherhaft was das soll: if (m_pSpielmittel == NULL) { CRuntimeClass *pCR = RUNTIME_CLASS(CSpielmittelView); m_pSpielmittel = static_cast<CView*>(pCR->CreateObject()); // ID des Views ungleich AFX_IDW_PANE_FIRST setzen! m_pSpielmittel->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,rectDefault, this,AFX_IDW_PANE_FIRST+1,NULL); } :confused: Und warum zum Henker gleich ein static cast? Reicht nicht ein dynamic_cast? Finde ich ehrlich gesagt besser, da es irgendwie nicht mit der Brechstange ist. :floet: Zitieren
Varrius Geschrieben 12. Dezember 2005 Autor Geschrieben 12. Dezember 2005 die DefÃnition ist bei mir auch so und das static_cast hab ich aus der Anleitung die ich oben gelinkt hab ich hab beim debuggen nochmal geguckt und festgestellt, das der View in m_pSpielmittel kein CDocument zugeordnet ist, könnte das ein Problem sein? wenn ja wie kann ich das wegmachen das static_cast entfernen bringt keinen Unterschied in der if-Schleife wird der 2te Dialog initialiesiert, falls das vorher noch nicht geschehen ist. Zitieren
Hexagon Geschrieben 12. Dezember 2005 Geschrieben 12. Dezember 2005 N'Abend! Wenn, dann mußt du in deiner von CWinApp abgeleiteten klasse in der Memberfunktion InitInstance noch dieses CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CWasAuchImmerDoc), RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster RUNTIME_CLASS(CWelcheAuchImmerView)); AddDocTemplate(pDocTemplate); reinbasteln...denk ich zumindest... Zitieren
Varrius Geschrieben 12. Dezember 2005 Autor Geschrieben 12. Dezember 2005 dir auch einen guten Abend hab das mal so eingebaut: pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CLudothekDoc), RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster RUNTIME_CLASS(CLudothekView), RUNTIME_CLASS(CSpielmittelView)); allerdings bekomme ich dann folgende Fehlermeldung: error C2660: 'CSingleDocTemplate::CSingleDocTemplate' : Funktion akzeptiert keine 5 Parameter Zitieren
Hexagon Geschrieben 13. Dezember 2005 Geschrieben 13. Dezember 2005 RUNTIME_CLASS(CLudothekView), RUNTIME_CLASS(CSpielmittelView)); Was zum Henker soll denn das? Du mußt das einmal für deine CLudothekView und einmal für deine CSpielmittelView machen! Sag mal, wieviel hast du dich eigentlich schon mit der Sprache C++ beschäftigt? Zitieren
Varrius Geschrieben 13. Dezember 2005 Autor Geschrieben 13. Dezember 2005 hab das auch mitbekommen und das wie folgt geändert pDocTemplate2 = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CLudothekDoc), RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster RUNTIME_CLASS(CSpielmittelView)); AddDocTemplate(pDocTemplate2); von c++ hab ich schon ein wenig Ahnung, nur mit den SDK und Views komm ich noch nicht ganz klar auch wenn ich das so definiert habe, kommt immernoch die gleiche Fehlermeldung bei der SwitchView Funktion Zitieren
Hexagon Geschrieben 13. Dezember 2005 Geschrieben 13. Dezember 2005 Hm...nächster Verdacht: Du benutzt doch eine SDI-Anwendung. Könnte es sein, daß der andere View noch da ist? Kann man im SDI eigentlich einfach so Views ändern? (Weiß ich grad nicht mehr, sorry! :floet: ) Zitieren
Varrius Geschrieben 13. Dezember 2005 Autor Geschrieben 13. Dezember 2005 hast du dir mal oben den Link angeguck? :floet: nach der Anleitung wollte ich das machen und dort wird es für eine SDK erklärt (2ter Teil). allerdings wird dort in keinster Weise auf die Implementation der beiden Viewklasse eingegangen, was bei mir zu Problemen führt :hells: die alte View sollte in der SwitchView Funktion ja entfernt werden, doch der Fehler "ERROR: Dialog with IDD 0x0082 must have the child style." tritt ja schon vorher auf. edit: Ich hab's geschafft http://www.codeguru.com/forum/archive/index.php/t-198057.html manchmal is es leichter als man denkt ^^ einfach beim Dialog die Eigenschaften des Stil auf Untergeordnet stellen nun ist mein Problem, das ich beim Starten des Programms immer sagen muss, welche View benutzt werden soll. wo kann ich das einstellen, das das von vornherein fest ist? Zitieren
Hexagon Geschrieben 14. Dezember 2005 Geschrieben 14. Dezember 2005 Ich sag dazu mal jetzt nichts! Außer: Ist den das Teil im Resourceneditor ordentlich drin? Auch mit den ganzen Styles und so... Zitieren
Smoggy Geschrieben 15. Dezember 2005 Geschrieben 15. Dezember 2005 Also um an Mainframe-Objekt zu kommen, gibt es die Holzhammer-Methode: CMyApp* pApp = (CMyApp*) AfxGetApp(); pApp->m_pMainFrame-> Eine Form-Switch in einer SDi hab ich auch mal gemacht: -Als Ressourcen hast du IDD_FORM_1,IDD_FORM_2,IDD_FORM_3 ´+ die dazugehörigen Klassen void CMainFrame::SwitchToForm(int nForm) { ::SetCursor(::LoadCursor(NULL, IDC_WAIT)); CView* pOldActiveView = GetActiveView(); // Altes View merken CView* pNewActiveView; CDocument* pDoc = GetActiveDocument(); switch(nForm) { case IDD_FORM_1: pNewActiveView = (CView*)new CView1; break; case IDD_FORM_2: pNewActiveView = (CView*)new CView2; break; case IDD_FORM_3: pNewActiveView = (CView*)new CView3; break; } pNewActiveView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, rectDefault, this, AFX_IDW_PANE_FIRST, NULL); // Neu erstelltes View anzeigen und altes View verbergen pNewActiveView->ShowWindow(SW_SHOW); // Neues Fenster anzeigen pOldActiveView->ShowWindow(SW_HIDE); // Altes Fenster verbergen // Neu erstelltes View mit dem Document verbinden und // altes View vom Document trennen pDoc->AddView(pNewActiveView); pDoc->RemoveView(pOldActiveView); SetActiveView(pNewActiveView); // Aktives View ändern pNewActiveView->OnInitialUpdate(); RecalcLayout(); // Fenster anpassen delete pOldActiveView; // Altes View löschen ::SetCursor(::LoadCursor(NULL,IDC_ARROW)); } Falls fargen sind, einfach melden Zitieren
Varrius Geschrieben 16. Dezember 2005 Autor Geschrieben 16. Dezember 2005 danke, habe es nun hinbekommen, das pDocTemplate2 war einfach zuviel kann nun beliebig zwischen den Views switchen, nun hab ich noch ein paar Probleme mit den MFC Elementen :floet: Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.