Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

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:

Geschrieben

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.

Geschrieben

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:

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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?

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...