Kontext-Menü Problem
-
Hi
ich habe folgenden Code, um mein Popup-Menü aufzurufen:
void CIRCDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here CMenu *pMenu; pMenu = GetMenu(); pMenu = pMenu->GetSubMenu(0); pMenu->TrackPopupMenu(TPM_RIGHTALIGN | TPM_RIGHTBUTTON, point.x,point.y, pWnd, NULL); }Beim Versuch, das Menü aufzurufen, erhalte ich folgende Fehlermeldung:
Unhandled exception at 0x7c258817 (mfc70d.dll) in IRC.exe: 0xC0000005: Access violation reading location 0x00000004.
Im Menü hab ich Popup TRUE eingestellt.
Wo liegt der Fehler?Danke
Bernd
-
Nur ein kleines Bsp. von mir:
void C_Menueleisten_1_Dlg::OnContextMenu(CWnd* pWnd, CPoint point) { CMenu menuContext; CMenu *menu; menuContext.LoadMenu(IDR_MENUE_TEST); menu = menuContext.GetSubMenu(0); menu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this); }So funktionierts bei mir.
Ich brauch niergend´s was einstellen. Hab nur mit dem Ressourcen-Editor ein Menü gezeichnet.Bye, Sigi
-
GetMenu()->GetSubMenu(0)->TrackPopupMenu(/*...*/);
-
Geht auch so:
void C_TestDlg::OnContextMenu(CWnd* pWnd, CPoint point) { CMenu *menuContext; menuContext = GetMenu(); menuContext = menuContext->GetSubMenu(0); menuContext->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this); }
-
Danke, BigSigi, deine erste Ausführung funktioniert.
Die letzte leider nicht. Dort tritt der selbe Fehler wie bei mir auf.
Shlo: Dein Code läuft leider auch nicht
Vielen Dank
Bernd
-
Noch ne Frage zum Kontext-Menü:
Wie kann ich ermitteln, auf welchem Steuerelement das Popup aufgerufen wird, das ein angepasstes Menü aufrufen kann.
Vielen Dank
Bernd
-
void C_TestDlg::OnContextMenu(CWnd* pWnd, CPoint point)
pWnd Zeigt auf das Element auf das geklickt wurde.
if(pWnd == GetDlgItem(IDC_BUTTON1)->GetWindow(GW_HWNDFIRST)) menuContext.LoadMenu(IDR_MENU_LEISTE); else menuContext.LoadMenu(IDR_MENU1);
-
Läuft leider nicht.
Mir ist alles vom Code verständlich, bis auf diesen Teil
->GetWindow(GW_HWNDFIRST)Was genau hat es damit auf sich? Hab in der MSDN nachgeschaut und die anderen Flags ausprobiert, bin aber nie zu einem richtigen Ergebnis gekommen.
Wenn ich den Bereich weglasse, klappts nur bedingt.
Mein Code sieht nun so aus:
void CIRCDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here CMenu menuContext; CMenu *menu; //-----Feststellen, auf welchem element das Menü aufgerufen wird-------- if(pWnd == GetDlgItem(IDC_TAB1)->GetWindow(GW_HWNDFIRST)) menuContext.LoadMenu(IDR_POPUP1); else menuContext.LoadMenu(IDR_POPUPSTD); //---------------- menu = menuContext.GetSubMenu(0); menu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this); }Es wird immer der Else-Teil aufgerufen, auch wenn ich auf das Tab-Control klicke.
mfg
Bernd