Question

I'm trying to add a menu item such that it acts like a check mark where the user can check/uncheck, and the other classes can see that menu item's check mark status. I received a suggestion of creating a class for the menu option (with a popup option), however, I can't create a class for the menu option when I'm in the resource layout editor in Visual Studio 2005. It would be great to hear suggestions on the easiest way to create menu items that can do what I have described.

Was it helpful?

Solution 3

I ended up retrieving the menu from the mainframe using GetMenu() method, and then used that menu object and ID numbers to call CheckMenuItem() with the right flags, as well as GetMenuState() function.

OTHER TIPS

You should use the CCmdUI::SetCheck function to add a checkbox to a menu item, via an ON_UPDATE_COMMAND_UI handler function, and the ON_COMMAND handler to change the state of the checkbox. This method works for both for your application's main menu and for any popup menus you might create.

Assuming you have an MDI or SDI MFC application, you should first decide where you want to add the handler functions, for example in the application, main frame, document, or view class. This depends on what the flag will be used for: if it controls application-wide behaviour, put it in the application class; if it controls view-specific behaviour, put it in your view class, etc.

(Also, I'd recommend leaving the menu item's Checked property in the resource editor set to False.)

Here's an example using a view class to control the checkbox state of the ID_MY_COMMAND menu item:

// 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);
}

You should ensure the m_Flag member variable is initialised, for example, in the CMyView constructor or OnInitialUpdate function.

I hope this helps!

@ChrisN's approach doesn't quite work for MFC Dialog applications (the pCmdUI->SetCheck(m_Flag); has no effect). Here is a solution for Dialog apps:

// 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);
    }
}

References:

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top