Поведение флажка элемента меню MFC
-
06-07-2019 - |
Вопрос
Я пытаюсь добавить элемент меню так, чтобы он действовал как галочка, где пользователь может устанавливать/снимать флажок, а другие классы могут видеть состояние галочки этого пункта меню.Мне предложили создать класс для параметра меню (с возможностью всплывающего окна), однако я не могу создать класс для параметра меню, когда нахожусь в редакторе макета ресурсов в 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);
}
}
Использованная литература: