none
MDI App: Wie bekomme ich das richtige CMenü? RRS feed

  • Frage

  • Hallo!

    Momentan bastle ich gerade an einer MDI Testanwendung. Jetzt habe ich einen neuen Menüpunkt zum Menü "IDR_MDIMultiViewTesTYPE" hinzugefügt. Der neue Punkt hat die ID_ANSICHT_ZOOM und hat das "checked" flag gesetzt, so dass ich hier eben wie beim Statusbareintrag das dazuschalten und abschalten kann (oder sollte).

    Die Commandmessage habe ich im View abgefangen und lege dann mit

    ...

     void CMDIMultiViewTestView::OnAnsichtZoomview()
    {
     // TODO: Resource memory error handling
     CCreateContext ctx;
     ctx.m_pNewViewClass = RUNTIME_CLASS(CZoomView);
     ctx.m_pCurrentDoc = GetDocument();
     ctx.m_pLastView = this;

     CMDIZoomViewFrame* new_frame = new CMDIZoomViewFrame();
     CChildFrame* this_frame = (CChildFrame*)AfxGetApp()->m_pMainWnd;

     if (  ! new_frame->LoadFrame(IDR_ZOOMVIEW_FRAME,
       WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
       this_frame->GetParentFrame(),
       &ctx))
     {
      // errors
     }
     new_frame->InitialUpdateFrame(GetDocument(),TRUE);

    }

    ...

    einen neuen Frame und einen neuen View an und verbinde das mit dem aktuellen Dokument. Das klappt soweit auch.

    Jetzt möchte ich eigentlich per "GetMenu()" Zugriff auf das Menü erhalten und den Punkt "anhaken". Ich weis, dass ich mich durchhangeln muss durch die Submenüs bis ich das richtige Item habe. Dazu habe ich eine Funktion, welche mit "GetMenuItemCount()" und einer Schleife durch das Menü geht und mir dann den Richtigen Pointer gibt. ABER: Beim Ersten

    CMenu* pmenu = MeinView::GetMenu() kommt ein Pointer ungleich Null zurück, aber ein pmenu->GetMenuItemCount()" bleibt in der Assertion hängen.

    afxwin1.inl: Zeile 943

    _AFXWIN_INLINE

     

    int CMenu::GetMenuItemCount() const

    { ASSERT(::IsMenu(m_hMenu));

     

    return ::GetMenuItemCount(m_hMenu); }

    Habe schon versucht über die App (extern MyApp theApp), den ParentFrame, den View den Menüpointer zu bekommen aber jedesmal das selbe. Was kann ich machen? Wo kriege ich den richtigen Pointer her?

    Den Menüpunkt habe ich in der Resource IDR_MDIMultiViewTesTYPE hinzugefügt aber IDR_MDIMultiViewTesTYPE lässt sich im Projekt nur in den Resourcendefines und beim Anlegen des DocTemplates finden.

    Gruß

    Georg

    Donnerstag, 17. Februar 2011 12:17

Antworten

  • Das macht man mit einem ON_UPDATE_COMMAND Handler!
    Du musst Dir das Menü nicht besorgen und es manuell machen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert schorsch_76 Sonntag, 20. Februar 2011 22:26
    Samstag, 19. Februar 2011 12:21
    Moderator