Pergunta

Eu estou tentando adicionar um item de menu de tal forma que ele age como uma marca de seleção onde o usuário pode verificar / desmarcar, e as outras classes podem ver o status marca de verificação desse item do menu. I recebeu uma sugestão de criação de uma classe para a opção de menu (com uma opção de pop-up), no entanto, não posso criar uma classe para a opção de menu quando estou no editor de layout de recurso no Visual Studio 2005. Seria ótimo a sugestões ouvir no maneira mais fácil de criar itens de menu que pode fazer o que eu descrevi.

Foi útil?

Solução 3

acabei recuperar o menu a partir do mainframe utilizando o método GetMenu (), e então usado que os números objeto menu e ID para chamar CheckMenuItem () com as bandeiras certas, bem como GetMenuState () função.

Outras dicas

Você deve usar a função CCmdUI::SetCheck para adicionar uma caixa de seleção para um item de menu, através de uma função ON_UPDATE_COMMAND_UI manipulador, e ON_COMMAND manipulador para alterar o estado da caixa de seleção. Este método funciona tanto para o menu principal do seu aplicativo e para qualquer menus pop-up que você pode criar.

Supondo que você tenha uma aplicação MDI ou SDI MFC, você deve primeiro decidir onde pretende adicionar as funções de manipulador, por exemplo na aplicação, a estrutura principal, documento ou vista de classe. Isso depende do que a bandeira será utilizada para: se ele controla o comportamento de toda a aplicação, colocá-lo na classe de aplicativo; se ele controla o comportamento específico-view, colocá-lo em sua classe de vista, etc.

(Além disso, eu recomendo deixar do item de menu verificado propriedade no conjunto de editor de recursos para false .)

Aqui está um exemplo usando uma classe vista a controlar o estado de seleção do item 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);
}

Você deve garantir a variável de membro m_Flag é inicializado, por exemplo, na função de construtor CMyView ou OnInitialUpdate.

Espero que isso ajude!

@ do ChrisN abordagem não funciona muito bem para aplicações MFC diálogo (o pCmdUI->SetCheck(m_Flag); não tem efeito). Aqui está uma solução para aplicativos 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);
    }
}

Referências:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top