Pregunta

Estoy tratando de agregar un elemento de menú de modo que actúe como una marca de verificación donde el usuario puede marcar / desmarcar, y las otras clases pueden ver el estado de la marca de verificación de ese elemento del menú. Recibí una sugerencia de crear una clase para la opción de menú (con una opción emergente), sin embargo, no puedo crear una clase para la opción de menú cuando estoy en el editor de diseño de recursos en Visual Studio 2005. Sería genial para escuchar sugerencias sobre la forma más fácil de crear elementos de menú que puedan hacer lo que he descrito.

¿Fue útil?

Solución 3

Terminé recuperando el menú del mainframe usando el método GetMenu (), y luego usé ese objeto de menú y números de identificación para llamar a CheckMenuItem () con los indicadores correctos, así como la función GetMenuState ().

Otros consejos

Debe usar el CCmdUI :: SetCheck para agregar una casilla de verificación a un elemento del menú, a través de una ON_UPDATE_COMMAND_UI función de controlador, y ON_COMMAND para cambiar el estado de la casilla de verificación. Este método funciona tanto para el menú principal de su aplicación como para cualquier menú emergente que pueda crear.

Suponiendo que tiene una aplicación MFC MDI o SDI, primero debe decidir dónde desea agregar las funciones del controlador, por ejemplo, en la aplicación, marco principal, documento o clase de vista. Esto depende de para qué se utilizará el indicador: si controla el comportamiento de toda la aplicación, colóquelo en la clase de aplicación; si controla el comportamiento específico de la vista, colóquelo en su clase de vista, etc.

(Además, recomendaría dejar la propiedad Comprobada del elemento de menú en el editor de recursos configurado en False .)

Aquí hay un ejemplo usando una clase de vista para controlar el estado de la casilla de verificación del elemento de menú 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);
}

Debe asegurarse de que la variable de miembro m_Flag se inicialice, por ejemplo, en el constructor CMyView o la función OnInitialUpdate .

¡Espero que esto ayude!

El enfoque de

@ ChrisN no funciona para aplicaciones de diálogo MFC (el pCmdUI- > SetCheck (m_Flag); no tiene ningún efecto). Aquí hay una solución para las aplicaciones de diálogo:

// 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);
    }
}

Referencias:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top