Befehl dynamisch zum Menü hinzufügen



  • Hallo!

    Ich möchte, dass nur ein Benutzer meines Programms einen bestimmten Befehl zu sehen bekommt - alle anderen nicht.
    Wie kann ich diesen Befehl anhängen und wie funktioniert sein Updaten und WM_COMMAND?



  • Die Command- und Update-Handler kannst du gerne normal anlegen (anhand der ID), in die Menüs kannst du dein Kommando z.B. über CMenu::InsertMenu() oder CMenu::AppendMenu() einfügen.

    (solange das Menü-Item nicht existiert, kann auch niemand den Befehl aufrufen)



  • Okay, die Handler habe ich schon mal. 😃
    Jetzt stehe ich aber vor der Frage, in welcher Funktion ich den Befehl hinzufüge.
    Hast du da einen Tip?

    Ich weiß ja auch nicht, für wielange das "neue" Menüitem besteht.
    1.) Bis ich es wegmache.
    2.) Bis das Menü zuklappt.
    3.) Anderes?

    😕



  • estartu schrieb:

    Okay, die Handler habe ich schon mal. 😃
    Jetzt stehe ich aber vor der Frage, in welcher Funktion ich den Befehl hinzufüge.
    😕

    Das kommt natürlich drauf an wo es sich entscheidet ob der Benutzer/Mitarbeiter dies sehen darf. Wenn eine Anmeldung erforderlich ist, könnte man dies direkt nach der Anmeldung hinzufügen.



  • Das Item bleibt afaik solnage dort im Menü stehen, bis du es per RemoveMenu() wieder rausschmeißt.

    Jetzt stehe ich aber vor der Frage, in welcher Funktion ich den Befehl hinzufüge.
    Hast du da einen Tip?

    Ich würde es in der Login-Methode hinzufügen (nachdem feststeht, daß der aktuelle Benutzer berechtigt ist, diesen Befehl zu nutzen) und in der Logout-Methode wieder entfernen.



  • So, ich habs. 👍

    CMenu* pMenu = AfxGetMainWnd()->GetMenu();
    	CMenu* pSubMenu = pMenu->GetSubMenu(3);
    	if (m_rBenutzer.IstAdmin())
    	{
    		pSubMenu->AppendMenu(MF_STRING, ID_EINSTELLUNGEN, _T("Einstellungen"));
    	}
    	else
    	{
    		pSubMenu->DeleteMenu(ID_EINSTELLUNGEN, MF_BYCOMMAND);
    	}
    

    Ich weiß zwar nicht, was der Unterschied zwischen DeleteMenu und RemoveMenu ist - aber da da funktioniert. 😉



  • RemoveMenu kappt ein Submenü nur aus deiner Struktur und hebt es weiter auf (sprich, dessen Struktur bleibt erhalten und kann später wieder eingehängt werden), DeleteMenu räumt das Submenü komplett auf und entsorgt die gesamte angehängte Struktur.

    (wenn du nur einen einzelnen Menüpunkt ein/ausbauen willst, ist das egal - wenn du eine komplette Menüstruktur regelmäßig ein- und aushängen willst (sieh dir z.B. MS Word an, dort tauchen auch regelmäßig andere Menüs auf, wenn sie gebraucht werden), ist RemoveMenu besser geeignet)



  • Noch ist es ein Menüpunkt.
    Aber eventuell gefällt das ja meinem Chef oder den Benutzern so gut, dass die das öfters haben wollen. 😉

    Danke jedenfalls für die Erklärung. 🙂


Anmelden zum Antworten