CustomUI サンプル
このサンプルは、DXUT によって実装された UI サブシステムの簡単な実例を示しています。DXUT は、ほとんどの Direct3D アプリケーションで見られる一般的なコードとインフラストラクチャを提供します。DXUT には、ユーザー インターフェイスをサポートするための領域があります。DXUT には、ボタンやチェック ボックスなどの一般的に使用されるコントロール オブジェクトが含まれています。ウィンドウ表示モードおよび全画面モードのどちらでも Direct3D アプリケーションはそれらのユーザー インターフェイスを実装して使用できます。
Path
ソース : | (SDK ルート)\Samples\C++\Direct3D\CustomUI |
実行可能ファイル : | (SDK ルート)\Samples\C++\Direct3D\Bin\x86 or x64\CustomUI.exe |
サンプルが動作するしくみ
このサンプルは、アプリケーションが DXUT を使用してフレームワークのユーザー インターフェイス サポートの利点を活用する方法を示しています。DXUT は次の種類のコントロールをサポートしています。
コントロールの種類 | これを実装するクラス |
---|---|
スタティック | CDXUTStatic |
ボタン | CDXUTButton |
ラジオ ボタン | CDXUTRadioButton |
チェック ボックス | CDXUTCheckBox |
コンボ ボックス | CDXUTComboBox |
スライダー | CDXUTSlider |
編集ボックス | CDXUTEditBox |
IME 機能を持つ編集ボックス | CDXUTIMEEditBox |
すべての DXUT コントロールは、Windows コントロールと同じように動作します。これらは、まったくゼロの状態から実装されており、HWND または Windows コントロールは使用していません。また、これらは Direct3D でレンダリングされています。そのため、ウィンドウ表示モードおよび全画面表示のどちらでも Direct3D アプリケーションを使用できます。
CDXUTIMEEditBox は、IME (Input Method Editor) 機能を持つ編集ボックスです。CDXUTIMEEditBox にテキストを入力する場合、ユーザーはサポートされている東アジア言語 (日本語、韓国語、簡体字中国語、繁体字中国語) の 1 つに入力言語を切り替えることができます。入力時に、CDXUTIMEEditBox は IME ウィンドウを Direct3D でレンダリングします。また、これはデフォルトの IME ウィンドウ表示モードを使用しないので、全画面モードでアプリケーション ウィンドウが適切に表示されます。
このサンプルは、g_HUD および g_SampleUI の 2 つの CDXUTDialog オブジェクトを定義することで 開始します。CDXUTDialog は、1 つまたは複数のコントロールをカプセル化するコンテナーとして提供されます。これはアプリケーションとコントロールの間にあります。そのため、アプリケーションは CDXUTDialog を呼び出してメッセージを渡し、レンダリングします。CDXUTDialog は、すべてのコントロールが確実にメッセージを受け取り、適切にレンダリングされるようにします。コントロールはそれ自体が、単独ではなく CDXUTDialog と一緒に使用されるように設計されています。アプリケーションは、1 つの CDXUTDialog オブジェクトに制限されません。このサンプルで実行されているように、一度に複数を使用することができます。
まず、SetCallback メソッドでイベント コールバック関数が設定される CDXUTDialog オブジェクトを初期化する必要があります。UI コントロールを持つユーザー インターフェイスとして、コントロールはサンプルに重要なイベントに関して通知し、それに応じて返答されます。この時、サンプルは必要とされる追加のフォントを初期化します。これは、SetFont メソッドで実行されます。
次に、サンプルは必要とされるコントロールを作成する必要があります。これは、AddButton などの CDXUTDialog の AddXXX メソッドを呼び出すことで実行されます。サンプルでは、g_HUD に Direct3D サンプルが備えている一般的な機能である 4 つのボタン、ホワイトペーパーの表示、全画面モードとウィンドウ モードの切り替え、HAL と REF の切り替え、3D デバイス設定の変更が含まれています。g_SampleUI には、サンプル固有の残りのすべてのコントロールが含まれます。コントロールが追加された後、その外観は変更されます。スタティック コントロールおよびコンボ ボックス、IME 機能の編集ボックスの外観が変更された様子は、サンプルのとおりです。
次に、OnResetDevice で、CDXUTDialog やコントロールの SetSize や SetLocation メソッドが呼び出されます。これは、ユーザーがアプリケーション ウィンドウのサイズを変更するときに、複数のダイアログとコントロールのサイズ変更と位置調整が必要になるためです。アプリケーション ウィンドウに対する CDXUTDialog の位置、これが属す CDXUTDialog に対するコントロールの位置が重要になります。
ユーザー インターフェイスをレンダリングするには、OnFrameRender 関数にある 2 つの CDXUTDialog オブジェクトの OnRender メソッドを呼び出します。CDXUTDialog は、それが含むコントロールを適切な順番でレンダリングします。
最後の手順では、UI にコントロールにメッセージを渡すようにする必要があります。これによって、これらはユーザーからキーボードとマウスのイベントを受け取ります。MsgProc では、サンプルは CDXUTDialog の MsgProc メソッドを呼び出し、メッセージを渡します。CDXUTDialog の MsgProc が、メッセージが処理済みであることを示す TRUE を返す場合、サンプルは *pbNoFurtherProcessing を TRUE に設定し、すぐに返すことが重要です。これに失敗するとメッセージは 2 回以上処理されてしまいます。また、これによってダブル ウィンドウなどの特定の Input Method Editor (IME) メッセージに対して望ましくない動作が発生することがあります。
イベント コールバック
チェック ボックスのオン/オフを切り替える、新しい項目をコンボ ボックスで選択する、ラジオ ボタン グループで新しい項目を選択するなどの特定のイベントが、ユーザーと UI コントロールの間で発生します。アプリケーションはこれらのイベントに関係しているため、CDXUTDialog イベント コールバック メカニズムでこれらが通知されます。サンプルでは、コールバック関数である OnGUIEvent は、CDXUTDialog::SetCallback メソッドへのパラメーターとして定義され、渡されます。その結果、この関数はユーザーが UI コントロールに関連する動作を行った場合は常に呼び出されます。コールバックが発生する動作は次のとおりです。
- ボタンをクリックする (CDXUTButton)
- コンボ ボックスで新しい項目を選択する (CDXUTComboBox)
- ラジオ ボタン グループで新しい項目を選択する (CDXUTRadioButton)
- チェック ボックスのチェック ステートを変更する (CDXUTCheckBox)
- スライダーの値を変更する (CDXUTSlider)
- 編集ボックスで Enter キーを押す (CDXUTEditBox および CDXUTIMEEditBox)
- コールバックでは、イベントの種類、イベントを発生させるコントロールの ID、コントロール オブジェクトがアプリケーションに対して利用できます。サンプルでは、発生するコントロールの内容を取得し、それを画面に表示することでコールバックに返答します。
参考情報
詳細については、技術関連記事の「IME のインストールと使用」および「ゲームでの IME の使用」を参照してください。