Ein Menu für verschiedene CMultiDocTemplates



  • Hallo Forum,
    ich wollte, dass meine MFC-MDI-Anwendung im Datei-Öffnen-Dialog
    folgendes stehen haben:

    "Bitmap-Dateien (.bmp)"
    "PCX-Dateien (
    .pcx)"
    "Targa-Dateien (*.tga)"
    usw.

    Also habe ich dann nach einem Tipp in diesem Forum folgendes gemacht:

    AddDocTemplate(new CMultiDocTemplate(
            IDR_IMAGEMTYPE,                 // BMP-Filter
            RUNTIME_CLASS(CImageMasterDoc),
            RUNTIME_CLASS(CChildFrame),
            RUNTIME_CLASS(CImageMasterView)));
    
        AddDocTemplate(new CMultiDocTemplate(
            IDR_IMAGEMTYPE2,                // PCX-Filter
            RUNTIME_CLASS(CImageMasterDoc),
            RUNTIME_CLASS(CChildFrame),
            RUNTIME_CLASS(CImageMasterView)));
    
        AddDocTemplate(new CMultiDocTemplate(
            IDR_IMAGEMTYPE3,                // TGA-Filter
            RUNTIME_CLASS(CImageMasterDoc),
            RUNTIME_CLASS(CChildFrame),
            RUNTIME_CLASS(CImageMasterView)));
    
        usw.
    

    Leider ist es so, dass wenn ich PCX- oder TGA-Dateien lade, mir kein neues
    Menu gezeigt wird. Ich habe nämlich nur ein Menu ("IDR_IMAGEMTYPE").
    Es sollen aber alle Bilder das gleiche Menu haben, da sie nach dem
    Ladevorgang alle in gleicher Form im Speicher liegen und deswegen
    alles auf alle Bilder angewendet werden kann.

    Also noch mal kurz: Wie kann ich jedem Template das gleiche Menu mitgeben,
    ohne für jeden Eintrag ein neues Menu anlegen zu müssen?

    Vielen Dank.



  • Also bei mir ist es so, dass mir Porgrammieren doppelt soviel Spass macht, wenn ich selber die Geistesblitze hab, statt ständig jemand anders um Hilfe zu bitten, vor allem bei solch einfachen Lösungen!
    Denn wenn man sich mal die Resourcen-IDs anschaut, bekommt man mit, dass Menu- und DocString-Resource die gleiche ID besitzen, d.h. CDocTemplate lädt sich diese Resourcen. Man kann aber nicht einfach ne neue String-Resource bei CDocTemplate angeben, weil, wenn man auf rechte Maustaste bei CMultiDocTemplate und danach bei CDocTemplate drückt und sich jeweils die Klassendefinition anschaut, mitbekommt, dass das CString-Objekt, welches den Doc-String enthält, als protected deklariert ist.
    Also ist doch die einfachste Möglichkeit, CMultiDocTemplate zu überschreiben, eine Funktion namens SetDocStringID zu setzen und innerhalb dieser dann mit LoadString den richtigen String zu laden.
    So, die 5 Zeilen Code solltest Du Dir nun noch selber überlegen können.



  • Vielen Dank für deine Antwort, auch wenn sie anfangs etwas genervt war.
    Ich bin halt kein Profi.
    So einfach wie du es dir vorgestellt hast, ist es aber anscheinend nicht.
    Ich habe deinen Lösungsvorschlag umgesetzt um dann zu merken, dass es nicht
    funktioniert. Sobald ich mit der Funktion "SetDocStringID()" die ID des
    Menus angebe, welches angezeigt werden soll, wird auch im Datei-Öffnen-Dialog
    wieder der falsche Datei-Filter-String angezeigt.

    Anschaulich:

    AddDocTemplate(new CMultiDocTemplate(
            IDR_IMAGEMTYPE,                 // BMP-Filter, gleiche ID wie Haupt-Menu
            RUNTIME_CLASS(CImageMasterDoc),
            RUNTIME_CLASS(CChildFrame),
            RUNTIME_CLASS(CImageMasterView)));
    
        CMyMultiDocTemplate tmpXTemplate = new CMyMultiDocTemplate(
            IDR_IMAGEMTYPE_2,               // PCX-Filter, kein Menu mit dieser ID vorhanden.
            RUNTIME_CLASS(CImageMasterDoc), // Deshalb Haupt-Menu mit ID: IDR_IMAGEMTYPE benutzen!
            RUNTIME_CLASS(CChildFrame),
            RUNTIME_CLASS(CImageMasterView))
    
        // ID des Haupt-Menus setzen
        tmpXTemplate->SetDocStringID(IDR_IMAGEMTYPE);
        // => Dadurch wird zwar das richtige Menu angezeigt, aber auch der Eintrag
        //    "BMP (*.bmp)" im Datei-Öffnen-Dialog statt "PCX (*.pcx)".
    
        AddDocTemplate(tmpXTemplate);
    

    Vielleicht habe ich deinen Lösungsvorschlag auch falsch verstanden. Wenn dem so
    ist, würde ich mich freuen wenn du mir sagt, was ich daran falsch verstanden habe.

    Vielen Dank



  • Zeig doch mal, wie Du SetDocStringID umgesetzt hast!
    Ich weiss, dass es funktioniert, weil ich es selber schon umgesetzt habe.



  • OK, vielen Dank, dass du mal nachsiehst. Viel war ja wirklich nicht zu tun.

    Also das Problem war ja, verschiedene Dialog-Öffnen-Datei-Filter zu haben, aber es soll immer das gleiche Menu geladen werden.

    //
    // Parameter an den Konstruktor der Oberklasse weiterleiten
    //
    CMyMultiDocTemplate::CMyMultiDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)
        : CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
    {
    }
    
    CMyMultiDocTemplate::~CMyMultiDocTemplate()
    {
    }
    
    void CMyMultiDocTemplate::SetDocStringID(UINT MyID){
        m_strDocStrings.LoadString(MyID);
    }
    


  • Nee, also du hast das noch net kapiert.

    IDR_IMAGEMTYPE ist die Resource-ID, zu der der String, das Menü, die Acceleratoren und so geladen werden.
    Wenn Du das Menü behalten willst, musst Du bei AddDocTemplate jeweils diese ID angeben und nicht IDR_IMAGEMTYPE/IDR_IMAGEMTYP2 ... !

    Danach gehst Du in die String-Resourcen, kopierst den String IDR_IMAGEMTYPE, in dem ja jetzt irgendwas mit bmp(*.bmp) steht, ersetzt bmp durch pcx und gibst dem String ne neue ID!
    Danach diese neue ID bei SetDocStringID angeben und das wars !



  • Hey,
    jetzt klappt es. Vielen Dank noch mal!


Anmelden zum Antworten