Menü-Wechseln



  • Moin @ all,

    Wie kann man es einrichten das das Menü zur Laufzeit gewechselt wird?

    Brauche ich dafr eine Instanz der Klasse CMenu?

    Ich möchte es so einrichten das beim Klick auf einen Menübefehl in der Behandlungsmethode zur WM-Command Nachricht das Menü gewechselt wird,..

    Vielen Dank schon mal,..

    MfG Granny


  • Administrator

    Einem CWnd (oder eine davon abgeleiteten Klasse), kannst du mit SetMenu ein neues Menu zuweisen. Dafür brauchst du ein CMenu Objekt, weil du den Zeiger zu diesem Objekt übergeben musst. Am besten erstellst du dir eine CMenu Membervariable. Wenn es dann soweit ist, kannst du mit der Methode CMenu::LoadMenu das Menu aus den Resourcen laden. Das aktuelle Menu kannst du mit GetMenu holen. Diesen Zeiger speicherst du dir entweder auch in eine Membervariable für späteren erneuten gebrauch, oder du rufst DestroyMenu auf um das Menu zu löschen. Also so als Beispiel jetzt:

    void CMainFrame::ReplaceMenu()
    {
        // m_NewMenu ist ein Objekt vom Typ CMenu in der Klasse CMainFrame.
        // Wir holen uns nun den alten Zeiger.
        CMenu* pOldMenu = GetMenu();
    
        // Wir laden aus den Resourcen das Menu in unser Objekt.
        m_NewMenu.LoadMenu(IDR_MENURESOURCEID);
    
        // Wir setzen das neue Menu ein und ersetzen somit das alte.
        // Mit SetMenu(NULL), kann man das Menu auch einfach nur entfernen.
        SetMenu(&m_NewMenu);
    
        // Wir zerstören das alte Menu.
        pOldMenu->DestroyMenu();
    }
    

    Das sollte eigentlich gehen. Allerdings ist es nicht getestet.

    Grüssli



  • da gibt es mehrere möglichkeiten die einfachste ist es dir mehrere menus in der resourcenklasse zu erstellen.

    erstell dir dann ein

    static UINT Menu[3]={IDR_MENU1,IDR_MENU2};// in cpp
    UINT m_uMenu; //in h
    

    erstell dir ON_COMMAND functionen für die Menupunkte die du zum wechseln verwenden willst.

    in die jeweiligen funktionen der Menupunkte schreibst du

    void ...Menu1()
    {
    m_uMenu = Menu[1]
    }

    void ...Menu2()
    {
    m_uMenu = Menu[2]
    }

    in den context der rechten maustaste schreibst du dann wie folgt

    void ...::OnContextMenu(CWnd* pWnd, CPoint point) 
    {	
    	CMenu menu;
    
    	menu.LoadMenu(m_Menu);
    
    	CMenu *pContextMenu = menu.GetSubMenu(0);
    
    	pContextMenu->TrackPopupMenu(TPM_LEFTALIGN |
    	TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
    	point.x, point.y, this,0);
    
    }
    

    es geht noch dynammischer aber das würde den ramen sprengen wenns dich interesiert mach ich dir dazu mal ne beispielanwendung aber nicht gleich jetzt sofort hab nämlich auch noch was zu tun.

    mfg
    LowFly



  • Vielen Dank - die Tricks funktionieren - danke auch für´s Angebot ein Code-Beispiel zu machen - ist erstmal nicht nötig , - aber wenn ich Probleme hab frag ich ok?

    MfG Granny


Log in to reply