Hallo zusammen,
Mit dieser Methode versuche ich auf das Document zuzugreifen. Die Adresse ist die gleiche aber der Inhalt dann nicht mehr.
Also ich habe mir einer (SDI) Applikation eine Methode Switch für das umschalten mehrerer Views gebaut was auch super funktioniert. Jetzt ist mir aufgefallen, dass ich kein Zugriff auf mein Document aus den einzelnen Views habe. D.h. auf die Variablen die ichim Document deklariert habe.
Wo ist mein Fehler?
In meiner View.h steht dann
in Der View.cpp
Ich hoffe das ist nicht alzu verwirrend!
Gruß
kerian
Code:
GetDocument();
Also ich habe mir einer (SDI) Applikation eine Methode Switch für das umschalten mehrerer Views gebaut was auch super funktioniert. Jetzt ist mir aufgefallen, dass ich kein Zugriff auf mein Document aus den einzelnen Views habe. D.h. auf die Variablen die ichim Document deklariert habe.
Wo ist mein Fehler?
Code:
void CMainFrame::SwitchView()
{
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_pCFirstView == NULL)
m_pCFirstView = pOldView;
// Falls zweites View noch nicht erstellt
if (m_pCSecondView == NULL)
{ TRACE("Erstelle View2 \n");
CRuntimeClass *pCR = RUNTIME_CLASS(CSecondVIew);
m_pCSecondView = static_cast<CSecondVIew*>(pCR->CreateObject());
// ID des Views ungleich AFX_IDW_PANE_FIRST setzen!
m_pCSecondView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,rectDefault,
this,AFX_IDW_PANE_FIRST+1,NULL);
}
// Falls drittes View noch nicht erstellt
if (m_pCThirdView == NULL)
{ TRACE("Erstelle View3 \n");
CRuntimeClass *pCR;
pCR = RUNTIME_CLASS(CThirdView);
m_pCThirdView = static_cast<CThirdView*>(pCR->CreateObject());
// ID des Views ungleich AFX_IDW_PANE_FIRST setzen!
m_pCThirdView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,rectDefault,
this,AFX_IDW_PANE_FIRST+1,NULL);
}
// Neues aktives View bestimmen
if (m_ViewActive == 1)
{
pNewView = m_pCFirstView;
m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
CMenu menu;
CMenu *pmenu;
pmenu = &menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(pmenu);
menu.Detach();
UpdateWindow();
}
if (m_ViewActive == 2)
{
pNewView = m_pCSecondView;
m_wndToolBar.LoadToolBar(IDR_TOOLBAR1);
CMenu menu;
CMenu *pmenu;
pmenu = &menu;
menu.LoadMenu(IDR_MENU1);
SetMenu(pmenu);
menu.Detach();
UpdateWindow();
}
if (m_ViewActive == 3)
{
pNewView = m_pCThirdView;
// m_wndToolBar.LoadToolBar(IDR_TOOLBAR3);
m_wndStatusBar.SetPaneText(0,"jj");
//LoadFrame(IDR_MENU1, WS_OVERLAPPEDWINDOW, NULL, NULL);
// CMenu menu;
// CMenu *pmenu;
// pmenu = &menu;
// menu.LoadMenu(IDR_MENU1);
// SetMenu(pmenu);
// menu.Detach();
UpdateWindow();
}
// 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);
// UpdateWindow();
// Zeiger auf Dokument holen
CDocument *pDoc = pOldView->GetDocument();
// View mit Dok verbinden
if(pOldView != pNewView)
{
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_ViewActive = !m_ViewActive;
}
}
In meiner View.h steht dann
Code:
CTestDoc* GetDocument();
in Der View.cpp
Code:
void CSecondVIew::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// ZU ERLEDIGEN: Code zum Zeichnen hier einfügen
pDC->TextOut(15,15,"View2");
// pDoc->m_int; ?
pDC->TextOut(20,20,"View2");
}
.
.
.
CTestDoc* CSecondVIew::GetDocument() // Die endgültige (nicht zur Fehlersuche kompilierte) Version ist Inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc)));
return (CTestDoc*)m_pDocument;
}
Ich hoffe das ist nicht alzu verwirrend!
Gruß
kerian