opto
opto

Reputation: 57

In SDI: where to disable menu, code ok in MDI

I am trying to disable main menu items. in MDI application, this works:

CWnd *pW=AfxGetMainWnd();
CMenu * pMenu=pW->GetMenu();
pMenu->EnableMenuItem(5, MF_BYPOSITION | MF_GRAYED | MF_DISABLED);  

Not in SDI. Most likely, I am putting it into the wrong place. CMainframe? The view? Which speific subroutine? I tried the constructors, but no change in UI.

Any help is appreciated, I am banging my head and searched numerous web places (and here) but didn't find the right direction.

many thanks

Upvotes: 2

Views: 319

Answers (2)

Raindrop7
Raindrop7

Reputation: 3911

you can do that by using class wizard to add function that handles Enabling/disabling menu items via UPDATE_COMMAND_UI:

void CMyAdoMfcView::OnUpdateAddnew(CCmdUI* pCmdUI) 
{
    // TODO: Add your command update UI handler code here
    pCmdUI->Enable(true);
}

in my code I enabled the menu item AddNew.

Upvotes: 0

Jerry Coffin
Jerry Coffin

Reputation: 490468

You don't want to directly enable/disable menu items under MFC, whether it's SDI or MDI.

Instead, when you add the item to the menu, you add two event handlers for it. One will be for "COMMAND", the other for "UPDATE_COMMAND_UI".

enter image description here

the COMMAND handler actually carries out the command for that menu entry.

The UPDATE_COMMAND_UI handler (indirectly) enables/disables the menu entry by returning true/false to indicate whether it should be enabled.

As to why this is preferable: first and foremost, because you can have (for example) both a menu entry and a toolbar that invoke the same action. This automatically enables/disables both as appropriate.

Upvotes: 1

Related Questions