MFC Menüpunkt Checkbox Verhalten
-
06-07-2019 - |
Frage
Ich versuche, einen Menüpunkt so hinzuzufügen, dass es wie ein Häkchen wirkt in dem der Benutzer / uncheck überprüfen und die anderen Klassen können der Menüpunktes des Häkchen Status. Ich erhielt einen Vorschlag, eine Klasse für die Menüoption zu schaffen (mit einer Popup-Option), aber ich kann eine Klasse für die Menüoption nicht erstellen, wenn ich in dem Ressource-Layout-Editor in Visual Studio bin 2005. Es wäre toll, Vorschläge für die einfachste Art und Weise zu hören Menüpunkte zu schaffen, das tun kann, was ich beschrieben habe.
Lösung 3
I beenden das Menü aus dem Mainframe mit GetMenu () -Methode dem Abrufen auf und verwenden dann das Menü Objekt und ID-Nummern CheckMenuItem () mit den richtigen Fahnen zu nennen, sowie GetMenuState () Funktion.
Andere Tipps
sollten Sie verwenden die CCmdUI::SetCheck
Funktion eine Checkbox, um eine hinzuzufügen Menüpunkt, über eine ON_UPDATE_COMMAND_UI
Handler-Funktion, und die ON_COMMAND
Handler den Zustand der Kontrollkästchen zu ändern. Diese Methode funktioniert sowohl für die Anwendung im Hauptmenü und für alle Popup-Menüs Sie erstellen können.
Angenommen, Sie eine MDI oder SDI-MFC-Anwendung haben, sollten Sie zunächst entscheiden, wo Sie die Handler-Funktionen, zum Beispiel in der Anwendung, Hauptrahmen, ein Dokument oder Ansichtsklasse hinzufügen mögen. Dies hängt davon ab, was die Flagge für verwendet werden: wenn es anwendungsweite Verhalten steuert, ist es in der Anwendungsklasse setzen; wenn es ansichtsspezifische Verhalten steuert, setzen Sie es in Ihrer Ansichtsklasse, etc.
(Auch ich würde empfehlen, verlassen die den Menüpunkt Auf Eigenschaft im Editor Ressource auf false .)
Hier ist ein Beispiel einer Ansichtsklasse mit dem Checkbox Zustand des ID_MY_COMMAND
Menüpunktes zu steuern:
// 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);
}
Sie sollten der m_Flag
Membervariable initialisiert, beispielsweise in der CMyView
Konstruktor oder OnInitialUpdate
Funktion gewährleisten.
Ich hoffe, das hilft!
@ ChrisN Ansatz funktioniert nicht ganz für MFC Dialog-Anwendungen (die pCmdUI->SetCheck(m_Flag);
hat keine Wirkung). Hier ist eine Lösung für Dialog-Anwendungen:
// 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);
}
}
Referenzen: