Вопрос

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

Это было полезно?

Решение 3

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

Другие советы

Вы должны использовать 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 .

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

Подход @ChrisN не совсем работает для Диалоговые приложения MFC ( 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top