

上面这些本质上都是菜单栏和工具栏
在UE4中,菜单栏和工具栏本质也是一个Button,点击菜单栏或者工具栏会执行相对应的mingle,而UE4为了方便操作,让菜单按钮执行的事件绑定用了Commands命令绑定的方式。
命令集合,用于声明各种FUICommandInfo和注册FUICommandInfo
命令信息,用于绑定菜单执行的事件(Delegate)
FUICommandList是命令队列,每个FUICommandInfo绑定委托都得通过FUICommandList的MapAction接口来
#pragma once
#include "CoreMinimal.h"
#include "Framework/Commands/Commands.h"
#include "Styling/SlateStyle.h"class FMyCommands :public TCommands
{
public:FMyCommands() :TCommands(TEXT("MyMenu"), NSLOCTEXT("Contexts", "MyMenu", "MyMenu Test"), NAME_None, FMyCommands::GetStyleSetName()){}virtual void RegisterCommands() override;public:TSharedPtr OpenFileCommand;TSharedPtr CloseFileCommand;TSharedPtr SaveFileCommand;};
TSharedPtr MyCommandList;
void OnClick();FMyCommands::Register();MyCommandList = MakeShareable(new FUICommandList);MyCommandList->MapAction(FMyCommands::Get().OpenFileCommand,FExecuteAction::CreateRaw(this,&SVRLevelEditor::OnClick), FCanExecuteAction());MyCommandList->MapAction(FMyCommands::Get().CloseFileCommand,FExecuteAction::CreateRaw(this, &SVRLevelEditor::OnClick), FCanExecuteAction());MyCommandList->MapAction(FMyCommands::Get().SaveFileCommand, FExecuteAction::CreateRaw(this, &SVRLevelEditor::OnClick), FCanExecuteAction());
UE4扩展编辑器按钮都是FExtend来扩展,FExtend提供了AddMenuExtension来扩展Menu,AddMenuBarExtension扩展MenuBar, AddToolBarExtension扩展ToolBar.
扩展菜单栏的方法:
一、加载模块
//编辑器的模块加载
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked("LevelEditor");
//动画蓝图的模块加载
IAnimationBlueprintEditorModule& AnimationBlueprintEditorModule = FModuleManager::LoadModuleChecked("AnimationBlueprintEditor");
二、创建Extender对象
//编辑器扩展已有的菜单栏
TSharedPtr MenuExtender = MakeShareable(new FExtender());MenuExtender->AddMenuExtension("WindowLayout", EExtensionHook::After, MyCommands, FMenuExtensionDelegate::CreateRaw(this, &FMyMenuModule::AddMenuExtension));LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender);
//编辑器扩展新的菜单栏
TSharedPtr MenuBarExtend = MakeShareable(new FExtender());MenuBarExtend->AddMenuBarExtension("Help", EExtensionHook::After, MyCommands, FMenuBarExtensionDelegate::CreateRaw(this, &FMyMenuModule::AdddMenuBarExtend));LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuBarExtend);
//编辑器扩展ToolBar
TSharedPtr ToolbarExtender = MakeShareable(new FExtender);ToolbarExtender->AddToolBarExtension("Settings", EExtensionHook::After, MyCommands, FToolBarExtensionDelegate::CreateRaw(this, &FMyMenuModule::AddToolbarExtension));LevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(ToolbarExtender);
三、给Extender对象添加扩展属性
四、将Extender对象绑定到对应模块
//编辑器扩展已有菜单栏
void FMyMenuModule::AddMenuExtension(FMenuBuilder& Builder)
{Builder.BeginSection(TEXT("MyButton"));Builder.AddMenuEntry(FMyCommands::Get().OpenFileCommand);Builder.EndSection();
}
//编辑器扩展新的菜单栏
void FMyMenuModule::AddMenuBarExtension(FMenuBarBuilder& Builder)
{Builder.BeginSection(TEXT("MyMenuButton"));Builder.AddMenuEntry(FMyCommands::Get().SaveFileCommand);Builder.EndSection();
}//编辑器扩展Toolbar
void FMyMenuModule::AddToolBarExtension(FToolBarBuilder& Builder)
{Builder.BeginSection(TEXT("MyToolButton"));Builder.AddMenuEntry(FMyCommands::Get().CloseFileCommand);Builder.EndSection();
}
MenBar主要是通过AddPullDownMenu
TSharedRef SVRLevelEditor::MakeMenuBar()
{FMenuBarBuilder MenuBulider(MyCommandList);MenuBulider.AddPullDownMenu(LOCTEXT("MyFile","MyFile"), LOCTEXT("MyMenu", "MyMenu"),FNewMenuDelegate::CreateRaw(this,&SVRLevelEditor::AddPullDownMenu));MenuBulider.AddPullDownMenu(LOCTEXT("MyEditor", "MyEditor"), LOCTEXT("MyMenu", "MyMenu"), FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddPullDownMenu));MenuBulider.AddPullDownMenu(LOCTEXT("MyWindow", "MyWindow"), LOCTEXT("MyMenu", "MyMenu"), FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddPullDownMenu));MenuBulider.AddPullDownMenu(LOCTEXT("MyHelp", "MyHelp"), LOCTEXT("MyMenu", "MyMenu"), FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddPullDownMenu));return MenuBulider.MakeWidget();
}
//创建下拉菜单
void SVRLevelEditor::AddPullDownMenu(FMenuBuilder& Builder)
{//第一个参数是分隔栏的Hook名,第二参数是分隔栏的显示名称Builder.BeginSection("CustomSection", LOCTEXT("CustomArea", "CustomArea"));Builder.AddMenuEntry(FMyCommands::Get().OpenFileCommand);//创建分割线Builder.AddMenuSeparator("SeparatorHook");Builder.AddMenuEntry(FMyCommands::Get().CloseFileCommand);Builder.AddMenuSeparator("SeparatorHook");Builder.AddMenuEntry(FMyCommands::Get().SaveFileCommand);//菜单下拉菜单的子菜单Builder.AddSubMenu(LOCTEXT("SubMenu", "SubMenu"),LOCTEXT("This_is_Sub_Menu", "This is Sub Menu!"),FNewMenuDelegate::CreateRaw(this, &SVRLevelEditor::AddSubMenuExtension),false,FSlateIcon(),true,"SubMenuHook");Builder.EndSection();
}
ToolBar主要是通过AddComboButton添加下拉连续按钮
(1)AddToolBarButton添加工具按钮
(2)AddComboButton添加下拉连续按钮,可以通过FOnGetContent委托任意填充下拉按钮内容,只要是SWidget就行。
void SVRLevelEditor::MakeToolBar(FToolBarBuilder& Builder)
{Builder.AddToolBarButton(FMyMenuCommands::Get().SaveFileCommand);Builder.AddComboButton(FUIAction(), FOnGetContent::CreateRaw(this, &FTestMenuModule::GetComboConent), FText::FromString("aaaadd"));}
//创建下拉菜单
TSharedRef SVRLevelEditor::GetComboConent(FMenuBuilder& Builder)
{FMenuBuilder MenuBuilder(true, PluginCommands);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);MenuBuilder.AddMenuEntry(FTestMenuCommands::Get().TestAction);return MenuBuilder.MakeWidget();}