Replaceable Menus
Brian Jones -- BrianJ@apptechsys.com
Tuesday, February 18, 1997
Environment: MSVC 4.2b, NT 4.0
I have a 3 pane splitter application with 3 different views (static). I
would like to be able to provide a different set of menu options for each
view, dynamically replacing each menu in the OnActivateView member.
Currently, I am doing this by obtaining a handle to the frame and calling
MDISetMenu:
pMenu = new CMenu;
pMenu->LoadMenu(IDR_VIEW_MENU);
CMDIFrameWnd* pFrame = (CMDIFrameWnd*)AfxGetMainWnd();
pmenuOld = pFrame->MDISetMenu(pMenu,NULL);
if(pmenuOld)
pmenuOld->DestroyMenu();
pMenu->Detach();
delete pMenu;
pFrame->DrawMenuBar();
I don't believe this is the best way to do this, especially since the
documentation for MDISetMenu says not to use it if the framework handles
menus. The biggest problem I am having is with the DestroyMenu call. If I
don't call it, I eventually use up all of the menu resources for NT and the
app will not change menus. If I do call it, the first time the app tries
it I get an exception directly after making the call (the Assertion varies
depending on what follows the call, so I won't include the error code
here).
Am I going about this thing incorrectly, am I leaving something out, or is
there a "right" way to do this?
Thanks,
Brian
* Brian Jones
* Applied Technical Systems
* Bremerton, WA USA
Jeremiah Talkar -- jtalkar@optika.com
Wednesday, February 19, 1997
[Mini-digest: 2 responses]
Why are you creating a new menu object every single time OnActiveView()
is called? Just create all of them once when your frame window class is
initialized ( OnCreate() ) and destroy them in the destructor. Then all
you have to do is access the respective menu handle and use it in the
call to MDISetMenu().
Jeremiah
-----Original Message-----
From: Brian Jones
Sent: Tuesday, February 18, 1997 5:15 PM
To: 'MFC List'
Subject: Replaceable Menus
Environment: MSVC 4.2b, NT 4.0
I have a 3 pane splitter application with 3 different views (static). I
would like to be able to provide a different set of menu options for each
view, dynamically replacing each menu in the OnActivateView member.
Currently, I am doing this by obtaining a handle to the frame and
calling
MDISetMenu:
pMenu = new CMenu;
pMenu->LoadMenu(IDR_VIEW_MENU);
CMDIFrameWnd* pFrame = (CMDIFrameWnd*)AfxGetMainWnd();
pmenuOld = pFrame->MDISetMenu(pMenu,NULL);
if(pmenuOld)
pmenuOld->DestroyMenu();
pMenu->Detach();
delete pMenu;
pFrame->DrawMenuBar();
I don't believe this is the best way to do this, especially since the
documentation for MDISetMenu says not to use it if the framework handles
menus. The biggest problem I am having is with the DestroyMenu call. If
I
don't call it, I eventually use up all of the menu resources for NT and
the
app will not change menus. If I do call it, the first time the app tries
it I get an exception directly after making the call (the Assertion
varies
depending on what follows the call, so I won't include the error code
here).
Am I going about this thing incorrectly, am I leaving something out, or
is
there a "right" way to do this?
Thanks,
Brian
* Brian Jones
* Applied Technical Systems
* Bremerton, WA USA
-----From: KIbrahim_Ideal@nets.com.jo (Kefah Ibrahim)
Hi,
You can associate your views with there menu resources using
CMultiDocTemplate, and passing the appropriate value for the first parameter,
this parameter specifies the ID of the resources used.
I think the following code may serve your need.
// call these functions from from InitInstance
AddDocTemplate( new CMultiDocTemplate( IDR_MYTYPE1,
RUNTIME_CLASS( CMyDoc ),
RUNTIME_CLASS( CChildFrame ),
RUNTIME_CLASS( CMyView2 ) ) );
AddDocTemplate( new CMultiDocTemplate( IDR_MYTYPE2,
RUNTIME_CLASS( CMyDoc ),
RUNTIME_CLASS( CChildFrame ),
RUNTIME_CLASS( CMyView2 ) ) );
Good luck,
Kefah I.
IdealSoft
E-mail:KIbrahim_ideal@nets.com.jo
mfc-l@netcom.com,Internet writes:
Environment: MSVC 4.2b, NT 4.0
I have a 3 pane splitter application with 3 different views (static). I
would like to be able to provide a different set of menu options for each
view, dynamically replacing each menu in the OnActivateView member.
Currently, I am doing this by obtaining a handle to the frame and calling
MDISetMenu:
pMenu = new CMenu;
pMenu->LoadMenu(IDR_VIEW_MENU);
CMDIFrameWnd* pFrame = (CMDIFrameWnd*)AfxGetMainWnd();
pmenuOld = pFrame->MDISetMenu(pMenu,NULL);
if(pmenuOld)
pmenuOld->DestroyMenu();
pMenu->Detach();
delete pMenu;
pFrame->DrawMenuBar();
I don't believe this is the best way to do this, especially since the
documentation for MDISetMenu says not to use it if the framework handles
menus. The biggest problem I am having is with the DestroyMenu call. If I
don't call it, I eventually use up all of the menu resources for NT and the
app will not change menus. If I do call it, the first time the app tries
it I get an exception directly after making the call (the Assertion varies
depending on what follows the call, so I won't include the error code
here).
Am I going about this thing incorrectly, am I leaving something out, or is
there a "right" way to do this?
Thanks,
Brian
* Brian Jones
* Applied Technical Systems
* Bremerton, WA USA
Become an MFC-L member
| Вернуться в корень Архива
|