Menue-Eintrag deaktiviert in MDI Projekt



  • Hallo Leute

    Ich bastele an einem MDI-Projekt.
    Dabei habe ich folgende Frage :

    Es wird automatisch die Menue-Leiste IDR_MAINFRAME erstellt.
    Möchte ich nun in dieser Menue-Leitse zb unter Ansicht einen weiteren
    Eintrag vornehmen, so ist dieser während der Ausführung des Programms
    deaktiviert .
    In den Einstellungen ist er jedoch aktiviert und nicht greyed eingestellt.

    Weis jemand wieso und wo die Deaktivierung erfolgt bzw wie man das ändern kann?

    Danke und Gruß
    Linus



  • MFC deaktiviert afaik alle Menü-Einträge, für die es keine Message-Handler hat. Ansonsten kannst du auch einen Update-Handler definieren (ON_UPDATE_COMMAND_UI), der sich um diese Fragen kümmert.



  • das menu IDR_MAINFRAME wird bei MDI anwendungen eigendlich nur benutzt wenn keine Ansicht geöffnet ist. somit musst du die Command Function des Button in die CMainFrame setzen. Somit wird die aktiviert.
    Aber wenn eine ansicht geöffnet ist wechselt das menu wieder und du hast keine zugriff mehr auf Command Function der Button die du in der MainFrame gesetzt hast



  • Wenn ich das mache , kann ich dort aber keine Ansicht aufrufen, weil er
    zb GetDocument() nicht kennt 😞

    Wie wird das denn zb bei dem Menue-Punkt 'Neu' gemacht ?



  • Wegen dem GetDocument schau mal da rein: http://www.c-plusplus.net/forum/viewtopic-var-t-is-125623.html
    :xmas1:



  • Danke für die Antworten

    Ich blicke da noch nicht ganz durch.

    Also, ich rufe im standardView die neuen Fenster folgendermaßen auf:

    CDocument *pDoc = (CDocument*)GetDocument(); 
    	CFrameWnd *frameWnd = ((Cmditest4App*)AfxGetApp())->m_pDocFormView->CreateNewFrame(pDoc, NULL); 
    	frameWnd->InitialUpdateFrame(pDoc, TRUE);
    

    Wenn ich das richtig verstehe (ich bin ja lernwillig 😉 ) brauche ich ein
    CDocument . Das hole ich mir in einem View mit ->GetDocument().
    Jetzt schreibt estartu:

    An das Document kommt man mit

    C...Doc* pDoc = dynamic_cast<C...Doc*>(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument()); 
    ASSERT(pDoc);
    

    Falls man mehrere Dokumente hat (was dann genau genommen aber kein echtes SDI ist), bekommt man damit das aktuell angezeigte.
    Vom Mainframe aus kann man das AfxGetMainWnd weglassen.

    Das kann ich nicht nachvollziehen. (Sorry wenn ich so frage )



  • linus schrieb:

    Das kann ich nicht nachvollziehen. (Sorry wenn ich so frage )

    Sorry, ich dachte du findest den Link auch so.
    Mein Artikel ist zu SDI, zu MDI hat einer weiter unten was gepostet.
    http://www.codeguru.com/forum/showthread.php?t=281430

    MDIGetActive()->GetActiveView()->GetDocument()
    

    🙂



  • Oh , 😮

    Das ist ja eine tolle Tabelle, Danke.

    Habe aber immer noch einen Fehler 'unbehandelte Ausnahme'

    Ich habe den Code folgendermaßen geändert (aber nicht verstanden 😕 )

    CDocument *pDoc = (CDocument*)MDIGetActive()->GetActiveView()->GetDocument();
    

    Ich lese das so, dass ich von einem aktiven CView das CDocument hole (komisches Deutsch 😉
    jedoch habe ich wenn die Standard-Menueleiste IDR_MAINFRAIM angezeigt wird
    gar keine Ansicht geöffnet. Oder spielt das keine Rolle?



  • Wenn keine Ansicht offen ist, kann es keinen aktiven View geben und du kriegst kein Doc.
    (Mist, hab ich eben nicht dran gedacht, sorry.)

    Hmm, jetzt weiß ich leider auch nicht weiter. 😞



  • Wie funktioniert das denn wenn ich in diesem Menue ein neues Dokument öffne?

    Wenn ich eine neue Ansicht öffne brauche ich doch ein
    CDocument und ein CFrameWnd
    erst dann kann ich mit InitialUpdateFrame() die Ansicht darstellen.
    (mal ganz einfach ausgedrückt)

    😕



  • Ich habe versucht die Command-Funktion für den Menue-Eintrag in C..App zu erstellen.
    Dabei bleibt der Eintrag nach der Ausführung aktiviert.
    So wie ich das sehe kann man von CMainFrame aus gar nicht auf die CDocument-Klasse
    zugreifen , geschweige denn ein Objekt erstellen.
    In C..App dagegen ist CDocument bekannt.
    Nur will das dort mit dem Erstellen eines CDocument-Objekts auch nicht klappen .

    Ich komme irgendwie nicht weiter.


Log in to reply