源码版Engine\Source\Programs\中copy BlankProgram文件夹,重命名为ASlateLearning,修改所有文件命名及内部名称。
ASlateLearning.Target.cs
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
[SupportedPlatforms(UnrealPlatformClass.All)]
public class ASlateLearningTarget : TargetRules
{
public ASlateLearningTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Program;
IncludeOrderVersion = EngineIncludeOrderVersion.Latest;
LinkType = TargetLinkType.Monolithic;
LaunchModuleName = "ASlateLearning";
bBuildDeveloperTools = false;
bool bDebugOrDevelopment = Target.Configuration == UnrealTargetConfiguration.Debug || Target.Configuration == UnrealTargetConfiguration.Development;
//bBuildWithEditorOnlyData = Target.Platform.IsInGroup(UnrealPlatformGroup.Desktop) && bDebugOrDevelopment;
bBuildWithEditorOnlyData = true;
bCompileAgainstEngine = false;
bCompileAgainstCoreUObject = true;
bCompileAgainstApplicationCore = true;
bCompileICU = false;
bIsBuildingConsoleApplication = true;
}
}
ASlateLearning.Build.cs
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class ASlateLearning : ModuleRules
{
public ASlateLearning(ReadOnlyTargetRules Target) : base(Target)
{
PublicIncludePaths.Add("Runtime/Launch/Public");
PrivateIncludePaths.Add("Runtime/Launch/Private");
PrivateDependencyModuleNames.AddRange(
new string[]
{
"AppFramework",
"Core",
"ApplicationCore",
"Projects",
"Slate",
"SlateCore",
"StandaloneRenderer",
});
}
}
ASlateLearning.cpp
// Copyright Epic Games, Inc. All Rights Reserved.
#include "ASlateLearning.h"
#include "RequiredProgramMainCPPInclude.h"
#include "StandaloneRenderer.h"
DEFINE_LOG_CATEGORY_STATIC(LogASlateLearning, Log, All);
IMPLEMENT_APPLICATION(LogASlateLearning, "ASlateLearning");
INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
GEngineLoop.PreInit(ArgC, ArgV);
FSlateApplication::InitializeAsStandaloneApplication(GetStandardStandaloneRenderer());
FSlateApplication::InitHighDPI(true);
const TSharedPtr<SWindow> MainWindow = SNew(SWindow).ClientSize(FVector2D(800, 600));
FSlateApplication::Get().AddWindow(MainWindow.ToSharedRef());
while (!IsEngineExitRequested())
{
BeginExitIfRequested();
FSlateApplication::Get().PumpMessages();
FSlateApplication::Get().Tick();
}
FEngineLoop::AppExit();
return 0;
}
运行后会出现创建的窗口,后面继续扩展
// Copyright Epic Games, Inc. All Rights Reserved.
#include "ASlateLearning.h"
#include "RequiredProgramMainCPPInclude.h"
#include "StandaloneRenderer.h"
DEFINE_LOG_CATEGORY_STATIC(LogASlateLearning, Log, All);
IMPLEMENT_APPLICATION(LogASlateLearning, "ASlateLearning");
INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
GEngineLoop.PreInit(ArgC, ArgV);
FSlateApplication::InitializeAsStandaloneApplication(GetStandardStandaloneRenderer());
FSlateApplication::InitHighDPI(true);
const TSharedPtr<SWindow> MainWindow = SNew(SWindow).ClientSize(FVector2D(800, 600))
[
SNew(SHorizontalBox) + SHorizontalBox::Slot()
[
SNew(SButton).Text(NSLOCTEXT("L10N", "Key", "Button Content"))
]
];
FSlateApplication::Get().AddWindow(MainWindow.ToSharedRef());
while (!IsEngineExitRequested())
{
BeginExitIfRequested();
FSlateApplication::Get().PumpMessages();
FSlateApplication::Get().Tick();
}
FEngineLoop::AppExit();
return 0;
}
运行后窗口样式,button太大因为Slot默认的对其策略是HAlign::Fill,VAlign::Fill,调整后的这部分代码应该是
使用SOverlay::FOverlaySlot* Slot;个Slot的指针,用.Expose(Slot)获取指针,Expose方法填入一个插槽指针并将其返回,此后,我们通过APi可以获得一个SWidget的引用,此时的代码应该是这样了
// Copyright Epic Games, Inc. All Rights Reserved.
#include "ASlateLearning.h"
#include "RequiredProgramMainCPPInclude.h"
#include "StandaloneRenderer.h"
DEFINE_LOG_CATEGORY_STATIC(LogASlateLearning, Log, All);
IMPLEMENT_APPLICATION(LogASlateLearning, "ASlateLearning");
INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
GEngineLoop.PreInit(ArgC, ArgV);
FSlateApplication::InitializeAsStandaloneApplication(GetStandardStandaloneRenderer());
FSlateApplication::InitHighDPI(true);
SOverlay::FOverlaySlot* Slot;
const TSharedPtr<SWindow> MainWindow = SNew(SWindow).ClientSize(FVector2D(800, 600))
[
SNew(SOverlay)
+ SOverlay::Slot().HAlign(HAlign_Left).VAlign(VAlign_Top).Expose(Slot)
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot().HAlign(HAlign_Left).VAlign(VAlign_Top)
[
SNew(SButton).Text(NSLOCTEXT("L10N", "Key", "Button Content"))
]
]
];
SWidget& slotwidget = Slot->GetWidget().Get();
SHorizontalBox& HorizontalBox = static_cast<SHorizontalBox&>(slotwidget);
for (int i = 0; i <5;++i)
{
HorizontalBox.AddSlot()
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot().HAlign(HAlign_Left).VAlign(VAlign_Top)
[
SNew(SButton).Text(NSLOCTEXT("L10N", "Key", "Button Content"))
]
];
}
FSlateApplication::Get().AddWindow(MainWindow.ToSharedRef());
while (!IsEngineExitRequested())
{
BeginExitIfRequested();
FSlateApplication::Get().PumpMessages();
FSlateApplication::Get().Tick();
}
FEngineLoop::AppExit();
return 0;
}
运行后的窗口变成了
可以为每个Button添加一些方法,通过OnClicked_Lambda之类的方法
在窗口中创建一个Tab页的方法
INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
GEngineLoop.PreInit(ArgC, ArgV);
FSlateApplication::InitializeAsStandaloneApplication(GetStandardStandaloneRenderer());
FSlateApplication::InitHighDPI(true);
// 新建 SWindow 控件
TSharedRef<SWindow> MainWindow = SNew(SWindow)
.AutoCenter( EAutoCenter::PreferredWorkArea )
.CreateTitleBar( false ) //关闭窗口标题框以防止生成双重标题框,因为 SDockingArea 自带标题框
.ClientSize(FVector2D(800,600))
.Title(FText::FromString("My Window"));
// 动态注册Tab页面的生成器
FGlobalTabmanager::Get()->RegisterTabSpawner(FName("CustomTab"),FOnSpawnTab::CreateLambda([](const FSpawnTabArgs& Args){
return SNew(SDockTab)
[
SNew(SSpacer)
];
}));
//动态注册时激活
FGlobalTabmanager::Get()->TryInvokeTab(FTabId("CustomTab"));
while (!IsEngineExitRequested())
{
BeginExitIfRequested();
FSlateApplication::Get().PumpMessages();
FSlateApplication::Get().Tick();
}
FEngineLoop::AppExit();
return 0;
}
运行后是这样的
我要在这个窗口中多创建几个Tab页该怎么办???