Wechseln zwischen 2 Ansichten, die 1000.
-
Also genanntes Problem.
SDI 2 Ansichten hier als Beispiel jeweils von CFormView
in Mainframe:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { CView *pView1,*pView2; pView1 = (CView*) GetDlgItem(IDD_FORMVIEW_1); pView1 = (CView*)new CView1; pView1->Create(NULL,NULL,WS_BORDER,rectDefault,this,IDD_FORMVIEW_1, pContext); pView2 = (CView*) GetDlgItem(IDD_FORMVIEW_2); pView2 = (CView*)new CView2; pView2->Create(NULL,NULL,WS_BORDER,rectDefault,this,IDD_FORMVIEW_2, pContext); return CFrameWnd::OnCreateClient(lpcs, pContext); }
Irgend 2 Knöpfe zum umschalten
void CMainFrame::OnButtonView1() { //Ansicht ändern CView *pView,*pActiveView; CDocument *pDoc; pActiveView=GetActiveView(); pDoc=pActiveView->GetDocument(); POSITION pos = pDoc->GetFirstViewPosition(); while(pos!=NULL) { pView=pDoc->GetNextView(pos); if(pView->IsKindOf(RUNTIME_CLASS(CView1))) { SetActiveView(pView); pView->ShowWindow(SW_SHOWNORMAL); pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); pActiveView->ShowWindow(SW_HIDE); pActiveView->SetDlgCtrlID(ID_BUTTON_VIEW1); } } RecalcLayout(); }
und der 2. Button
void CMainFrame::OnButtonView2() { //Ansicht ändern CView *pView,*pActiveView; CDocument *pDoc; pActiveView=GetActiveView(); pDoc=pActiveView->GetDocument(); POSITION pos = pDoc->GetFirstViewPosition(); while(pos!=NULL) { pView=pDoc->GetNextView(pos); if(pView->IsKindOf(RUNTIME_CLASS(CView2))) { SetActiveView(pView); pView->ShowWindow(SW_SHOWNORMAL); pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); pActiveView->ShowWindow(SW_HIDE); pActiveView->SetDlgCtrlID(ID_BUTTON_VIEW2); } } RecalcLayout(); }
Die Konstruktoren der beiden Klassen noch öffentlich machen
SO, das funktioniert ja ganz einfach im Release ,ok
Im Debugger krieg ich eine Debug Assertion Failured
liegt das an den Zeigern in OnCreateClient()?,
Also wenn ich die Meldungen ignorier, läuft das Programm trotzdem einwandfrei.
Hatte das ganze jetzt schon im Dauertest und nie Probleme.
Wie krieg ich die Meldungenen trotzdem weg?
Und dann diese new, wo muss ich die in diesem Fall deleten oder wird das übernommen?
Wenn ich die Zeiger vom Typ CFormView wähle, kann ich create nicht mehr aufrufen, weil die scheinbar unterwegs irgendwann mal das public genommen wird?
Fragen über Fragen?
Vielleicht kann jemand was dazu sagen, wäre schön, danke
gerhardt
-
Hat wahrscheinlich keiner Lust sich das mal anzuschauen,
aber es wäre so schön, wenn ich das auf diese einfache Weise lösen könnte.
Wie gesagt, im Release läufts ohne Fehler.
-
Drück beim ASSERT bitte mal Wiederholen und zeig uns den Code, den er bemängelt. Dann kann man dir vielleicht eher helfen.
-
Also hier der Code nach beim Debug
BOOL CView::PreCreateWindow(CREATESTRUCT & cs) { ASSERT(cs.style & WS_CHILD); if (cs.lpszClass == NULL) { VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)); cs.lpszClass = _afxWndFrameOrView; // COLOR_WINDOW background } if (afxData.bWin4 && (cs.style & WS_BORDER)) { cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; } return TRUE; }
Liegt wohl daran, dass dieses ASSert im debug ausgeführt wird oder?
Gerhardt
-
ASSERT wird nur im Debugmodus ausgeführt, richtig.
Ich vermute, er steht bei der Zeile:
ASSERT(cs.style & WS_CHILD);
Ist doch ganz einfach was ihm fehlt: Er möchte, dass der View den Style WS_CHILD hat - gib ihm den doch, dann isser glücklich.
Also statt:
pView1->Create(NULL,NULL,WS_BORDER,rectDefault,this,IDD_FORMVIEW_1, pContext);
das hier
pView1->Create(NULL,NULL,WS_BORDER|WS_CHILD,rectDefault,this,IDD_FORMVIEW_1, pContext);
und für den anderen View analog.
-
Ja genau, das war es!
WS_CHILDWas du so alles weißt.
Vielen Dank!
mfg gerhardt
-
Bitteschön, aber gewußt hab ich es auch nicht - nur lernt man mit der Zeit, die Hinweise zu verstehen, die man so bekommt.
Wenn du das nächste Mal einen ASSERT hast, der dich nervt - guck mal was er anmeckert. Meistens läßt es sich so einfach beheben.
-
Weißt du was komisch ist, manchmal braucht man von außen einfach einen neuen Anstoß.
Das mit dem assert kannte ich schon, hab dahingegen ja vermutet, aber da gibt´s diese Schläuche, die so herum liegen und dann steht man drauf
Also nochmal Danke!
Und.
Dann muss man noch lernen die Hinweise zu deuten, so langsam hab ichs ja gefressen, aber dann gehen die Zeiten der MFC ja so langsam zu Ende und je mehr man weiß um so schwerer fällt einen der Abschied.servus Gerhardt