Wieder Splitter in SDI Anwendung !



  • Hallo Leute,

    kann mir jemand Helfen ??

    Ich erstelle in einer SDI ANwendung in der Main Frame ein Splitter.

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    	if (!m_wndSplitter.CreateStatic(this, 2, 1))
    	{
    		TRACE0("Failed to create splitter window\n");
    		return FALSE;
    	}
    
    	// Get the client rect first for calc left pane size
    	CRect rect;
    	GetClientRect(&rect);
    
    	if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CAnsichtTop), CSize(0, rect.Width()/2), pContext) ||
    		!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CAnsichtBottom), CSize(0, 0), pContext))
    	{
    		m_wndSplitter.DestroyWindow();
    		return FALSE;
    	}
    
    	m_wndSplitter.SetActivePane(1,0);
    
    	return TRUE;
    }
    

    CAnsichtTop und CAnsichtBottom sind Klassen von FrameWnd Abgeleitet.

    Beim erstellen gibt es kein Problem, aber beim Beenden bringt er ein Runtim Error, und im Debugger steht:

    Warning: Next pane is not a view - calling SetFocus.
    Eine Ausnahme (erste Chance) bei 0x7c26b249 (mfc71d.dll) in test.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xfeeeff56.
    Unbehandelte Ausnahme bei 0x7c26b249 (mfc71d.dll) in test.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xfeeeff56.
    

    Ich komme mit der Fehlermeldung nicht klar, wenn ich eine Klasse im Splitter erstelle z.b. Abgeleitet von CFormView oder CView läuft er beim Schließen durch.

    Ich brauche aber CFrameWnd um ein Switch to View zu erstellen.

    Gruß und Danke
    andy_mann



  • Kann mir niemand sagen, warum ich in einer gesplittetem SDI Anwendung keine 2 CFrameWnd Klassen benützen kann ??

    Was bedeutet :

    Warning: Next pane is not a view - calling SetFocus.
    

    Gruß
    andy_mann



  • Hallo Leute,

    so ich habe jetzt etwas gefunden.

    Jetzt gibt es allerdings immernoch ein Problem.
    Die größe beim öffne des Tools.

    Ich bekomme es nicht hin, dass er beim Start mir die Bereiche den Angaben entsprechend anpasst (CSize).

    Habe schon alle Werte einmal erhöht, aber nichts hat gefunzt...
    Hier der Source:

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    	// create a splitter with 1 row, 2 columns
    	if (!m_wndSplitter.CreateStatic(this, 2, 1))
    	{
    		TRACE0("Failed to CreateStaticSplitter\n");
    		return FALSE;
    	}
    
    	// add the second splitter pane - which is a nested splitter with 2 rows
    	if (!m_wndSplitter2.CreateStatic(
    		&m_wndSplitter,     // our parent window is the first splitter
    		1, 2,               // the new splitter is 2 rows, 1 column
    		WS_CHILD | WS_VISIBLE | WS_BORDER,  // style, WS_BORDER is needed
    		m_wndSplitter.IdFromRowCol(0, 0)
    			// new splitter is in the first row, 2nd column of first splitter
    	   ))
    	{
    		TRACE0("Failed to create nested splitter\n");
    		return FALSE;
    	}
    
    	// now create the two views inside the nested splitter
    	int cyText = max(lpcs->cy - 70, 20);    // height of text pane
    
    	if (!m_wndSplitter2.CreateView(0, 0,
    		RUNTIME_CLASS(CColorView), CSize(150, 200), pContext))
    	{
    		TRACE0("Failed to create third pane\n");
    		return FALSE;
    	}
    	if (!m_wndSplitter2.CreateView(0, 1,pContext->m_pNewViewClass
    		, CSize(0, 0), pContext))
    	{
    		TRACE0("Failed to create second pane\n");
    		return FALSE;
    	}
    
    	// add the first splitter pane - the default view in column 0
    	if (!m_wndSplitter.CreateView(1, 0,
    		RUNTIME_CLASS(CTextView), CSize(0, 150), pContext))
    	{
    		TRACE0("Failed to create first pane\n");
    		return FALSE;
    	}
    
    	// it all worked, we now have two splitter windows which contain
    	//  three different views
    	return TRUE;
    }
    

    Kann mir jemand Helfen ??

    Gruß
    andy_mann



  • Hallo.

    Meines Wissens lügt die Dokumentation, dass sich CSize auf die Anfangsgröße der Ansichtsfenster bezieht. Bei mir hat es zumindest auch nie geklappt.

    Versuch es mal mit den Befehlen:

    m_wndSplitter.SetColumnInfo(0,500,0);
    m_wndSplitter.SetRowInfo(0,500,0);
    

    Die mittlere Zahl gibt dabei den gewünschten Abstand der Trennlinien in Pixeln an, die erste Zahl die entsprechende Reihe oder Spalte. Damit kannst du jederzeit auch in anderen Teilen des Quellcodes die Größen der Ansichtsfenster automatisch ändern. Wenn du es allerdings außerhalb der CreateClient Funktion machst, musst du danach noch folgende Zeile einfügen, sonst zeichnet er den Splitter nicht neu.

    m_wndSplitter.RecalcLayout();
    


  • Vielen Dank, werde ich dann mal ausprobieren...

    Gruß
    andy_mann


Anmelden zum Antworten