ウィンドウの作成
すべての Direct3D アプリケーションでは、ウィンドウを通じてデスクトップに通知します。ウィンドウは、フォーカスの変更、モードの切り替え、およびユーザー入力キーの組み合わせとウィンドウ メッセージによって発生するその他のウィンドウ イベントに応答することによって、実行されているその他のアプリケーションとうまく動作する必要があります。この機能性は、イベント ハンドラーによって実現されます。
DXUT では、DXUT またはアプリケーションのどちらかによって作成されたウィンドウがサポートされています。
- ウィンドウの作成
- ウィンドウ イベントの処理
- 次の手順
DXUT を使用してウィンドウを作成するか、自分でウィンドウを作成できます。
DXUT によって作成されるウィンドウ
DXUT では、DXUTCreateWindow を使用してウィンドウを容易に作成できます。
HRESULT DXUTCreateWindow(
const WCHAR *strWindowTitle = L"Direct3D Window",
HINSTANCE hInstance = NULL,
HICON hIcon = NULL,
HMENU hMenu = NULL,
INT x = CW_USEDEFAULT,
INT y = CW_USEDEFAULT
);
入力パラメーターはすべてオプションです。
- strWindowTitle は、タスク バー上に表示されるウィンドウ タイトルです。通常は、プロジェクト タイトルとなります。
- hInstance は、アプリケーションのインスタンスへのハンドルです。ほとんどのアプリケーションでは通常は NULL となります。
- hIcon は、アプリケーションのアイコンへのハンドルです。これは通常は NULL に設定されます。アプリケーションの実行可能ファイルに埋め込まれている 1 つ目のアイコンが使用されます。
- hMenu はメニュー ハンドルです。ただし、ほとんどのゲームでは、標準のメニューは使用せず、代わりにカスタムのゲーム内インターフェイスを作成します。
- (x,y) は、ウィンドウの位置 (ウィンドウ表示モードのみ) を示します。それらは、全画面モードで実行されているアプリケーションでは無視されます。
ウィンドウへのハンドルは、DXUTGetHWND を呼び出すことによって取得できます。
アプリケーションによって作成されるウィンドウ
アプリケーションでは、ウィンドウの作成に DXUT を使用しないことを選択して、代わりに標準の Windows API 呼び出しを使用してウィンドウを作成することができます。ウィンドウの作成方法は、このプログラミング ガイドの範囲外となります。
ウィンドウが作成されたら、DXUTSetWindow を呼び出して、HWND で DXUT を初期化します。
HRESULT DXUTSetWindow(
HWND hWndFocus,
HWND hWndDeviceFullScreen,
HWND hWndDeviceWindowed,
BOOL bHandleMessages = TRUE
);
この関数では、ウィンドウへの 3 つのハンドルを取得します。それらは通常は、ウィンドウ表示モードのアプリケーションが、全画面表示モードのアプリケーションとは別のウィンドウにある場合以外は同じです。フォーカス ウィンドウは、Alt + Tab キーの組み合わせ、マウス クリック、またはその他のユーザー入力によって、アプリケーションを最前面のウィンドウから背景に切り替える必要があるときに、Direct3D に通知します。DXUT の初期化のために行う最小限のこととして、アプリケーションで常にフォーカス ウィンドウ ハンドルを設定する必要があります。
ウィンドウ イベントの処理
DXUT をウィンドウと共に初期化したら、アプリケーションで、ウィンドウ メッセージの処理方法を DXUT に通知する必要があります。これを実現するには、2 つの方法があります。
DXUT によるイベントの処理
イベントを処理する最も簡単な方法は、1 つの引数を指定して DXUTCreateWindow を呼び出す方法です。
DXUTCreateWindow( L"My New Game" );
DXUT によってウィンドウが作成され、重要なウィンドウ メッセージが自動的に処理されます。
アプリケーションで、DXUT に加えてウィンドウ イベントも処理する場合は、ウィンドウ メッセージが処理される前に呼び出されるコールバック関数を設定する DXUTSetCallbackMsgProc を呼び出します (LPDXUTCALLBACKMSGPROC)。
LRESULT CALLBACK MsgProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
bool* pbNoFurtherProcessing,
void* pUserContext )
{
return 0;
}
このコールバックを実装しないことも選択できます。その場合は、重要なすべてのメッセージが DXUT で処理されます。このコールバックを処理する選択も可能です。その場合は、メッセージと同時に *pbNoFurtherProcessing を TRUE に設定して、DXUT でそのメッセージが処理されないようにします。これを設定するときは、DXUT の正しい動作を妨げる可能性があるため、注意してください。
アプリケーションによるイベントの処理
アプリケーションでウィンドウを作成した場合は、アプリケーションでウィンドウ メッセージを処理することが予想されます。しかし、アプリケーションで、ウィンドウの WindowProc コールバック関数から DXUTStaticWndProc を呼び出すことによって、ウィンドウ メッセージを DXUT に渡すことができます。
次の手順
次の手順は、Direct3D デバイスの作成です。