UE4多視窗,關閉事件,視窗銷燬
阿新 • • 發佈:2021-02-17
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(); } } }