Visual C++ MFC - Menü abfragen welches ist gesetzt

leon_20v

Erfahrenes Mitglied
Hallo,

ich würde gern über ein Button ein Menü austauschen.
Dazu hab ich folgenden Code geschrieben

Code:
m_MyNewMenu.LoadMenu(IDR_MENU2);

		
SetMenu(NULL);
										
CMenu *pMenu = CMenu::FromHandle(leeresHandle);	// Leeres Handle wird übergeben******
	
		
if(pMenu) 
    pMenu->DestroyMenu();

SetMenu(&m_MyNewMenu);
leeresHandle = m_MyNewMenu.m_hMenu;

::DestroyMenu(leeresHandle);

Was ich schonmal nicht verstehe, ich hab ja einfach nur das "leeresHandle" erstellt und überge das?

Also wenn ich einmal auf diesen Button klicke, dann funktioniert alles, beim zweiten mal bekomm ich einen Fehler. Vermutlich weil ich die handles zerstöre.

Naja ich hätte jetzt gern das wenn menu1 gesetzt ist, dann soll auf dem button menu2 gesetzt werden und wenn menu2 gesetzt ist dann menu1.

aber dazu sollte ich doch wissen welches aktuell gesetzt ist
 
Die Reihenfolge ist da etwas seltsam. Du setzt dein Menü, aber zerstörst es dann direkt (obwohl es gesetzt ist?)

Mit GetMenu müßtest du das aktuell gesetzte Menu bekommen.

Ich würde in deinem Fall gar nicht zerstören, sondern jeweils nur das neu zu setzende mit SetMenu ans Fenster binden. Dann kannst du mit GetMenu auch besser vergleichen.
 
danke für die super schnelle antwort.

If (GetMenu() == IDR_MENU1)

hab ich schon versucht, das geht natürlich nicht weil IDR_MENU1 n int ist und GetMenu() ein handle zurück gibt.

Die Reihenfolge hab ich aus einem Buch. Wenn ich es nicht Zerstöre bekomm ich doch nen Speicher-Leak?

Aso ich arbeite nur mit MFC, von der API im inneren des Codes hab ich noch nicht sooo viel Ahnung, nur etwas angeschaut.

Code:
CMenu *pMenu = CMenu::FromHandle(leeresHandle);
			
		m_MyNewMenu.LoadMenu(IDR_MENU2);
		
		if (pMenu->GetMenu() != m_MyNewMenu )
		{
			SetMenu(NULL);
										
			if(pMenu) 
				pMenu->DestroyMenu();

			SetMenu(&m_MyNewMenu);
			leeresHandle = m_MyNewMenu.m_hMenu;
		}

Das geht leider auch nicht weil er pMenu->GetMenu() nicht mag... :(

Ich hab das jetzt mal wie folgt geändert.

Code:
m_MyNewMenu.LoadMenu(IDR_MENU2);
		
		if (IDR_MENU1 != m_MyNewMenu.GetMenuItemID(0) )
		{
			SetMenu(NULL);
			CMenu *pMenu = CMenu::FromHandle(leeresHandle);						
			if(pMenu) 
				pMenu->DestroyMenu();

			SetMenu(&m_MyNewMenu);
			leeresHandle = m_MyNewMenu.m_hMenu;
		}


Also die If-Abfrage scheint zu gehen, denn wenn ich "==" statt "!=" verwende, dann macht er nix.

Das Problem liegt aber noch in dieser Zeile:
m_MyNewMenu.LoadMenu(IDR_MENU2);

Wenn ich den Button nochmal klicke, dann wirft er mir immer einen Fehler. Ich kann das also nicht zweimal machen. Ich muss also abfrogen ob des schon gemacht wurde, wie stell ich das an?

In der .h Datei hab ich noch folgendes Deklariert
Code:
CMenu m_MyNewMenu;
HMENU leeresHandle;

Hallo nochmal,

also meine Lösung ist jetzt folgende:


Code:
if(!m_MyNewMenu){
		 m_MyNewMenu.LoadMenu(IDR_MENU2);
			
			SetMenu(NULL);
			CMenu *pMenu = CMenu::FromHandle(leeresHandle);						
			if(pMenu) 
				pMenu->DestroyMenu();

			SetMenu(&m_MyNewMenu);
			leeresHandle = m_MyNewMenu.m_hMenu;
		}
	else
	{
		if(!m_Menu1){
			m_Menu1.LoadMenu(IDR_MENU1);

			SetMenu(NULL);
			
			CMenu *pMenu = CMenu::FromHandle(leeresHandle);						
			if(pMenu) 
				pMenu->DestroyMenu();

			SetMenu(&m_Menu1);
			leeresHandle = m_Menu1.m_hMenu;
		
		}
	
	}

Ist wahrscheinlich nicht schön, aber die Funktioniert. Verbesserungen wären schön :)
 
Sieht aber doch ganz vernünftig aus.

Du kannst zum Zerstören auch direkt

:: DestroyMenu( leeresHandle )

aufrufen (mit den beiden Doppelpunkten davor, ohne Leerzeichen!), dadurch kannst du die Zeilen

CMenu *pMenu = CMenu::FromHandle(leeresHandle);
if(pMenu)
pMenu->DestroyMenu();

weglassen.
 

Neue Beiträge

Zurück