手順 2. イベント ハンドラーのセットアップ

手順 2. イベント ハンドラーのセットアップ

[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]

ビューを表示する DirectX の設定を続行するために、イベントにハンドラーを接続します。この手順では、「手順 1: ビューの作成と初期化」で C++ と Windows ランタイム API を使った DirectX アプリの基本的なフローとして既に作成したコードをベースにします。

このガイダンスで使用されるコードは、Microsoft Visual Studio 2013 の DirectX アプリ テンプレートから抜粋したものです。このコードは、App.h、App.cpp、DeviceResources.h、 DeviceResources.cpp の各ファイルで使用されています。

手順

ビューの作成と初期化」で、Initialize メソッドと SetWindow メソッドをビュー プロバイダー クラスに作成しました。これがアプリの開始時に呼び出されます。これらの必須メソッドは、新しいビューとウィンドウをアプリにアタッチし、アプリがサポートするプロセス ライフタイム管理 (PLM) イベントにハンドラーをマップします。コードは次のようになります。



// The first method called when the IFrameworkView is being created.
void App::Initialize(CoreApplicationView^ applicationView)
{
	// Register event handlers for app lifecycle. This example includes Activated, so that we
	// can make the CoreWindow active and start rendering on the window.
	applicationView->Activated +=
		ref new TypedEventHandler<CoreApplicationView^, IActivatedEventArgs^>(this, &App::OnActivated);

	CoreApplication::Suspending +=
		ref new EventHandler<SuspendingEventArgs^>(this, &App::OnSuspending);

	CoreApplication::Resuming +=
		ref new EventHandler<Platform::Object^>(this, &App::OnResuming);

	// At this point we have access to the device. 
	// We can create the device-dependent resources.
	m_deviceResources = std::make_shared<DeviceResources>();
}



// Called when the CoreWindow object is created (or re-created).
void App::SetWindow(CoreWindow^ window)
{
	window->SizeChanged += 
		ref new TypedEventHandler<CoreWindow^, WindowSizeChangedEventArgs^>(this, &App::OnWindowSizeChanged);

	window->VisibilityChanged +=
		ref new TypedEventHandler<CoreWindow^, VisibilityChangedEventArgs^>(this, &App::OnVisibilityChanged);

	window->Closed += 
		ref new TypedEventHandler<CoreWindow^, CoreWindowEventArgs^>(this, &App::OnWindowClosed);

	DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView();

	currentDisplayInformation->DpiChanged +=
		ref new TypedEventHandler<DisplayInformation^, Object^>(this, &App::OnDpiChanged);

	currentDisplayInformation->OrientationChanged +=
		ref new TypedEventHandler<DisplayInformation^, Object^>(this, &App::OnOrientationChanged);

	DisplayInformation::DisplayContentsInvalidated +=
		ref new TypedEventHandler<DisplayInformation^, Object^>(this, &App::OnDisplayContentsInvalidated);

	// Disable all pointer visual feedback for better performance when touching.
	auto pointerVisualizationSettings = PointerVisualizationSettings::GetForCurrentView();
	pointerVisualizationSettings->IsContactFeedbackEnabled = false; 
	pointerVisualizationSettings->IsBarrelButtonFeedbackEnabled = false;

	m_deviceResources->SetWindow(window);
}

これは、メイン アプリ オブジェクトのヘッダーで定義したイベントのセットにマップされます。DirectX アプリ テンプレート アプリのヘッダー ファイル (この場合は App.h) は次のようになります。



// Application lifecycle event handlers.
		void OnActivated(Windows::ApplicationModel::Core::CoreApplicationView^ applicationView, Windows::ApplicationModel::Activation::IActivatedEventArgs^ args);
		void OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ args);
		void OnResuming(Platform::Object^ sender, Platform::Object^ args);

		// Window event handlers.
		void OnWindowSizeChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ args);
		void OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args);
		void OnWindowClosed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::CoreWindowEventArgs^ args);

		// Display properties event handlers.
		void OnDpiChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args);
		void OnOrientationChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args);
		void OnDisplayContentsInvalidated(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args);


このコードには、ビューのアクティブ化のためのハンドラーとして OnActivated があります。これは、アプリでビューがアクティブ化されるとき (表示のフォアグラウンドでアプリ ビューがアクティブなとき) に呼び出されます。このサンプルでは、単純に、関連付けられた CoreWindow インスタンスがアクティブ化されます。PLM の中断イベントと再開イベントのハンドラーとして OnSuspendingOnResuming もあります。

また、ウィンドウの表示イベントとサイズ変更イベントのハンドラーとして、次のものがあります。

  • OnVisibilityChanged は、アプリのメイン ウィンドウがフォアグランドとバックグランドの間で切り替わるときに呼び出されます。
  • OnWindowSizeChanged は、アプリのビュー (ウィンドウ) のサイズが変更されたときにのみ呼び出されます。
  • ユーザーがウィンドウを閉じると、OnWindowClosed が呼び出されます。

さらに、表示イベントのハンドラーとして、次のものがあります。

  • OnDpiChanged は、ディスプレイ DPI が Windows ストア アプリ用の従来のデスクトップ ディスプレイ設定か新しい表示スケール プラトー設定のどちらかを通じて変更された場合に呼び出されます。
  • ディスプレイの向きが横長から縦長、または逆方向に変更された場合、OnOrientationChanged が呼び出されます。これは、処理する必要がある重要なイベントです。
  • Direct3D グラフィック デバイスが喪失したか、変更された場合、OnDisplayContentsInvalidated が呼び出されます。

それでは、これらのハンドラーを実装しましょう。

まず、ビュー アクティブ化イベント ハンドラーである OnActivated を定義します。


void App::OnActivated(CoreApplicationView^ applicationView, IActivatedEventArgs^ args)
{
	// Run() won't start until the CoreWindow is activated.
	CoreWindow::GetForCurrentThread()->Activate();
}


既に説明したとおり、アプリがビュー プロバイダーのインスタンスに提供したウィンドウを単純にアクティブ化しています。このメソッドを拡張して、スプラッシュ画面を生成できます。それには、IActivatedEventArgs.SplashScreen によって提供される SplashScreen オブジェクトを使います。

これで、OnSuspendingOnResuming がそれぞれ PLM の中断イベントと再開イベントによって呼び出されたときの基本的な動作が定義されました。


void App::OnSuspending(Platform::Object^ sender, SuspendingEventArgs^ args)
{
	// Save app state asynchronously after requesting a deferral. Holding a deferral
	// indicates that the application is busy performing suspending operations. Be
	// aware that a deferral may not be held indefinitely. After about five seconds,
	// the app will be forced to exit.
	SuspendingDeferral^ deferral = args->SuspendingOperation->GetDeferral();

	create_task([this, deferral]()
	{
        m_deviceResources->Trim();

		// Insert your code here.

		deferral->Complete();
	});
}
 
void App::OnResuming(Platform::Object^ sender, Platform::Object^ args)
{
	// Restore any data or state that was unloaded on suspend. By default, data
	// and state are persisted when resuming from suspend. Note that this event
	// does not occur if the app was previously terminated.

	// Insert your code here.
}


次に、ウィンドウのイベント ハンドラー (OnWindowSizeChangedOnVisibilityChangedOnWindowClosed) のコードを記述します。 メソッドの実装については、「手順 3: DirectX スワップ チェーンの接続」を参照してください。


void App::OnWindowSizeChanged(CoreWindow^ sender, WindowSizeChangedEventArgs^ args)
{
	m_deviceResources->UpdateForWindowSizeChange();
	m_main->CreateWindowSizeDependentResources();
}




void App::OnVisibilityChanged(CoreWindow^ sender, VisibilityChangedEventArgs^ args)
{
	m_windowVisible = args->Visible;
}

void App::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args)
{
	m_windowClosed = true;
}




void App::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args)
{
	m_windowClosed = true;
}


OnWindowSizeChanged では、ウィンドウのサイズが変更されたときに DirectX スワップ チェーンの表示サイズを再作成するコードを提供する必要があります。この例では、前のコードで呼び出されたとおり、プライベート メソッドの UpdateForWindowSizeChange を作成します このバージョンのテンプレートは、DeviceResources クラス実装の DeviceResources.cpp にあります。

サイズが変更された場合は、グラフィックス リソースを更新する必要があります。次のようなメソッドをビュー プロバイダー クラス (この例では親クラス) に追加します。


void DeviceResources::UpdateForWindowSizeChange()
{
	DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView();

	if (m_swapChainPanel == nullptr && (
            m_window->Bounds.Width  != m_outputSize.Width ||
            m_window->Bounds.Height != m_outputSize.Height
        ) || m_swapChainPanel != nullptr && (
            m_swapChainPanel->ActualWidth != m_outputSize.Width ||
            m_swapChainPanel->ActualHeight != m_outputSize.Height
        ) || m_orientation != currentDisplayInformation->CurrentOrientation)

	{
		CreateWindowSizeDependentResources();
	}
}

CreateWindowSizeDependentResources については、「手順 3. DirectX スワップ チェーンの接続」で説明します。

前のステップ

ビューの作成と初期化

次のステップ

DirectX スワップ チェーンの接続

関連トピック

DirectX Windows ストア アプリでビューを表示するための設定方法
DirectX Windows ストア アプリ フレームワークのコード一式

 

 

表示:
© 2017 Microsoft