Einbinden von Dialog in CFormView

Das ist die Stelle wo er Abstürzt....
CVerleihlisteView* pView = (CVerleihlisteView*)m_wndSplitter.GetPane( 0, 1 );

m_wndSplitter ist tot ;(

Alles andere wurde ordnungsgemäß angelegt... und scheint auch zu funktionieren...

:( :( :( :(
 
Du hast den Splitter doch schon angelegt zu dem Zeitpunkt?

In meinem Beispiel hatte ich den Splitter vertikal angelegt, eine Pane links, eine rechts. Ist das bei dir evtl. anders?

Zeig sonst nochmal den Schnipsel, wo du den Splitter anlegst
 
Problem ist das ich das Splitterwnd nicht selber erstelle.
Ich habe beim Anlegen von diesem Projekt die Eigenschaften "Windows Explorer - Stil"
gewählt.

Dann hast du von Anfang an schon Splitterwnd drin... genau so wie im Windows Explorer halt ;)

Das Splitter wird hier erzeugt...

Code:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
	CCreateContext* pContext)
{
	// Unterteiltes Fenster erstellen
	if (!m_wndSplitter.CreateStatic(this, 1, 2))
		return FALSE;
 
	if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(150, 100), pContext) ||
		!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CVerleihlisteView), CSize(150, 100), pContext))
	{
		m_wndSplitter.DestroyWindow();
		return FALSE;
        }
  
  return TRUE;
}
 
So ein Absturz hab ich jetzt nicht mehr... *jubel*

Das Problem was ich jetzt noch habe ist das der Dialog im linken Splitter hängt und im rechten, da wo er hin soll..

So mach ich es jetzt....

Code:
  ...
  CFrameWnd* pFWnd = (CFrameWnd*)(AfxGetApp()->m_pMainWnd);
  //pFWnd->SetActiveView(0,2);
  CWnd *test = pFWnd->GetActiveView();
  
  m_pGamesDlg->Create(IDD_GAMES,test);
  ...
 
Jo, da isses ja auch wieder ohne Splitter :)

Von dem GetActiveView (auf deinen View-Typ gecastet) solltest du das GetPane( 0, 1 ) nehmen und statt dem test da einsetzen.
 
ne, sorry versteh nicht was du damit meinst... :(

Vielleicht kannst du es ja an einem Codebeispiel verdeutlichen...(ich denke ich habe dafür schon genug code gepostet) :)
 
Sorry, ich meine das so:

CFrameWnd* pFWnd = (CFrameWnd*)(AfxGetApp()->m_pMainWnd);

CVerleihlisteView* pMeinView = pFWnd->m_wndSplitter->GetPane( 0, 1 );

....schnippelschnappel-Dialog-erzeug....

m_pGamesDlg->Create( IDD_GAMES, pMeinView );


Ich hoffe, ich habe die Zusammenhänge richtig rausgelesen. Wenn das auch nicht geht, könntest du da ein kleines Testprojekt zusammenkleben und hier reinhängen. Dann gugg ich mal drüber.
 
Ok. Dank dir...
Ich werd dein code ausprobieren und selber noch ein bisschen versuchen...
Sollte es nicht klappen bastel ich was kleines....
 
OK... hab schnell eine Testanwendung zusammengebaut...
hab vor alle Kommentare die ich gemacht habe einfach mal tutorials.de geschrieben,
dann kannst du bei Bedarf schnell nach ihnen suchen...

Hab dein Beispiel beim create jetzt so reinkopiert. Da gibt es noch ein error....
(Anhang wieder gelöscht...)

so, jetzt nur den Anhang nicht vergessen ;)
 
Zuletzt bearbeitet:
Hab's jetzt raus, der Fehler lag wie üblich ganz woanders:

Du hast dir im CLeftView einen Pointer auf eine CMainFrame-Klasse gemerkt. Allerdings hast du dort nicht den einen CMainFrame, den die CWinApp erzeugt gemerkt, sondern mit new einen eigenen erzeugt. Dieser hat natürlich einen ungültigen Splitter, und das gibt später Ärger.

Ich habe ein paar Änderungen gemacht.

Hier in MainFrm.cpp:
Code:
void CMainFrame::changedialog()
{
  //tutorials.de hier liegt der fehler...
  // das ist das Bsp so aus dem Forum übernommen...
  //Ich hoffe ich habe jetzt in der eile nicht irgendwo anders
  //noch ein Fehler eingebaut...
  
  /*
  CFrameWnd* pFWnd = (CFrameWnd*)(AfxGetApp()->m_pMainWnd);
  
  CTestView* pMeinView = pFWnd->m_wndSplitter->GetPane( 0, 1 );
  */
  CTestView* pMeinView = (CTestView*)m_wndSplitter.GetPane( 0, 1 );
  
  //....schnippelschnappel-Dialog-erzeug....

  // NEU - alten Dialog zerstören
  if ( pdialog )
  {
    pdialog->DestroyWindow();
    delete pdialog;
  }

  // NEU - anderen Dialog erzeugen
  pdialog = new cderdialog();
  
  pdialog->Create( IDD_FORMVIEW, pMeinView );
  pdialog->SetWindowPos(&CWnd::wndTop,0,0,1600,1280,NULL);
 	pdialog->ShowWindow(SW_SHOW);
  //pdialog->DestroyWindow();
  
  
}

// NEU GetLeftPane
CLeftView* CMainFrame::GetLeftPane()
{
	CWnd* pWnd = m_wndSplitter.GetPane(0, 0);
	CLeftView* pView = DYNAMIC_DOWNCAST(CLeftView, pWnd);
	return pView;
}

MainFrm.h:
Code:
class CTestView;
// NEU - Klasse deklarieren
class CLeftView;

class CMainFrame
{

  .....	

  CTestView* GetRightPane();

  // NEU
  CLeftView* GetLeftPane();

  ...

};

und LeftView.cpp:
Code:
CLeftView::CLeftView()
{
  // Anmerkung - Das erzeugt einen zweiten, unbenutzten CMainFrame!
  //m_pmain = new CMainFrame();
  m_pmain = NULL;

}

CLeftView::~CLeftView()
{
  // Anmerkung - das ist auch nicht mehr notwendig
  //delete m_pmain;
}

Was jetzt noch rein müsste, je nach Item anderen Dialog einsetzen, und Dialog nur zerstören/neu aufbauen, wenn er sich tatsächlich vom Typ her ändert.
 

Neue Beiträge

Zurück