Menü per Quellcode erstellen
-
Hallo,
habe eben versucht ein Menü in der MFC per QuellCode zu erstellen. Mein problem ist, das ich die ersten Einträge (z.B. Datei, Bearbeiten) auf dem Menü ohne Probleme hinbekommen. Nun wollte ich diesen ebenfalls UntermenüPunkte zuweisen (z.B. Datei->Beenden, Bearbeiten->kopieren)
Wie lässt sich dies realisieren???
Mein Quellcode bis jetzt:CMenu mainMenu; CMenu fileMenu; mainMenu.CreateMenu(); fileMenu.CreateMenu(); fileMenu.AppendMenu(MF_STRING,5678,"Öffnen"); fileMenu.AppendMenu(MF_STRING,9000,"Speichern"); fileMenu.AppendMenu(MF_STRING,1234,"Beenden"); mainMenu.AppendMenu(MF_POPUP,NULL,"Datei"); mainMenu.AppendMenu(MF_POPUP,NULL,"Bearbeiten"); CMenu *xx = mainMenu.GetSubMenu(0); xx->AppendMenu(MF_STRING,1234,"Beenden"); SetMenu(&mainMenu);
-
CMenu::InsertMenu();
-
Hi,
dies bewirkt bei mit ebenfalls nichts.
Der Befehl AppendMenu und InsertMenu sind ja fast identisch, ausser das ich bei der InsertMenu Methode noch die genaue Position angeben kann wo der Neue MenuItem erstellt werden soll.
-
so in der Richtung:
CMenu mNeu,mDatei; mNeu.CreatePopupMenu(); mDatei.CreatePopupMenu(); mDatei.AppendMenu(MF_STRING,NULL,"Öffnen"); mDatei.AppendMenu(MF_STRING,NULL,"Speichern"); mDatei.AppendMenu(MF_STRING,NULL,"Bearbeiten"); mNeu.InsertMenu(0,MF_POPUP,(UINT)mDatei.m_hMenu,"Datei"); mNeu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,[...],this);wie gesagt in der richtung...
-
@kreen
Das was du geschrieben hast ist für ein POPUP Menü das über die Rechte Maustaste erreichbar ist. Bei mir geht es aber nicht um diese Menüs, sondern um die ganz normalen Menüs die sich an der TitelZeile befinden...
-
Versuche mal, das FileMenue nicht als eigenes CMenu zu erstellen, sondern über mainMenu.GetSubMenu() zu ermitteln.
Und dann dessen Methode InsertMenu aufzurufen.
-
Dies habe ich auch schon versucht (siehe ganz oben erster Post von mir), leider brachte dies auch kein erfolg
-
Das muß gehen!

Hier ist es genauso beschrieben:
http://www.c-plusplus.net/forum/topic%2C50293.htmlÜbrigens ist ein PopUp Menu ein ganz normales Menue in der Titeleiste, das Aufpringt wenn man mit der Maus darauf klickt.
Das Menue mit der rechten Maustaste nennt man Kontextmenu.
-
ich hab ja auch gesagt in der richtung...
das läuft alles auf CMenu heraus deshalb ist das egal
das was du willst ist auch blos nen popup nur is die position von windowrect abhängig
-
ich werde es im laufe der Woche nochmals versuchen.
Aber schon mal danke für eure Hilfe...
-
So,
hab es doch nochmal schnell probiert. Der Auschlaggebende Punkt war das CreatePopupMenu. Hiermit funzt dies.
Hier mal noch den Code, vielleicht kann diesen irgendwann mal jemand gebrauchenCMenu mainMenu; CMenu *fileMenu = new CMenu; mainMenu.CreateMenu(); fileMenu->CreatePopupMenu(); fileMenu->AppendMenu(MF_STRING,5000,"DummyEintrag"); fileMenu->AppendMenu(MF_STRING,5001,"DummyEintrag2"); fileMenu->AppendMenu(MF_STRING,5002,"DummyEintrag3"); fileMenu->AppendMenu(MF_STRING,5003,"DummyEintrag4 "); mainMenu.AppendMenu(MF_POPUP,(unsigned int)fileMenu->GetSafeHmenu(),"Datei"); SetMenu(&mainMenu);
-
Hi
und wie sprichst du dann die Menüpunkte an ? Hat das nicht was
mit #define von den Nummern 500x zu tun ? So dass man auch eine
Funktion starten kann mein ich.
-
@Spezi
Ja, normalerweise werden anstatt den nummern definierte Wörter wie ID_CLOSE und so verwendet.#define ID_CLOSE 5000Dann kannst du statt
fileMenu->AppendMenu(MF_STRING,5000,"DummyEintrag");einfach
fileMenu->AppendMenu(MF_STRING,ID_CLOSE,"DummyEintrag");schreiben!
Anschließend musst du in der MESSAGE_MAP die funktionen zuweisenBEGIN_MESSAGE_MAP(myframe,CFrameWnd) ON_COMMAND(ID_CLOSE, OnClose) END_MESSAGE_MAP()Dies bleibt also wie die ganze Zeit auch. Mir Persönlich ging es nur um das Dynamische erstellen des Menüs. Bin zur Zeit Anfänger mit der MFC und finde diese Sachen doch schon irgendwo wichtig. Will ja mal auch irgendetwas Programmieren können das dynamisch über DLL dateien (Plugins) oder so eigene Menüpunkte hinzufügen kann. Theoretischer weise könnte ich aber auch bei dem ON_COMMAND einfach die 5000 reinschreiben.