Hauptmenu manipulieren



  • Hallo,

    ich bin Gelegenheitsprogrammierer und dreh mich hier im Kreis. Irgendwie komme ich nicht weiter.

    Ich habe eine Anwendung, die in (vorerst) zwei verschiedenen Modi laufen soll. Diese Modi sollen vom Benutzer umschaltbar sein. Also, in das Menu einen Punkt "Modus" eingefügt, mit aktuell zwei Unterpunkten. Ein Modus ist Default. Dessen Menueintrag habe ich im Resourcenmanager (VS8) mit einem Häkchen versehen.

    Wenn der Nutzer nun einen anderen Modus auswählt, soll natürlich der eine Haken weg und an die Auswahl der Haken dran. Klingt nach RadioButton.

    Mit CMenu::CheckMenuItem komme ich nicht weiter, weil laut Manual MF_CHECKED und MF_UNCHECKED setzen nur bei Pop-Up-Menues funktioniert. Ich habs trotzdem ausprobiert, ohne Erfolg, der Haken bleibt immer da wo er von Anfang an ist.

    void CMainFrame::OnModus2dabmusterung()
    {
        // TODO: Add your command handler code here
    
        CMenu *menue = this->GetSystemMenu( FALSE);
        menue->CheckMenuItem( ID_MODUS_TGANG, MF_BYCOMMAND | MF_UNCHECKED);
        menue->CheckMenuItem( ID_MODUS_2DABMUSTERUNG, MF_BYCOMMAND | MF_CHECKED);
    
    }
    

    Hier mal der Code, wie ich ihn als letztes ausprobiert habe.

    Ich mache hier wohl prinzipiell irgendwas falsch. Die Manuals bringen mich nicht weiter.

    Schieb' mich mal bitte jemand zur Seite, damit ich vom Schlauch rutsche!

    Gruß

    MQ



  • Vermutlich so etwas wie:

    BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
    {
       if ( LOWORD(wparam) == myMenuItem )
       {
           if ( HIWORD(wParam) == BN_CLICKED )
           {
              // mach was
           }
       }
    
       return CMDIFrameWnd::OnCommand(wParam, lParam); // ggfs. andere Basisklasse!!!
    }
    

    Aber das ist jetzt so aus dem Kopf, nich haun wenns nich stimmt 😉



  • jencas schrieb:

    Vermutlich so etwas wie:

    BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
    {
       if ( LOWORD(wparam) == myMenuItem )
       {
           if ( HIWORD(wParam) == BN_CLICKED )
           {
              // mach was
           }
       }
    
       return CMDIFrameWnd::OnCommand(wParam, lParam); // ggfs. andere Basisklasse!!!
    }
    

    Das Aufrufen der Funktion klappt ja, das ist nicht das Problem. Mir gelingt es nicht, die Häkchen zu setzen bzw. zu löschen.

    Mich interessiert daher eher das was du nennst

    // mach was
    

    Wie hat das konkret auszusehen? Mit welcher Funktion kann ich den Status "Checked" eines Menueintrages setzen bzw. löschen?

    Mit CheckMenuItem geht es nicht, das geht so nur bei Pop-Ups und nicht bei den Fenstermenues, so äußert sich zumindest das Manual.

    MQ



  • Direkten Zugriff kenn ich jetzt auch nicht, aber eine pragmatische Lösung wäre, Du machst Dir eine Membervariable

    bool m_checked;
    

    die den Initialzustand wie Dein Häkchen hat

    m_checked = false; // Häkchen ist am Anfang aus
    

    und bei "// mach was" einfach

    m_checked = !m_checked;
    

    dann spiegelt m_checked den Zustand des Häkchens wieder.

    Seh grad: Alles Quatsch, Du willst ja setzen bzw. löschen.....



  • n'abend,

    tja, wie war das mit dem Schlauch??!!

    Ich muss mir ja erst das Untermenu besorgen und das ist ein Pull-Down und da funzt CheckMenuItem.

    also

    void CMainFrame::OnModus2dabmusterung()
    {
        // TODO: Add your command handler code here
    
        // tutet nicht!
        //CMenu *menue = this->GetSystemMenu( FALSE);
    
        // So tutet's
        CMenu *menue = this->GetMenu()->GetSubMenu( 3);
        menue->CheckMenuItem( ID_MODUS_TGANG, MF_BYCOMMAND | MF_UNCHECKED);
        menue->CheckMenuItem( ID_MODUS_2DABMUSTERUNG, MF_BYCOMMAND | MF_CHECKED);
    
    }
    

    Position 3 in meinem Hauptmenu des Frames ist "Modus" und nun kann ich über den Pointer menue alles das tun, was ich will und es funktioniert.

    MQ


Log in to reply