Menüs
-
Hallo,
ich habe zwei Menüs (IDR_MENU, IDR_MENU2). Das erste Menü ist das Hauptmenü und wird links oben angezeigt. Das zweite soll also Contextmenü angezeigt werden.
Wenn ich das zweite Menü mal ans Hauptformular binde, wird es auch oben links in der ecke angezeigt. Also kann man es laden.
Wenn ich aber jetzt einer der beiden Formulare also Contextmenu laden möchte, erscheint immer eine Fehlermeldung. Weiß einer warum?CMenu *menu; POINT pt; GetCursorPos(&pt); menu->LoadMenu(IDR_MENU2); menu = GetMenu(); menu = menu->GetSubMenu(0); menu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x, pt.y, this, NULL);
-
und die große frage ist: "wie lautet die fehlermeldung?"
-
Die Anweisung in "0x5f435ee9" verweist auf Speicher "0xccccccdO". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden. Klicken Sie auf "OK", um das Programm zu beenden. Klicken Sie auf "Abbrechen", um das Programm zu debuggen.das ist die Meldung die erscheint
-
Schonmal
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
versucht?
-
Du rufst ja auch die Methode LoadMenu() auf einen nicht-initialisierten Zeiger auf - das geht garantiert in die Hose.
-
Wie meinst du das mit dem Initialisieren?
ALso wenn ich das schreibe, dann funktioniert das mit dem Unterformular. Dafür muss aber im Hauptfenster im Eigenschaftsbereich das Menu IDR_MENU eingetragen sein. Ansonsten macht der auch den Fehler.
CMenu *m_Menu; POINT pt; GetCursorPos(&pt); m_Menu = GetMenu(); m_Menu = m_Menu->GetSubMenu(0); m_Menu->TrackPopupMenu(TPM_LEFTALIGN + TPM_RIGHTBUTTON,pt.x, pt.y, this, NULL);Ich habe keine Ahnung woran das liegt.
-
Manchmal hilft es auch, mit dem Debugger die einzelnen Zeilen zu durchlaufen und zu schauen, ob die Werte richtig initialisiert werden.

-
sri schrieb:
Manchmal hilft es auch, mit dem Debugger die einzelnen Zeilen zu durchlaufen und zu schauen, ob die Werte richtig initialisiert werden.

Was ich damit schon sagen wollte:
Schonmal Zitat:
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.versucht?
-
Also wenn ich den Debugger starte, dann macht er den Fehler zwischen den beiden Funktionen.
BOOL CMenu::Attach(HMENU hMenu) { ASSERT(m_hMenu == NULL); // only attach once, detach on destroy if (hMenu == NULL) { return FALSE; } // Capture menu in object first to ensure it does not leak if the map cannot be allocated/expanded m_hMenu=hMenu; CHandleMap* pMap = afxMapHMENU(TRUE); // create map if not exist ASSERT(pMap != NULL); pMap->SetPermanent(m_hMenu, this); return TRUE; } // Hier wird mein schöner gelber Pfeil angezeigt. // Hier wird auch die Speicherstelle angezeigt wo der fehler ist HMENU CMenu::Detach() { HMENU hMenu; if ((hMenu = m_hMenu) != NULL) { CHandleMap* pMap = afxMapHMENU(); // don't create if not exist if (pMap != NULL) pMap->RemoveHandle(m_hMenu); } m_hMenu = NULL; return hMenu; }ich habe keine ahnung warum er mein Menü nicht laden kann
-
Wenn er genau zwischen den Funktionen stehenbleibt, dann scheinen die MFC-Quelltexte irgendwie nicht ganz zur kompilierten Version zu passen.
-
Wie meinst du das? also an sich ist der Quelltext für die Version etc. und es wird alles unterstützt.
Kann es nicht sein das er einfach nur das Menü nicht finden kann?
-
klick mal auf "projektmappe neu erstellen" und versuchs dann nochmal.. der source scheint nichtmehr zu deiner debug-exe zu passen...
-
nope geht auch nicht.
ich habe außerdem noch die warnungProjektDlg.cpp(678) : warning C4700: Lokale Variable 'menu' wurde ohne Initialisierung verwendet
(die Variable, mit der ich das Menu lade)