This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | Next revision Both sides next revision | ||
developer:sdksamples:insertpluginmenu [2015/09/14] |
developer:sdksamples:insertpluginmenu [2020/08/14] 127.0.0.1 external edit |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Add a Custom Menu to Rhino' | ||
+ | ====== C++ ====== | ||
+ | > **Summary: | ||
+ | |||
+ | =====Question===== | ||
+ | I am trying to add a submenu to Rhino' | ||
+ | |||
+ | =====Answer===== | ||
+ | To insert a menu item, or a submenu, into Rhino' | ||
+ | |||
+ | - Use CRhinoApp:: | ||
+ | - Use CRhinoPlugIn:: | ||
+ | |||
+ | =====Example===== | ||
+ | The following example command demonstrates how to add and remove a custom menu from Rhino' | ||
+ | |||
+ | |||
+ | <code c++> | ||
+ | //////////////////////////////////////////////////////////////// | ||
+ | // cmdMyMenu.cpp | ||
+ | |||
+ | #include " | ||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | //////////////////////////////////////////////////////////////// | ||
+ | //////////////////////////////////////////////////////////////// | ||
+ | // | ||
+ | // BEGIN MyMenu command | ||
+ | // | ||
+ | |||
+ | class CCommandMyMenu : public CRhinoCommand | ||
+ | { | ||
+ | public: | ||
+ | CCommandMyMenu() {} | ||
+ | ~CCommandMyMenu() {} | ||
+ | UUID CommandUUID() | ||
+ | { | ||
+ | static const GUID MyMenuCommand_UUID = | ||
+ | { <TODO: add your command uuid here> }; | ||
+ | return MyMenuCommand_UUID; | ||
+ | } | ||
+ | const wchar_t* EnglishCommandName() { return L" | ||
+ | const wchar_t* LocalCommandName() { return L" | ||
+ | CRhinoCommand:: | ||
+ | |||
+ | BOOL LoadMyMenu(); | ||
+ | BOOL UnloadMyMenu(); | ||
+ | |||
+ | private: | ||
+ | CMenu m_menu; | ||
+ | }; | ||
+ | |||
+ | // The one and only CCommandMyMenu object | ||
+ | static class CCommandMyMenu theMyMenuCommand; | ||
+ | |||
+ | CRhinoCommand:: | ||
+ | { | ||
+ | bool bVisible = ( m_menu.GetSafeHmenu() ) ? true : false; | ||
+ | |||
+ | ON_wString prompt; | ||
+ | prompt.Format( L"%s is %s. New value", | ||
+ | EnglishCommandName(), | ||
+ | bVisible ? L" | ||
+ | ); | ||
+ | |||
+ | CRhinoGetOption go; | ||
+ | go.SetCommandPrompt( prompt ); | ||
+ | int s_opt = go.AddCommandOption( RHCMDOPTNAME(L" | ||
+ | int h_opt = go.AddCommandOption( RHCMDOPTNAME(L" | ||
+ | int t_opt = go.AddCommandOption( RHCMDOPTNAME(L" | ||
+ | go.GetOption(); | ||
+ | if( go.CommandResult() != success ) | ||
+ | return go.CommandResult(); | ||
+ | |||
+ | const CRhinoCommandOption* opt = go.Option(); | ||
+ | if( 0 == opt ) | ||
+ | return failure; | ||
+ | |||
+ | if( opt-> | ||
+ | { | ||
+ | if( false == bVisible ) | ||
+ | LoadMyMenu(); | ||
+ | } | ||
+ | else if( opt-> | ||
+ | { | ||
+ | if( true == bVisible ) | ||
+ | UnloadMyMenu(); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | if( true == bVisible ) | ||
+ | UnloadMyMenu(); | ||
+ | else | ||
+ | LoadMyMenu(); | ||
+ | } | ||
+ | |||
+ | return success; | ||
+ | } | ||
+ | |||
+ | BOOL CCommandMyMenu:: | ||
+ | { | ||
+ | // Switch the module state so resources are read | ||
+ | // from our plug-in (DLL), not Rhino. | ||
+ | AFX_MANAGE_STATE( AfxGetStaticModuleState() ); | ||
+ | |||
+ | // Try to load our menu resource from our plug-in. | ||
+ | // Note, m_my_menu is a CMenu member variable. | ||
+ | if( 0 == m_menu.GetSafeHmenu() ) | ||
+ | { | ||
+ | if( !m_menu.LoadMenu(IDR_MY_MENU) ) | ||
+ | return FALSE; | ||
+ | } | ||
+ | |||
+ | // Find a location in Rhino' | ||
+ | // menu item. For this example, we will insert our | ||
+ | // menu on the " | ||
+ | // item. | ||
+ | HMENU hParent = 0; | ||
+ | int index = 0; | ||
+ | //if( !RhinoApp().FindRhinoMenuItem(L"& | ||
+ | if( !RhinoApp().FindRhinoMenuItem(L" | ||
+ | { | ||
+ | m_menu.DestroyMenu(); | ||
+ | return FALSE; | ||
+ | } | ||
+ | |||
+ | // Create and initialize a MENUITEMINFO struct. | ||
+ | MENUITEMINFO mi; | ||
+ | memset( &mi, 0, sizeof(mi) ); | ||
+ | mi.cbSize = sizeof(mi); | ||
+ | |||
+ | // Fill in our menu info | ||
+ | mi.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU; | ||
+ | mi.wID = MF_POPUP; | ||
+ | mi.fType = MFT_STRING; | ||
+ | |||
+ | ON_wString wstr = L" | ||
+ | mi.dwTypeData = wstr.Array(); | ||
+ | |||
+ | mi.fState = MFS_ENABLED; | ||
+ | mi.hSubMenu = m_menu.GetSafeHmenu(); | ||
+ | mi.hSubMenu = :: | ||
+ | mi.wID = IDR_MY_MENU; | ||
+ | |||
+ | // Add our menu to Rhino' | ||
+ | BOOL rc = MyTestPlugIn().InsertPlugInItemToRhinoMenu( hParent, index + 1, &mi ); | ||
+ | if( !rc ) | ||
+ | m_menu.DestroyMenu(); | ||
+ | |||
+ | return rc; | ||
+ | } | ||
+ | |||
+ | BOOL CCommandMyMenu:: | ||
+ | { | ||
+ | BOOL rc = FALSE; | ||
+ | |||
+ | // Find our menu item in Rhino' | ||
+ | HMENU hParent = 0; | ||
+ | int index = 0; | ||
+ | if( RhinoApp().FindRhinoMenuItem(L" | ||
+ | { | ||
+ | // Remove our menu item. | ||
+ | if( :: | ||
+ | { | ||
+ | // Redraw Rhino' | ||
+ | DrawMenuBar( RhinoApp().MainWnd() ); | ||
+ | m_menu.DestroyMenu(); | ||
+ | rc = TRUE; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return rc; | ||
+ | } | ||
+ | |||
+ | // | ||
+ | // END MyMenu command | ||
+ | // | ||
+ | //////////////////////////////////////////////////////////////// | ||
+ | //////////////////////////////////////////////////////////////// | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | {{tag> | ||