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


Anmelden zum Antworten