Поведение флажка пункта меню MFC - PullRequest
4 голосов
/ 31 июля 2009

Я пытаюсь добавить пункт меню так, чтобы он действовал как галочка, где пользователь может отмечать / снимать галочку, а другие классы могут видеть статус галочки этого пункта меню. Я получил предложение создать класс для опции меню (с опцией всплывающего окна), однако я не могу создать класс для опции меню, когда я в редакторе макета ресурса в Visual Studio 2005. Было бы здорово услышать предложения о самом простом способе создания пунктов меню, которые могут выполнять то, что я описал.

Ответы [ 3 ]

8 голосов
/ 01 августа 2009

Вы должны использовать функцию CCmdUI::SetCheck, чтобы добавить флажок к пункту меню, с помощью функции обработчика ON_UPDATE_COMMAND_UI и ON_COMMAND обработчик для изменения состояния флажка. Этот метод работает как для главного меню вашего приложения, так и для любых всплывающих меню, которые вы можете создать.

Предполагая, что у вас есть приложение MDI или SDI MFC, вы должны сначала решить, куда вы хотите добавить функции обработчика, например, в приложении, основном фрейме, документе или классе представления. Это зависит от того, для чего будет использоваться флаг: если он контролирует поведение приложения, поместите его в класс приложения; если он управляет поведением, зависящим от вида, поместите его в класс представления и т. д.

(Кроме того, я бы рекомендовал оставить свойство отмеченным пункта меню в редакторе ресурсов установленным на False .)

Вот пример использования класса представления для управления состоянием флажка пункта меню 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);
}

Необходимо убедиться, что переменная-член m_Flag инициализирована, например, в конструкторе CMyView или функции OnInitialUpdate.

Надеюсь, это поможет!

3 голосов
/ 22 июля 2011

@ Подход ChrisN не совсем подходит для приложений MFC Dialog (pCmdUI->SetCheck(m_Flag); не действует). Вот решение для приложений 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);
    }
}

Ссылки:

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

1 голос
/ 01 августа 2009

В итоге я получил меню из мэйнфрейма с помощью метода GetMenu (), а затем использовал этот объект меню и идентификационные номера для вызова CheckMenuItem () с правильными флагами, а также функции GetMenuState ().

...