Numerierung der Fenstertitel bei MDI



  • (OT: Ja, ja, ich weiss - Rechtschreibreform. Aber die Numerierung ist nunmal numerisch und nicht nummerisch.)

    In einer MDI-Umgebung lassen sich bekanntlich auch für ein und dasselbe CDocument mehrere CView anlegen. Beim ersten CView erscheint in der Titelleiste der Dateiname oder ein Default-Name, in MS-Word z.B. "Dokument1". Mehrere CView für dasselbe CDocument werden per CMDIFrameWnd::OnWindowNew() angelegt und dabei automatisch und zwangsläufig mit dem Titel "Dokument1:1", "Dokument1:2" usw. versehen.

    Hat jemand eine Idee, wie ein von CView abgeleiter CMyView an diese :nummer herankommen kann? CWnd::GetWindowText() bringt's nicht und CDocument::GetTitle() liefert nur den Titel ohne :nummer, weil die ja eben vom View abhängig ist.

    Mit CDocument::GetFirstViewPosition() und CDocument::GetNextView() kann man sämtliche vorhandenen Views abklappern. Notlösung ist also bisher, CView::this mit GetDocument()->GetNextView() zu vergleichen und mitzuzählen. Aber irgendwo muss doch auch diese :nummer stecken 😕



  • Ich würd versuchen, die direkt vom View (oder der View-Erzeugung) zu bekommen. Nachträglcih 'nen UI-String auslesen und auseinanderparsen ist immer ne schlechte Idee.

    [edit]
    CFrameWnd hat einen (undokumentierten public) Member m_nWindow mit folgendem Kommentar:

    int m_nWindow;  // general purpose window number - display as ":n"
                    // -1 => unknown, 0 => only window viewing document
    	      // 1 => first of many windows viewing document, 2=> second
    

    Ist das nix?

    [/edit]



  • Bingo, das isses! 👍
    Danke, hat mir bestens geholfen! Man braucht lediglich in CMyView::OnInitialUpdate() einfach ((CMDIChildWnd)GetParent())->m_nWindow* abholen. Wenn man's weiß, isses ganz einfach ...

    Die Nummer aus dem String zu popeln war auch nur geplant, weil ich nicht wusste, wo ich sie sonst hernehmen soll. Davon abgesehen konnte CWnd::GetWindowText() nichts bringen. Hab' nicht mehr daran gedacht, dass da noch ein CMDIChildWnd drumherum ist. Also GetParent()->GetWindowText() könnte in CMyView auf den Titel incl. :nummer zugreifen, aber das hat sich ja jetzt erledigt.

    Falls es jemand interessiert: Bei der Suche nach m_nWindow in der Knowledge Base bin ich auch noch auf Artikel Q99182 gestoßen, in dem beschrieben wird, wie die zwangsläufige Ausgabe des Titels unterdrückt werden kann um einen beliebigen View-Titel auszugeben:

    BOOL CMyChildFrame::PreCreateWindow(CREATESTRUCT &cs)
    {
      if(!CMDIChildWnd::PreCreateWindow(cs)) return(FALSE);
      [b]cs.style &= ~FWS_ADDTOTITLE; //suppress output of doc title in header[/b]
      return(TRUE);
    }
    
    void CMyView::OnInitialUpdate()
    {
      CMYVIEWBASECLASS::OnInitialUpdate();
      [b]GetParent()->SetWindowText(_T("Bescheid!"));[/b]
      ...
    }
    

Anmelden zum Antworten