Problem mit Menu



  • Hi,
    ich hab da eine Frage zu InsertMenu, wo kann ich die neue IDD für dieses Menü Punkt angeben? Bis jetzt mach ich das so:
    CMenu* mmenu = GetMenu();
    CMenu* submenu = mmenu->GetSubMenu(0);
    submenu->InsertMenu(i+2,MF_BYPOSITION,NULL,"Test");
    Ich nehme an, die gibt man beim dritten Parameter an, aber wie mach ich das?

    MfG
    Daniel



  • Hallo, also einfach angeben. Die ID ist ein UINT (unsigned int), also "einfach" definieren und angeben.

    PROBLEM: Wenn man mit dem Assistenten arbeitet, vergibt der ja auch ID's und es kann zu überschneidungen kommen, also dann am besten die neue ID mit dem Assistenten festlegen: In der Resource-Ansicht ganz oben rechts-klicken und 'Resource Symbols...' auswählen und mit dem Dialog die neue ID festlegen.

    Gruß mathi



  • Hallo,

    das Problem ist nur, dass ich das Menü dynamisch erstelle, ich weiß vorher nicht, wieviel Einträge ich haben werden. Ich kann ja schlecht in der Schleife irgendwie die ID definieren.
    #define IDD_TEST_+this->m_test;
    Das geht ja schlecht, nur ich weiß nicht, wie ich das machen soll. Mit dem Assistenten kann ich ja nicht arbeiten, wenn ich nicht weiß wieviele Einträge ich brauch.

    MfG
    Daniel



  • Hi,
    noch eine zweite Frage:
    Ich dachte folgender code wird aufgerufen, wenn ich den Menüeintrag anklicke:

    BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
    {
        // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
        if(nCode==CN_COMMAND && nID==1234)
        {
    
        }
        return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
    }
    

    Aber dieser Code bewirkt das selbe, als wenn ich CN_UPDATE_COMMAND_UI nehme, er wird aufgerufen, sobald sich das Popup des Menüs öffnet. Ich peil jetzt gar nichts mehr 🙂
    Wo liegt mein Fehler?

    MfG
    Daniel



  • Original erstellt von Danielxx:
    **...bewirkt das selbe, als wenn ich CN_UPDATE_COMMAND_UI nehme, er wird aufgerufen, sobald sich das Popup des Menüs öffnet. [...] Wo liegt mein Fehler?
    **

    Ist richtig so, ist kein Fehler. Durch die Behandlung von 'CN_UPDATE_COMMAND_UI' hast du die Möglichkeit, kurz bevor sich das PopUp öffnet, Updates für die Menüeinträge (z.B. bzgl. Ansicht) durchzuführen. Du kannst z.B. ein Häckchen vor einem Eintrag setzen oder entfernen. Also das PopUp Updaten bevor es angezeigt wird. Erst bei 'CN_COMMAND' führt man die eigentliche Funktion des Menüeintrages aus.

    Zu deinen dyn. Menüs: Da kommt es sehr darauf an, was du genau machen möchtest. Je nach ID willst du bestimmt eine Funktion ausführen, also sollte diese schon eindeutig implementiert sein. Wenn du nun ein Menü dyn. erstellst, solltest du ja zum Zeitpunkt der Erstellung schon wissen, was die Funktion machen soll. Z.B. User oder KI deines Programms 😉 legt fest, welche Funktionen er im PopUp haben will z.B. Fett / Kursiv /... Und danach mußt du dann die ID's verteilen. (Bemerkung: Eine ID kann mehrfach vergeben werden.)

    Also angenommem 'programm' weiß, Menü für 'Fett' wird gebraucht. In Tabelle nachsehen welche ID hat 'Fett'? (das geht ganz Prima mit CMapStringToObject, da kann man als Index einen String angeben und bekommt die zuvor zugeordnete Zahl/CObject zurück). ID und Funktion sind jetzt bekannt, also Menü mit Text:"Fett" und ID:ID_FETT erzeugen. Und in OnCmdMsg haste noch ein switch für ID_FETT und führst die Funktion für Fett aus. Fertig!

    Ich hoffe, ich hab dir ein paar nützliche Ideen geliefert.
    Gruß mathi

    [ Dieser Beitrag wurde am 07.01.2003 um 21:20 Uhr von mathi editiert. ]



  • Bemerkung: Definition muß nicht über #define erfolgen. Es geht auch 'const UINT ID_BLABLA = 1234;', kann man auch entsprechend auf CObject casten, falls nötig.



  • Hi,
    vielen dank schon mal für deine Hilfe, das mit der ID hat schon mal geklappt.
    Ein Problem hab ich aber noch, welche Nachricht bekomm ich geschickt, wenn ich den Menüeintrag anklicke? Wenn ich mit dem Assisten arbeite, dann brauch ich ON_COMMAND dafür, wenn ich aber CN_COMMAND filtere, dann bekomm ich die Nachricht schon bevor ich das Menüfeld anklicke. Also was muss ich dafür nehmen? Ich hoffe, das ist noch einigermaßen verständlich beschrieben 🙂

    MfG
    Daniel



  • Also da komm ich auch nicht so richtig weiter. Aus irgend einem Grund bekomme ich ständig (auch bei Mousmoves über den View) CN_COMMAND und CN_UPDATE_COMMAND_ID.

    Weiß jemand, wie man diese beiden CN_'s in OnCmdMsg richtig filtert?

    Vorläufig könnte für CN_COMMAND folgendes helfen:

    if (pHandlerInfo == NULL)  //existiert schon ein Handler?
    {
        if((nID == ID_FILE_NEW) && (nCode == CN_COMMAND)) TRACE("-->Command\n");
    }
    

    Gruß mathi



  • Vielen Dank, jetzt klappt es zumindest 🙂


Anmelden zum Antworten