CFormView und CSplitterWnd



  • Hallo,
    Ich habe hier ein CSplitterWnd ohne Doc/View erstellt wie in http://www.c-plusplus.net/forum/topic,4696.html beschrieben.
    Mein CSplitterWnd besteht aus zwei Spalten, eine enthält eine Klasse CSimulationView abgeleitet von
    CView und die andere enthält eine Klasse CSimulationDlg, abgeleitet von CFormView.

    Code:

    //MainFrm.cpp, OnCreate
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
    	// Ansicht erstellen, um den Clientbereich des Rahmens zu belegen
    	//SplitterWnd erstellen
    	if (!m_wndSplitterView.CreateStatic(this, 2, 1))
    	{
    		TRACE0("Splitterfenster konnte nicht erstellt werden\n");
    		return -1;
    	}
    
    	//Fenster mit den Daten über die Simulation (links)
            //Erzeugt leider ein Assertion Failed!
    	   if(!m_wndSplitterView.CreateView(0,0,RUNTIME_CLASS(CSimulationDlg),CSize(100,100),NULL))
    	{
    		TRACE0("Konnte CSimulationDlg nicht erstellen!\n");
    		return -1;
    	}
    
    	//Simulationsfenster (rechts)
    	if(!m_wndSplitterView.CreateView(1,0,RUNTIME_CLASS(CSimulationView),CSize(100,100),NULL))
    	{
    		TRACE0("Konnte CSimulationView nicht erstellen!\n");
    		return -1;
    	}  
        //...
    }
    

    Leider erzeugt der Code einen Fehler und zwar an dieser Stelle erzeugt er ein Assertion Failed:

    //MFC Class CSplitterWnd
    //BOOL CSplitterWnd::CreateView(int row, int col,
    	CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext)
    
    if (!pWnd->Create(NULL, NULL, dwStyle,
    		rect, this, IdFromRowCol(row, col), pContext))
    	{
    		TRACE(traceAppMsg, 0, "Warning: couldn't create client pane for splitter.\n");
    			// pWnd will be cleaned up by PostNcDestroy
    		return FALSE;
    	}
    	ASSERT((int)_AfxGetDlgCtrlID(pWnd->m_hWnd) == IdFromRowCol(row,col)); //schlägt fehl
    

    Ich hab leider keine Ahnung wieso die ID meines CFormViews anders sein soll als wie von IdFromRowCol angegeben.
    Ich mein, Create wird ja eben mit IdFromRowCol als Parameter für die ID aufgerufen, und ich habe auch IdFromRowCol und CFormView::Create debuggt.
    IdFromRowCol gibt AFX_IDW_PANE_FIRST zurück und in CFormView::Create steht

    SetDlgCtrlID(nID); //nID==AFX_IDW_PANE_FIRST
    

    Hoffe ihr könnt mir weiterhelfen 😉
    S.W.



  • Ok, hm, es schein als würde SetDlgCtrlID(nID) in CFormView::Create fehlschlagen(es gibt 0 zurück). Aber wieso schlägt es fehl...



  • Naja, jetzt hab ich in CSimulationDlg::OnCreate folgendes geschrieben:

    SetLastError(0);
    SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    TRACE1("GetDlgCtrlID(): %d\n",GetDlgCtrlID());
    TRACE1("GetLastError: %d\n",GetLastError());
    

    Ergebnis:

    GetDlgCtrlID(): 0
    GetLastError: 1401
    

    Passt aber überhaupt nicht, den Code 1401 soll heißen: "Ungültiger Menühandle". Wo ist hier bitte ein Menü 😡



  • Ok, die Lösung:
    Der Style WS_CHILD war bei der Dialogresource nicht gesetzt. Ich hatte in zwar manuell gesetzt, indem ich in die Ressourcendatei an die entsprechende Stelle WS_CHILD gesetzt hatte, aber irgendwie hat das Visual Studio nicht interessiert 😕 . Jetzt habe ich die richtige Einstellung im Dialogeditor gefunden und gesetzt und holla siehe da es geht :p


Anmelden zum Antworten