Domanda

Sto provando ad aggiungere una voce di menu in modo che si comporti come un segno di spunta in cui l'utente può selezionare / deselezionare e le altre classi possono vedere lo stato del segno di spunta di quella voce di menu. Ho ricevuto un suggerimento di creare una classe per l'opzione di menu (con un'opzione popup), tuttavia non riesco a creare una classe per l'opzione di menu quando sono nell'editor del layout delle risorse in Visual Studio 2005. Sarebbe fantastico per ascoltare suggerimenti sul modo più semplice per creare voci di menu che possono fare ciò che ho descritto.

È stato utile?

Soluzione 3

Ho finito per recuperare il menu dal mainframe usando il metodo GetMenu (), quindi ho usato l'oggetto menu e i numeri ID per chiamare CheckMenuItem () con i flag giusti, così come la funzione GetMenuState ().

Altri suggerimenti

È necessario utilizzare CCmdUI :: SetCheck per aggiungere una casella di controllo a una voce di menu, tramite una ON_UPDATE_COMMAND_UI funzione gestore e ON_COMMAND gestore per modificare lo stato della casella di controllo. Questo metodo funziona sia per il menu principale dell'applicazione che per tutti i menu popup che è possibile creare.

Supponendo che tu abbia un'applicazione MDI o SDI MFC, dovresti prima decidere dove vuoi aggiungere le funzioni del gestore, ad esempio nell'applicazione, nel frame principale, nel documento o nella classe vista. Questo dipende dal motivo per cui verrà utilizzato il flag: se controlla il comportamento a livello di applicazione, inserirlo nella classe dell'applicazione; se controlla il comportamento specifico della vista, inseriscilo nella tua classe di visualizzazione, ecc.

(Inoltre, consiglierei di lasciare la proprietà Controllato della voce di menu nell'editor delle risorse impostato su Falso .)

Ecco un esempio che utilizza una classe di visualizzazione per controllare lo stato della casella di controllo della voce di menu ID_MY_COMMAND :

// MyView.h

class CMyView : public CView
{
private:
    BOOL m_Flag;

    afx_msg void OnMyCommand();
    afx_msg void OnUpdateMyCommand(CCmdUI* pCmdUI);
    DECLARE_MESSAGE_MAP()
};

// MyView.cpp

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_MY_COMMAND, OnMyCommand)
    ON_UPDATE_COMMAND_UI(ID_MY_COMMAND, OnUpdateMyCommand)
END_MESSAGE_MAP()

void CMyView::OnMyCommand()
{
    m_Flag = !m_Flag; // Toggle the flag
    // Use the new flag value.
}

void CMyView::OnUpdateMyCommand(CCmdUI* pCmdUI)
{
    pCmdUI->SetCheck(m_Flag);
}

È necessario assicurarsi che la variabile membro m_Flag sia inizializzata, ad esempio nella funzione di costruzione CMyView o OnInitialUpdate .

Spero che questo aiuti!

L'approccio di @ ChrisN non funziona del tutto per applicazioni della finestra di dialogo MFC (il pCmdUI- > SetCheck (m_Flag); non ha alcun effetto). Ecco una soluzione per le app Dialog:

// MyView.h

class CMyView : public CView
{
private:
    BOOL m_Flag;
    CMenu * m_menu;

    virtual BOOL OnInitDialog();
    afx_msg void OnMyCommand();
    DECLARE_MESSAGE_MAP()
};

// MyView.cpp

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_MY_COMMAND, OnMyCommand)
END_MESSAGE_MAP()

BOOL CMyView::OnInitDialog()
{
    m_menu = GetMenu();
}

void CMyView::OnMyCommand()
{
    m_Flag = !m_Flag; // Toggle the flag

    if (m_flag) {
        m_menu->CheckMenuItem(ID_MENUITEM, MF_CHECKED | MF_BYCOMMAND);
    } else {
        m_menu->CheckMenuItem(ID_MENUITEM, MF_UNCHECKED | MF_BYCOMMAND);
    }
}

References:

http://www.codeguru.com/forum/showthread.php? t = 322261

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top