FormView über Button öffnen



  • Hallo erst einmal,

    Ja ich weiss, es ist eine einfache Frage (denke ich)
    aber komme von VB und will halt in C++ prog.!!

    Ich habe mir folgende FormView zusammengestellt :

    m_pHauptfenster = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CEingabeDoc),
    RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster
    RUNTIME_CLASS(CEingabe));
    AddDocTemplate(m_pHauptfenster);

    m_pKundenstamm = new CSingleDocTemplate(
    IDR_KUNDENDATEN,
    RUNTIME_CLASS(CKundenDoc),
    RUNTIME_CLASS(CKundeFrm),
    RUNTIME_CLASS(CKundenstamm));
    AddDocTemplate(m_pKundenstamm);

    Jetzt will ich über ein Button, welches in der Class CEingabe
    decl. ist, das FormView CKundenstamm aufrufen.

    Z.Z. öffnet sich beim starten des Progs ein vom System erstelltes
    Fenster zum auswählen der View´s. (dies soll nicht sein)

    Danke im voraus !!!!!

    bindegross
    😕



  • Hi,
    vergiss das mit dem zweiten CSingleDocTemplate, ich stand vor ein paar Tagen vor dem gleichen Problem und habs so gemacht:
    1.Dialogresource anlegen
    2.neue Klasse zu dieser Res. von CFormView ableiten
    3.Menubefehle zum Wechseln der Ansicht anlegen
    4.folgenden Handler anlegen für diese Befehle:
    ON_COMMAND_RANGE(ID_VIEW_FORM1,ID_VIEW_FORM2, OnViewFormViews)
    (Regeln für ON_..._RANGE beachten, siehe MSDN)

    void CMainFrame::OnViewFormViews(UINT nID)
    {
    CView* pOld = GetActiveView();
    CView* pNew = NULL;
    
    CDocument* pDoc = GetActiveDocument();
    
    switch(nID)
    {
    case ID_VIEW_FORM1:
    pNew = (CView*)new COriginalView;
    break;
    case ID_VIEW_FORM2:
    pNew = (CView*)new CForm2View;
    break;
    default:
    break;
    }
    pNew->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, rectDefault, this, 0, NULL);
    
    pOld->SetDlgCtrlID(0);
    pNew->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    
    pNew->ShowWindow(SW_SHOW);
    pOld->ShowWindow(SW_HIDE);
    
    pDoc->AddView(pNew);
    pDoc->RemoveView(pOld);
    
    SetActiveView(pNew);
    pNew->OnInitialUpdate();
    RecalcLayout();
    pOld->DestroyWindow();
    }
    

    Desweiteren müssen die protected-Konstruktoren der CViews auf public geändert werden.
    Nachteil der Methode ist der, dass bei jedem Wechsel der Ansicht die Views jedesmal neu erstellt werden. Ich hab es anders ausprobiert, aber so wie hier gezeigt erfordert die ganze Sache den geringsten (Verwaltungs)Aufwand.

    Lösung ist von codeguru.com entnommen.

    Hier noch meine update-funktion für die menubefehle:

    ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_FORM1, ID_VIEW_FORM2, OnUpdateViewForm)

    void CMainFrame::OnUpdateViewForm(CCmdUI* pCmdUI)
    {
    CView* = GetActiveView();
    BOOL bView1= RUNTIME_CLASS(COriginalView) == pView->GetRuntimeClas();
    BOOL bView2 = RUNTIME_CLASS(CForm2View) == pView->GetRuntimeClas();
    
    switch(pCmdUI->m_nID)
    {
    case ID_VIEW_FORM1:
    pCmdUI->Enable(!bView1);
    pCmdUI->SetCheck(bView);
    break;
    case ID_VIEW_FORM2:
    pCmdUI->Enable(!bView2);
    pCmdUI->SetCheck(bView2);
    break;
    default:
    break;
    }
    }
    

    Hoffe, ich konnte helfen. Ach ja, die ganze Sache mit dem Vergleich der RUNTIME_CLASS scheint mir zu umständlich zu sein. Bitte um alternative Vorschläge.



  • Hey (<Anfänger>unregistriert )

    dies hat ja gut funz, aber eigendlich doch ganz schön umständlich oder ?

    Wie sieht es denn aus, wenn man ein zweites Projekt erstellt und es dann mit einem Button aufruft ?

    Ist dies einfacher ?
    Wie sähe dort der Code aus ?

    Danke 😮



  • Original erstellt von BINDEGROSS:
    **Hey (<Anfänger>unregistriert )

    dies hat ja gut funz, aber eigendlich doch ganz schön umständlich oder ?

    Wie sieht es denn aus, wenn man ein zweites Projekt erstellt und es dann mit einem Button aufruft ?

    Ist dies einfacher ?
    Wie sähe dort der Code aus ?

    Danke 😮**

    Theoretisch möglich,
    wenn du ein neues Projekt erstellst, dann bekommst du ein eigenständiges Programm. Dieses kannst du aus deinem ersten Programm mit WinExec (oder ShellExecute, Shellexecutinfo) ausführen. Ist aber nicht zu empfehlen (unsauber)!


Anmelden zum Antworten