none
CMFCMenuBar Dynamisch RRS feed

  • Frage

  • Hallo,

    ich habe eine Klasse geschrieben die mein Menü dynmisch bereinigen soll.

    Also ich entferne zuerst alle Menüpunkte die nicht angezeigt werden sollen mit

    m_wndMenuBar.SetNonPermittedCommands( list_menu_punte_loeschen); in der OnActivate.

    Dies funktioniert soweit, nur kann es vorkommen das nun leere Popups vorhanden sind.

    Diese möchte ich dynamisch herausnehmen.

    void RCMenu::MenuBereinigen(CMFCMenuBar &menu_bar)
    {    
        CMenu *menu = CMenu::FromHandle( menu_bar.GetHMenu());
        
        long item_count = menu->GetMenuItemCount();    
        
        for( int i = item_count - 1; i >= 0; i--)    
        {        
            CMFCToolBarMenuButton* item = (CMFCToolBarMenuButton*)menu_bar.GetMenuItem( i);            
            
            if( item != NULL && IsMenuButtonEmpty( menu_bar, item))        
            {            
                menu_bar.RemoveButton( i);        
            }    
        }
    }


    bool RCMenu::IsMenuButtonEmpty(CMFCMenuBar &menu_bar, CMFCToolBarButton* button)
    {
    	bool erg = true;
    
    	ASSERT_VALID( button);
    
    	CMFCToolBarMenuButton* menu_button = DYNAMIC_DOWNCAST( CMFCToolBarMenuButton, button);
    	
    	if( menu_button == NULL)
    	{
    		long index = menu_bar.ButtonToIndex( button);
    
    		if( index < 0)
    		{
    			return false;
    		}
    
    		UINT id = menu_bar.GetItemID( index);
    
    		if( !menu_bar.IsCommandPermitted( id))
    		{
    			menu_bar.RemoveButton( index);
    		}
    
    		return false;
    	}
    
    	const CObList& list_commands = menu_button->GetCommands();
    
    	for( POSITION pos = list_commands.GetHeadPosition(); pos != NULL; )
    	{
    		CMFCToolBarButton* sub_button = (CMFCToolBarButton*) list_commands.GetNext( pos);
    		CMFCToolBarMenuButton* sub_menu_button = DYNAMIC_DOWNCAST( CMFCToolBarMenuButton, sub_button);
    
    		ASSERT_VALID( sub_button);
    		ASSERT_VALID( sub_menu_button);
    
    		const CObList& list_commands_sub = sub_menu_button->GetCommands();
    
    		if( !list_commands_sub.IsEmpty())
    		{
    			bool erg_sub = IsMenuButtonEmpty( menu_bar, sub_button);
    
    			if( erg_sub)
    			{
    				sub_button->SetVisible( false);
    				menu_bar.AdjustLayout();
    				menu_bar.AdjustSizeImmediate();			
    			}
    			else
    			{
    				erg = erg_sub;
    			}
    
    			continue;
    		}
    
    		if( menu_bar.IsCommandPermitted( sub_button->m_nID)	&& 
    			(sub_button->m_nID > 0 && sub_button->m_nID <= 131072))
    		{
    			erg = false;
    		}
    	}
    
    	return erg;
    }
    

    Die leeren Popups werden gefunden und SetVisible( false) gesetzt, aber im Menü sind sie weiterhin sichtbar.

    Was mache ich flasch ?

    Gruß Eddi

    Freitag, 26. Juni 2020 07:44

Antworten

Alle Antworten