Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

MainFrame Funktion im CView aufrufen

Empfohlene Antworten

Veröffentlicht

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

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.

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 :(

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:

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 :rolleyes:

das static_cast entfernen bringt keinen Unterschied

in der if-Schleife wird der 2te Dialog initialiesiert, falls das vorher noch nicht geschehen ist.

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...:rolleyes:

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

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? Hexagon-Smilie.gif

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

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: )

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 :D

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?

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

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:

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.