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.

War es hilfreich?

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:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top