//wparam=MenuObjectHandle //lparam=PMO_MenuItem //return MenuItemHandle int MO_AddNewMenuItem(WPARAM wParam,LPARAM lParam) { PMO_MenuItem pmi=(PMO_MenuItem)lParam; int objidx,menuobjecthandle; int miidx,result; int res; if (!isGenMenuInited) return -1; if (pmi==NULL){return(-1);} lockmo(); menuobjecthandle=wParam; objidx=GetMenuObjbyId(menuobjecthandle); if (objidx==-1){unlockmo();return(-1);} if (pmi->cbSize!=sizeof(TMO_MenuItem)) {unlockmo();return -1;} if (!(pmi->flags&CMIF_ROOTPOPUP||pmi->flags&CMIF_CHILDPOPUP)){ //old mode unlockmo(); res=(int)MO_AddOldNewMenuItem(wParam,lParam); return(res); } MenuObjects[objidx].MenuItems=(PMO_IntMenuItem)mir_realloc(MenuObjects[objidx].MenuItems,sizeof(TMO_IntMenuItem)*(MenuObjects[objidx].MenuItemsCount+1)); miidx=MenuObjects[objidx].MenuItemsCount; ZeroMemory(&MenuObjects[objidx].MenuItems[miidx],sizeof(MenuObjects[objidx].MenuItems[miidx])); MenuObjects[objidx].MenuItems[miidx].id=NextObjectMenuItemId++; MenuObjects[objidx].MenuItems[miidx].globalid=getGlobalId(menuobjecthandle,MenuObjects[objidx].MenuItems[miidx].id); MenuObjects[objidx].MenuItems[miidx].mi=*pmi; MenuObjects[objidx].MenuItems[miidx].mi.pszName = (TCHAR*)CallService( MS_LANGPACK_PCHARTOTCHAR,0,(LPARAM)pmi->pszName); MenuObjects[objidx].MenuItems[miidx].iconId=-1; MenuObjects[objidx].MenuItems[miidx].OverrideShow=TRUE; MenuObjects[objidx].MenuItems[miidx].IconRegistred=FALSE; if (pmi->hIcon!=NULL) MenuObjects[objidx].MenuItems[miidx].iconId=ImageList_AddIcon(MenuObjects[objidx].hMenuIcons,pmi->hIcon); result=getGlobalId(wParam,MenuObjects[objidx].MenuItems[miidx].id); MenuObjects[objidx].MenuItemsCount++; unlockmo(); return(result); }
//wparam=MenuObjectHandle //lparam=PMO_MenuItem //return MenuItemHandle PMO_IntMenuItem MO_AddNewMenuItem( HANDLE menuobjecthandle, PMO_MenuItem pmi ) { if ( !bIsGenMenuInited || pmi == NULL || pmi->cbSize != sizeof( TMO_MenuItem )) return NULL; //old mode if ( !( pmi->flags & CMIF_ROOTHANDLE )) return MO_AddOldNewMenuItem( menuobjecthandle, pmi ); EnterCriticalSection( &csMenuHook ); int objidx = GetMenuObjbyId( (int)menuobjecthandle ); if ( objidx == -1 ) { LeaveCriticalSection( &csMenuHook ); return NULL; } TIntMenuObject* pmo = g_menus[objidx]; TMO_IntMenuItem* p = ( TMO_IntMenuItem* )mir_calloc( sizeof( TMO_IntMenuItem )); p->parent = pmo; p->signature = MENUITEM_SIGNATURE; p->iCommand = GetNextObjectMenuItemId(); p->mi = *pmi; p->iconId = -1; p->OverrideShow = TRUE; p->originalPosition = pmi->position; #if defined( _UNICODE ) if ( pmi->flags & CMIF_UNICODE ) p->mi.ptszName = mir_tstrdup(( pmi->flags & CMIF_KEEPUNTRANSLATED ) ? pmi->ptszName : TranslateTS( pmi->ptszName )); else { if ( pmi->flags & CMIF_KEEPUNTRANSLATED ) p->mi.ptszName = mir_a2u(pmi->pszName); else p->mi.ptszName = LangPackPcharToTchar( pmi->pszName ); } #else p->mi.ptszName = mir_strdup(( pmi->flags & CMIF_KEEPUNTRANSLATED ) ? pmi->ptszName : Translate( pmi->ptszName )); #endif if ( pmi->hIcon != NULL && !bIconsDisabled ) { if ( pmi->flags & CMIF_ICONFROMICOLIB ) { HICON hIcon = IcoLib_GetIconByHandle( pmi->hIcolibItem, false ); p->iconId = ImageList_AddIcon( pmo->m_hMenuIcons, hIcon ); p->hIcolibItem = pmi->hIcolibItem; IconLib_ReleaseIcon( hIcon, 0 ); } else { HANDLE hIcolibItem = IcoLib_IsManaged( pmi->hIcon ); if ( hIcolibItem ) { p->iconId = ImageList_AddIcon( pmo->m_hMenuIcons, pmi->hIcon ); p->hIcolibItem = hIcolibItem; } else p->iconId = ImageList_AddIcon( pmo->m_hMenuIcons, pmi->hIcon ); } } if ( p->mi.root == HGENMENU_ROOT ) p->mi.root = NULL; PMO_IntMenuItem pRoot = ( p->mi.root != NULL ) ? MO_GetIntMenuItem( p->mi.root ) : NULL; if ( pRoot ) p->owner = &pRoot->submenu; else p->owner = &pmo->m_items; if ( !p->owner->first ) p->owner->first = p; if ( p->owner->last ) p->owner->last->next = p; p->owner->last = p; LeaveCriticalSection( &csMenuHook ); return p; }