天天看点

UE4多窗口,关闭事件,窗口销毁

void AMultiWindowsActor::CreateSpectatorWindow(FVector2D WindowSize, FVector2D WindowPosition, UUserWidget* showWidget, bool autoCenter)
{
    //WindowMode = EWindowMode::WindowedFullscreen;
    // Create and add window
    SpectatorWindow = SNew(SWindow)
        .ScreenPosition(WindowPosition)
        .ClientSize(WindowSize)
        .SizingRule(ESizingRule::UserSized)
        .Title(FText::FromString(TEXT("Custom SpectatorWindow")))
        .AutoCenter(autoCenter ? (EAutoCenter::PrimaryWorkArea) : (EAutoCenter::None))
        .FocusWhenFirstShown(false)
        .UseOSWindowBorder(true)
        .UserResizeBorder(true)
        .CreateTitleBar(true)
        .SupportsTransparency(EWindowTransparency::PerWindow)
        .InitialOpacity(1.0f)
        .SupportsMaximize(true);
    SpectatorWindow->SetViewportSizeDrivenByWindow(true);
    //获取当前应用的实例
    FSlateApplication& SlateApp = FSlateApplication::Get();
    //添加新建的窗口到该实例中
    SlateApp.AddWindow(SpectatorWindow.ToSharedRef(), true);
    //新建一个内容画布
    TSharedRef<SConstraintCanvas> ViewportWidget = SNew(SConstraintCanvas);
    TSharedPtr<SWidget> SlateWidget = showWidget->TakeWidget();
    // Add slate widget to window
   // ViewportWidget->AddSlot()
       // [
            //放置添加内容的位置
           // SlateWidget.ToSharedRef()
      //  ]
   // ;
    ViewportWidget->SetVisibility(EVisibility::Visible);
    //内容设置
    SpectatorWindow->SetContent(showWidget->TakeWidget());
    SpectatorWindow->ShowWindow();
    //设置窗口模式
    SpectatorWindow->SetWindowMode(EWindowMode::Windowed);

    bIsStandaloneGame = GetWorld()->WorldType == EWorldType::Game;
    SpectatorWindow->SetOnWindowClosed(FOnWindowClosed::CreateLambda([=](const TSharedRef<SWindow>& WindowArg)
    {
        APlayerController* PlayerController = UGameplayStatics::GetPlayerController(this, 0);
        UKismetSystemLibrary::QuitGame(this, PlayerController, EQuitPreference::Quit,true);
    }));
}
void AMultiWindowsActor::DestroySpectatorWindow()
{
    // Destroy window
    if (SpectatorWindow.Get() != nullptr)
    {
        if (bIsStandaloneGame == false)
        {
            SpectatorWindow->RequestDestroyWindow();
        }
        else
        {
            SpectatorWindow->DestroyWindowImmediately();
        }
    }
}
           
UE4多窗口,关闭事件,窗口销毁

继续阅读