Ansicht im Splitter verschwindet bei erneutem Mausklick



  • Hallo Leute,

    ich habe da ein Problem mit meiner SDI Anwendung.

    Habe das Fenster mit spltter in 2 Fenter eingeteilt.
    In der Linken Seite eine Navigationsleiste, in der Rechten eine erneute Ansicht mit einem Splitter.

    Jetzt kann ich zwischen den Ansichten mittels Navigation hin und her Klicken.

    Klicke ich allerdings mit der Maus auf eine Ansicht in der rechten Seite und wechsle meine Ansicht wieder, ist diese angeklickte Ansicht nicht mehr Sichtbar.

    Hat jemand eine Idee wo ich suchen kann ??

    Gruß
    andy_mann



  • Hallo, kann mir keiner einen Tip geben was der Grund sein kann.

    So realisiere ich die Ansichten über eine Navigationsseite:

    void CAnsichtRechts::SwitchToView(UINT nView)
    {
    	CView* pOldActiveView = GetActiveView();
    	CView* pNewActiveView = NULL;
    
    	switch (nView)
    	{
    	case	VIEW_HOME:
    				pNewActiveView = (CView*) m_pDialog1;
    				break;
    
    	case	VIEW_LIZENZ:
    				pNewActiveView = (CView*) m_pDialog2;
    				break;
    
    	case	VIEW_BENUTZER:
    				pNewActiveView = (CView*) m_pDialog3;
    				break;
    
    	case	VIEW_STATITIK_SUCHE:
    				pNewActiveView = (CView*) m_pSplitter; //im Splitter werden mit OnCreate 2 Dialoge aufgerufen
    				break;
    
    	case	VIEW_INFO:
    				pNewActiveView = (CView*) m_pDialog4;
    				break;
    	}
    
    	if (pNewActiveView)
    	{
    		// don't switch when views are the same
    		if (pOldActiveView == pNewActiveView) return;
    
    		SetActiveView(pNewActiveView);
    		pNewActiveView->ShowWindow(SW_SHOW);
    		pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    		pOldActiveView->ShowWindow(SW_HIDE);
    		pOldActiveView->SetDlgCtrlID(m_nCurrentViewID);
    		m_nCurrentViewID = nView;
    
    		RecalcLayout();
    	}
    }
    

    Wenn ich nicht im Spltter bereich irgendwo hin klicke, ist alles in Ordnung.
    Ansonsten verschwindet der Bereich wenn ich beim nächsten mal den Splitter anwähle.

    Gruß
    andy_mann



  • Mmmhhh...

    hat hierzu wirklich niemand eine Idee ??

    Ich hänge gerade an dieser Stelle und komme einfach nicht weiter..

    Gruß und Danke
    andy_mann



  • Den View Switch hab ich immer in der Doc, da man dann auch gleich
    die entsprechenden Daten speichern kann, bzw. evtl. auf andere
    Dinge noch reagieren kann.

    bool CCodeMakerDoc::SwitchView(data *d)
    {
    	CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
    
    	CView* pOldActiveView = pMainWnd->GetActiveView();
    	int id = d->view;
    	// If we're already displaying this kind of view, no need to go further.
    	if (pOldActiveView->IsKindOf(views[id]->GetRuntimeClass()))
    		return TRUE;
    
    	CSplitterWnd* pSplitter = (CSplitterWnd *)pOldActiveView->GetParent();
    	pOldActiveView = (CView*)pSplitter->GetPane(0,1);//damit er nicht den Falschen View Löscht
    	int row= 0, col= 1;
    	ASSERT(pSplitter->IsChildPane(pOldActiveView, row, col));
    	CRect viewrect;
    	pOldActiveView->GetWindowRect(&viewrect);
    
    	// set flag so that document will not be deleted when view is destroyed
    	m_bAutoDelete = FALSE;    
    	// Delete existing view 
    	pOldActiveView->DestroyWindow();
    	// set flag back to default 
    	m_bAutoDelete = TRUE;
    //	row = 0;
    //	col = 1;
    	// Create new view  
    
    	CCreateContext context;
    	context.m_pNewViewClass = views[id]->GetRuntimeClass();
    	context.m_pCurrentDoc = this;
    	context.m_pNewDocTemplate = GetDocTemplate();
    	context.m_pLastView = pOldActiveView;
    	context.m_pCurrentFrame =NULL;// pMainWnd->GetActiveFrame();
    	//MessageBox(pMainWnd->m_hWnd,views[id]->GetRuntimeClass()->m_lpszClassName,"dljfa",MB_OK);
    	if (!pSplitter->CreateView(row, col, views[id]->GetRuntimeClass(), viewrect.Size(), &context))
    		return FALSE;
    
    	// Set active 
    	CView* pNewView = (CView *)pSplitter->GetPane(row, col);
    
    	pSplitter->GetParentFrame()->SetActiveView(pNewView);
    
    	pSplitter->RecalcLayout(); 
    	pNewView->OnInitialUpdate();
    	pNewView->SendMessage(WM_PAINT);
    
    	return TRUE;
    }
    

    views ist ein vector<CView*> welcher im Konstruktor gefüllt wird,
    und im Destruktor wieder zerstört.
    data ist ein struct, welches Daten über das angeklickte Item in nem
    Treeview enthält (die ItemData dort (DWORD) missbrauche ich um
    dort nen pointer rein zu hauen, der vom typ data* ist),
    unteranderem enthält er auch die Nummer des Views der dann
    angezeigt werden soll.

    Devil



  • Hallo,

    erstmal vielen Dank für den Source.

    In meinem Project versuche ich es allerdings etwas anders zu realisieren.
    Ich habe eine Class, in der ich die wichtigen Pointer halte und gegebnenfalls wieder abrufen kann.

    Daselbe mache ich auch mit dem Splitter und die dazu gehörigen Views.

    Ich checks nicht, warum die Views weg sind wenn man auf sie klickt ??

    Gruß
    andy_mann


Anmelden zum Antworten