Menüeinträge ändern und untermenüs einfügen



  • Ich habe ein SubMenu, welches aufgerufen wird, wenn ich auf das TrayIcon klicke.

    in diesem Menü befindet sich ein eintrag, den ich zur programmlaufzeit ändern möchte.

    aber ich möchte für diesem eintrag noch ein untermenü erstellen, in das ich eine unbestimmte anzahl an einträgen einfüge.

    das problem: ich weis zwar wie man in ein menü einträge bekommt, aber nicht wie man einem eintrag ein submenü zuweist !?


  • Administrator

    Ehm ... weiss jetzt nicht ob ich dich richtig verstanden habe. Aber ich denke mal das geht so:

    CMenu* pMainMenu; // ist ein Zeiger auf dein Menu
    CMenu* pSubOneMenu = pMeinMenu->GetSubMenu(nPosOne); // Untermenü holen
    CMenu* pSubTwoMenu = pMSubOneMenu->GetSubMenu(nPosTwo); // Untermenü holen
    // usw. bis du das richtige untermenü hast.
    pSubXXXMenu->InsertMenu(...);
    

    So sollte das doch eigentlich gehen. Nehm ich zumindest an, ich habe es bisher nur bis zum ersten Submenu gemacht nie weiter. Musst du halt mal testen.

    Grüssli



  • das mit den submenus über GetSubMenu() ist kein problem.

    nur ich habe keine ahnung wie ich ein neues submenü erstellen kann.

    InsertMenu() hat komischer eise den gleioch effekt wie AppendMenu(), da fügt er nur ein neues item ins menü ein.

    kann man überhaupt ein neuen submenu für einen bestimmten eintrag erstellen ?


  • Administrator

    Hmmm ok ... mal schauen, ich hab mich jetzt klug gemacht mit der MSDN, also deine Arbeit übernommen. So sollte es funktionieren:

    HMENU hSubMenu = CreateMenu(); // Neues SubMenu erstellen
    CMenu* pSubMenu = CMenu::FromHandle(hSubMenu);
    pSubMenu->AppendMenu(MF_STRING, ID_XXX, _T("Bla&bla bla"));
    // SubMenu mit Items füllen....
    
    CMenu* pMenu = AfxGetMainWnd()->GetMenu(); // Oder was auch immer, einfach das MainMenu holen, wo man das Submenu dazufügen möchte.
    pMenu->AppendMenu(MF_POPUP, (UINT)hSubMenu, _T("Name des Submenu"));
    
    // Wenn das SubMenu einem Menü dazugefügt wird, welches dem Fenster gehört, dann wird es von selbst zerstört beim beenden.
    // Wenn es nicht einem Fenster gehört, muss man das Menu selber zerstören.
    // Das geht am einfachsten, wenn man das MainMenu mit CMenu::DestroyMenu oder DestroyMenu zerstört.
    

    Man kann auch ein CMenu erstellen und dann das HMEMU mit GetSafeHMENU holen. Doch dann muss man darauf achten, dass das CMenu-Objekt nicht zerstört wird und muss es entsprechen aufbewahren, bzw. gegebenenfalls löschen. Daher würde ich CreateMenu bevorzugen.

    Hoffe das hilft jetzt.

    Grüssli



  • ja haste recht !! es funktioniert ... so schwer wars ja gar nicht 😉 aber 'MF_POPUP' hab ich wohl übersehen.

    danke !


Anmelden zum Antworten