3

D3DImage サンプルを SharpDX を使用して純粋な C#に変換しようとしています。Direct3D では、初期化に HWND が必要です。C++ での方法は次のとおりです。

WNDCLASSEX g_wc = { sizeof(WNDCLASSEX), CS_CLASSDC, nullptr, 0L, 0L,
      GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"Foo", nullptr };
HWND g_windowHandle;

// Create invisible window to get HWND
RegisterClassEx(&g_wc);
g_windowHandle = CreateWindow(L"Foo", L"Foo", WS_OVERLAPPEDWINDOW, 
    0, 0, 0, 0, nullptr, nullptr, nullptr, nullptr);

    // then eventually we can create the device
Direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d);
m_d3d->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_windowHandle,
    vertexProcessing | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE,
    &d3dpp, nullptr, &m_d3dDevice);

C# でこのダミー HWND を取得する最良の方法は何でしょうか? メイン ウィンドウの HWND とは異なる必要があります。私のアプリケーションは WPF プロジェクトです。

4

1 に答える 1

2

のドキュメントには、ウィンドウモードで構造内のプレゼンテーションが設定されている場合IDirect3D9Ex::CreateDeviceEx、パラメーターはオプションであると記載されています(後期編集: おっと、空白にすることはできません)HWNDHWNDD3DPRESENT_PARAMETERS

IDirect3D9Ex::CreateDeviceEx @ MSDNから

hFocusWindow [in]
型: HWND
フォーカス ウィンドウは、アプリケーションがフォアグラウンド モードからバックグラウンド モードに切り替わったときに Direct3D に警告します。フルスクリーン モードの場合、指定されたウィンドウはトップレベル ウィンドウでなければなりません。ウィンドウ モードの場合、pPresentationParameters の hDeviceWindow メンバーが有効な非 NULL 値に設定されている場合にのみ、このパラメーターを NULL にすることができます。

D3DPRESENT_PARAMETERS 構造体 @ MSDN

使用するウィンドウ ハンドルを取得するには、通常の .NET フレームワーク メソッドを介して別のトップレベル ウィンドウを作成し、Win32 メソッド呼び出しで動作を実行する代わりに、そのウィンドウ ハンドルを取得します。

WPF が提供するハンドルを使用できない場合 (Hans Passant のコメントによる)、ダミーの Windows フォームを作成して非表示のウィンドウとしてインスタンス化し、代わりにそのハンドルを使用することもできます。

WindowInteropHelper (WPF) @ MSDN

Control.Handle (Windows フォーム) @ MSDN

脚注: SharpDX または既存の Viewport3D の何らかのメカニズムがこの方法で Direct3D9 を使用することと競合しない限り、既存の WPF メイン ウィンドウ ハンドルはおそらく問題ありません。

3-D グラフィックスの概要 (WPF) @ MSDN
Viewport3D クラス (WPF) @ MSDN

于 2013-01-29T22:59:30.630 に答える