Question

J'essaie d'ajouter un élément de menu de sorte qu'il constitue une coche, où l'utilisateur peut cocher / décocher, et les autres classes peuvent voir l'état de la coche de cet élément de menu. On m'a suggéré de créer une classe pour l'option de menu (avec une option contextuelle). Cependant, je ne peux pas créer de classe pour l'option de menu lorsque je suis dans l'éditeur de présentation de ressources dans Visual Studio 2005. Ce serait formidable. entendre des suggestions sur la manière la plus simple de créer des éléments de menu pouvant faire ce que j'ai décrit.

Était-ce utile?

La solution 3

J'ai finalement récupéré le menu de l'ordinateur central à l'aide de la méthode GetMenu (), puis utilisé cet objet de menu et ces numéros d'identification pour appeler CheckMenuItem () avec les indicateurs corrects, ainsi que la fonction GetMenuState ().

Autres conseils

Vous devez utiliser le CCmdUI :: SetCheck fonction pour ajouter une case à cocher à un élément de menu, via un ON_UPDATE_COMMAND_UI fonction de gestionnaire et ON_COMMAND pour changer l’état de la case à cocher. Cette méthode fonctionne aussi bien pour le menu principal de votre application que pour les menus contextuels que vous pourriez créer.

En supposant que vous ayez une application MDI MDI ou SDI, vous devez d’abord décider où vous souhaitez ajouter les fonctions de gestionnaire, par exemple dans l’application, le cadre principal, le document ou la classe de vue. Cela dépend de la raison pour laquelle l'indicateur sera utilisé: s'il contrôle le comportement à l'échelle de l'application, mettez-le dans la classe d'application; s'il contrôle le comportement spécifique à la vue, mettez-le dans votre classe de vue, etc.

(Nous vous recommandons également de laisser la propriété Cochée de l'élément de menu définie sur False .)

.

Voici un exemple d'utilisation d'une classe de vue pour contrôler l'état des cases à cocher de l'élément de 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);
}

Vous devez vous assurer que la variable membre m_Flag est initialisée, par exemple dans le constructeur CMyView ou la fonction OnInitialUpdate .

J'espère que cela aide!

L'approche de

@ ChrisN ne fonctionne pas tout à fait pour les applications MFC Dialog ( pCmdUI- > SetCheck (m_Flag); n'a aucun effet). Voici une solution pour les applications 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);
    }
}

Références:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top