Wie UE4 aufruft, um das Dialogfenster für Systemnachrichten zu öffnen

Während des Spielentwicklungsprozesses ist es manchmal erforderlich, die Probleme, die beim Ausführen des Spiels auftreten, wie z. B. Konfigurationsfehler und andere Informationen, klar zu melden. Die Fehler müssen nicht nur in der Protokolldatei ausgegeben, sondern auch klar angezeigt werden Fehlerinformationen für Nicht-Programmierer sichtbar. Dann ist das Öffnen der Systemfenster-Eingabeaufforderung eine sehr gute Wahl.

Fall 1:

In UE4 können Sie FMessageDialog::Opendie Funktion verwenden, um einen benutzerdefinierten Nachrichtendialog zu öffnen. Hier ist ein einfaches Beispiel:

#include "Runtime/Engine/Public/Slate/Dialogs/MessageDialog.h"

void AMyTestActor::TestFMessageDialog()
{
	FText Title = FText::FromString("My Dialog");
	FText Message = FText::FromString("This is a message.The UE invokes the interface and displays the Windows window.Display this information.");
	EAppMsgType::Type Type = EAppMsgType::OkCancel;

	const EAppReturnType::Type Response = FMessageDialog::Open(Type, Message, &Title);

	if (Response == EAppReturnType::Ok)
	{
		UE_LOG(LogTemp, Log, TEXT("User clicked OK."));
		// 处理用户确认...
	}
	else if (Response == EAppReturnType::Cancel)
	{
		UE_LOG(LogTemp, Log, TEXT("User clicked Cancel."));
		// 处理用户取消...
	}
}

In diesem Beispiel verwenden wir FMessageDialog::Opendie Funktion, um einen benutzerdefinierten Nachrichtendialog zu öffnen. TitleDer Parameter gibt den vom Dialogfeld angezeigten Titeltext an, und Messageder Parameter gibt den vom Dialogfeld angezeigten Nachrichtentext an. TypeDer Parameter gibt den Typ der Dialogschaltfläche an.

Wenn der Benutzer im Dialogfeld auf die Schaltfläche „OK“ geklickt hat, FMessageDialog::Opengibt die Funktion zurück EAppReturnType::Ok. Andernfalls gibt die Funktion zurück, wenn der Benutzer auf die Schaltfläche „Abbrechen“ geklickt hat EAppReturnType::Cancel. Sie können diesen Rückgabewert verwenden, um Benutzerauswahlen zu verarbeiten.

Wirkung:

 

Fall 2:

In UE4 können Sie mit FPlatformMisc::MessageBoxExtder Funktion den Systemmeldungsdialog öffnen. Hier ist ein einfaches Beispiel:

#include "Runtime/Core/Public/GenericPlatform/GenericPlatformMisc.h"

void AMyTestActor::TestMessageBoxExt()
{
	FText Message = FText::FromString("This is a message.");
	FText Title = FText::FromString("Message Box");
	EAppMsgType::Type Type = EAppMsgType::Ok;

	EAppReturnType::Type ret = FPlatformMisc::MessageBoxExt(Type, *Message.ToString(), *Title.ToString());

	switch (ret)
	{
	case EAppReturnType::Ok:
		UE_LOG(LogTemp, Log, TEXT("User clicked OK."));
		// 处理用户确认...
		break;
	case EAppReturnType::Cancel:
		UE_LOG(LogTemp, Log, TEXT("User clicked Cancel."));
		// 处理用户取消...
		break;
	}
}

In diesem Beispiel verwenden wir FPlatformMisc::MessageBoxExtdie Funktion, um einen einfachen Nachrichtendialog zu öffnen. MessageDer Parameter gibt den vom Dialogfeld angezeigten Nachrichtentext an, und Titleder Parameter gibt den Titel des Dialogfelds an. TypeDer Parameter gibt den Typ der Dialogschaltfläche an.

FPlatformMisc::MessageBoxExtDie Funktion gibt true zurück , wenn der Benutzer im Dialogfeld auf die Schaltfläche „OK“ geklickt hat . Andernfalls wird false zurückgegeben. Sie können diesen Rückgabewert verwenden, um Benutzerauswahlen zu verarbeiten.

Wirkung:

 

Referenz:

UE-Engine-Code: ProjectManager.cpp

bool FProjectManager::LoadModulesForProject( const ELoadingPhase::Type LoadingPhase )
{
	DECLARE_SCOPE_CYCLE_COUNTER(TEXT("Loading Game Modules"), STAT_GameModule, STATGROUP_LoadTime);

	bool bSuccess = true;

	if ( CurrentProject.IsValid() )
	{
		TMap<FName, EModuleLoadResult> ModuleLoadFailures;
		FModuleDescriptor::LoadModulesForPhase(LoadingPhase, CurrentProject->Modules, ModuleLoadFailures);

		if ( ModuleLoadFailures.Num() > 0 )
		{
			FText FailureMessage;
			for ( auto FailureIt = ModuleLoadFailures.CreateConstIterator(); FailureIt; ++FailureIt )
			{
				const EModuleLoadResult FailureReason = FailureIt.Value();

				if( FailureReason != EModuleLoadResult::Success )
				{
					const FText TextModuleName = FText::FromName(FailureIt.Key());

					if ( FailureReason == EModuleLoadResult::FileNotFound )
					{
						FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleNotFound", "The game module '{0}' could not be found. Please ensure that this module exists and that it is compiled."), TextModuleName );
					}
					else if ( FailureReason == EModuleLoadResult::FileIncompatible )
					{
						FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleIncompatible", "The game module '{0}' does not appear to be up to date. This may happen after updating the engine. Please recompile this module and try again."), TextModuleName );
					}
					else if ( FailureReason == EModuleLoadResult::FailedToInitialize )
					{
						FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleFailedToInitialize", "The game module '{0}' could not be successfully initialized after it was loaded."), TextModuleName );
					}
					else if ( FailureReason == EModuleLoadResult::CouldNotBeLoadedByOS )
					{
						FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleCouldntBeLoaded", "The game module '{0}' could not be loaded. There may be an operating system error, the module may not be properly set up, or a plugin which has been included into the build has not been turned on."), TextModuleName );
					}
					else
					{
						ensure(0);	// If this goes off, the error handling code should be updated for the new enum values!
						FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleGenericLoadFailure", "The game module '{0}' failed to load for an unspecified reason.  Please report this error."), TextModuleName );
					}

					// Just report the first error
					break;
				}
			}

			FMessageDialog::Open(EAppMsgType::Ok, FailureMessage);
			bSuccess = false;
		}
	}

	OnLoadingPhaseCompleteEvent.Broadcast(LoadingPhase, bSuccess);
	return bSuccess;
} 

----

おすすめ

転載: blog.csdn.net/ZFSR05255134/article/details/129725291