• Advertisement
Sign in to follow this  

disableing menu items - mfc

This topic is 4788 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have an MFC program with: CMenu menu1; menu1.LoadMenu(IDR_MENU1); SetMenu(&menu1); now this loads a menu perfectly fine. When I cleck file new (ID_FILE_NEW) I want to disable it, so it cant be pressed again. Im trying: menu1.EnableMenuItem(ID_FILE_NEW,MF_BYCOMAND|MF_GRAYED); now this returns -1 suggesting the menu item doesn't exist, but when I click on the new button in the resource editor, it says ID ID_FILE_NEW so what am I doing wrong? I have been googleing for ages but no success

Share this post


Link to post
Share on other sites
Advertisement
Try this:

CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(0);
submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

Share this post


Link to post
Share on other sites
nope, it just displayed the menu as normal.

here is my code:


class MFC_Tutorial_Window :public CFrameWnd
{
CMenu menu1; // dedines my menu
public:
HANDLE tThread;
MFC_Tutorial_Window()
{
Create(NULL,"Countdown - ALPHA V 0.2"); // creates window

menu1.LoadMenu(IDR_MENU1); // sets up menu
SetMenu(&menu1);
// UINT t = menu1.EnableMenuItem // here I want to grey out the new button.(ID_FILE_NEW,MF_BYCOMMAND|MF_GRAYED);
}


void OnClickNew(); // defines function for when the new button is clicked
void OnClickStatusT1();
void OnClickExitApp();
void OnClickAbout();
int OnCreate(LPCREATESTRUCT lpCreateStruct);
void OnClose();
DECLARE_MESSAGE_MAP() // sets up a message map, for message handling
};

Share this post


Link to post
Share on other sites
I haven't touched MFC in ages, but I think this is the cause. Before displaying a menu MFC updates each menu item automatically. If it's missing an ON_COMMAND entry in a message map somewhere the menu item is automatically disabled, otherwise it's automatically enabled. CWinApp might have an update handler for ID_FILE_NEW by default, which is what is enabling the menu again.

This page describes a way to disable this. In your constructor for MFC_Tutorial_Window try adding this:

MFC_Tutorial_Window()
{
m_bAutoMenuEnable = false;
}
Ideally you'd have a message map entry to handle ID_FILE_NEW, and then you could simply add ON_UPDATE_COMMAND_UI(ID_FILE_NEW, OnUpdateFileNew) and call pCmdUI->Enable(false) from OnUpdateFileNew(CCmdUI* pCmdUI). How does your message map look like?

Update: Fixed incorrect information.

Share this post


Link to post
Share on other sites
ok, I tried that but I'm getting an unresolved external. heres my message map


class MFC_Tutorial_Window :public CFrameWnd
{
CMenu menu1; // dedines my menu
public:
HANDLE tThread;
MFC_Tutorial_Window()
{
m_bAutoMenuEnable = false;
Create(NULL,"Countdown - ALPHA V 0.2"); // creates window

menu1.LoadMenu(IDR_MENU1); // sets up menu
SetMenu(&menu1);
// UINT t = menu1.EnableMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_GRAYED);
}


void OnClickNew(); // defines function for when the new button is clicked
void OnClickStatusT1();
void OnClickExitApp();
void OnClickAbout();
int OnCreate(LPCREATESTRUCT lpCreateStruct);
void OnClose();
void OnUpdateFileNew(CCmdUI* pCmdUI);
DECLARE_MESSAGE_MAP() // sets up a message map, for message handling
};

BEGIN_MESSAGE_MAP( MFC_Tutorial_Window, CFrameWnd) // begining of message map
ON_WM_CREATE()
ON_WM_CLOSE()
ON_COMMAND(ID_FILE_NEW,OnClickNew) // when new is clicked do function OnClickNew()
ON_COMMAND(ID_HELP_ABOUT,OnClickAbout)
ON_COMMAND(ID_STATUS_TIMER1,OnClickStatusT1)
ON_COMMAND(IDEXIT,OnClickExitApp)
ON_UPDATE_COMMAND_UI(ID_FILE_NEW,OnUpdateFileNew) // unresolved external here
END_MESSAGE_MAP() // end of message map

void OnUpdateFileNew(CCmdUI* pCmdUI)
{
pCmdUI->Enable(false);
}

void MFC_Tutorial_Window::OnClickNew() // what to do when new is clicked
{
newDialog dlg; //defines dialog box
dlg.DoModal();
}
...

Share this post


Link to post
Share on other sites
Oh, I probably should've worded things clearer.

Solution 1: Add the m_bAutoMenuEnable line. I don't know if this works.

Solution 2: Add ON_UPDATE_COMMAND_UI, this is probably the preferred solution since it integrates into MFC's message map, command updating framework. Ahh I wrote out a bunch of stuff describing how to implement it. Turns out you're just missing one thing.


void OnUpdateFileNew(CCmdUI* pCmdUI)

// should be

void MFC_Tutorial_Window::OnUpdateFileNew(CCmdUI* pCmdUI)




Of course now you won't be able to click the ID_FILE_NEW menuitem since it'll always be disabled. If you want to disable it after one click, try this:


class MFC_Tutorial_Window : public CFrameWnd
{
bool m_bEnableFileNew;

MFC_Tutorial_Window()
{
m_bEnableFileNew = true;

// ...
}

// ...
}

void OnUpdateFileNew(CCmdUI* pCmdUI)
{
// the nice thing about this is that it'll also disable toolbar buttons that
// have an ID of ID_FILE_NEW
pCmdUI->Enable(m_bEnableFileNew);
}

void MFC_Tutorial_Window::OnClickNew()
{
// disable file new. next time the menu displays MFC will call OnUpdateFileNew,
// which will disable the menu item.
m_bEnableFileNew = false;

newDialog dlg;
dlg.DoModal();
}

// ...



Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement