2012-01-05 9 views
1

DirectX9デバイスをC++ Windowsフォームに統合する必要があります。どうすればいいですか?Windowsフォーム内のDirectX9

は、一方では私は

HWND hWnd; 
WNDCLASSEX wc; 

ZeroMemory(&wc, sizeof(WNDCLASSEX)); 

wc.cbSize = sizeof(WNDCLASSEX); 
wc.style = CS_HREDRAW | CS_VREDRAW; 
wc.lpfnWndProc = WindowProc; 
wc.hInstance = hInstance; 
wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
wc.lpszClassName = "WindowClass"; 

RegisterClassEx(&wc); 

hWnd = CreateWindowEx(NULL, "WindowClass", "Engine", 
         WS_OVERLAPPEDWINDOW, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 
         NULL, NULL, hInstance, NULL); 

ShowWindow(hWnd, nCmdShow); 

m_D3D = Direct3DCreate9(D3D_SDK_VERSION); 

D3DPRESENT_PARAMETERS d3dpp; 

ZeroMemory(&d3dpp, sizeof(d3dpp)); 
d3dpp.Windowed = TRUE; 
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
d3dpp.hDeviceWindow = hWnd; 
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; 
d3dpp.BackBufferWidth = SCREEN_WIDTH; 
d3dpp.BackBufferHeight = SCREEN_HEIGHT; 
d3dpp.EnableAutoDepthStencil = TRUE; 
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 

// creates device 
m_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_Device); 

....私のDirectXアプリケーションを持って、一方で私は、私がこれをマージするにはどうすればよい私のWindowsフォーム

Application::EnableVisualStyles(); 
Application::SetCompatibleTextRenderingDefault(false); 
Application::Run(gcnew Form1()); 

を得ましたか。

+0

実際にウィンドウが表示されるまでデバイスを作成したくないことを覚えておいてください。 WindowsXPではこれが問題になります。だから、通常はOnShownとinitをオーバーライドします。 Windows Vista-7では、リソースを正しく処理するため、D3D9_EXデバイスを使用することを忘れないでください。 – zezba9000

答えて

1

このソースからいくつかの情報:http://www.codeproject.com/KB/directx/Irrational_Thinking.aspx

//File: DX9Form.cpp 
#include "DX9Form.h" 

using namespace Forms_DX9; 
using namespace globals; 

void DX9Form::initD3D(HWND hHandle) 
{ 

    globals::d3d = Direct3DCreate9(D3D_SDK_VERSION); 
    // create the Direct3D interface 

    D3DPRESENT_PARAMETERS d3dpp; 
    // create a struct to hold various device information 

    ZeroMemory(&d3dpp, sizeof(d3dpp)); // clear out the struct for use 

    d3dpp.Windowed = true; // program windowed, not fullscreen 

    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames 

    d3dpp.hDeviceWindow = hHandle; 
    // set the window to be used by Direct3D 

    // create a device class using this information 
    // and information from the d3dpp stuct 
    globals::d3d->CreateDevice(D3DADAPTER_DEFAULT, 
      D3DDEVTYPE_HAL, 
      hHandle, 
      D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
      &d3dpp, 
      &globals::d3ddev); 
} 

void DX9Form::render(void) 
{ 

    // clear the window to a deep blue 
    globals::d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, 
           D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); 
    globals::d3ddev->BeginScene(); // begins the 3D scene 

    // do 3D rendering on the back buffer here 
    globals::d3ddev->EndScene(); // ends the 3D scene 
    globals::d3ddev->Present(NULL, NULL, NULL, NULL); 
    // displays the created frame 
} 
1

フォームのOnLoad()メソッドのオーバーライドまたはLoadイベントハンドラであなたのDirectXコードを初期化することができます。

protected: 
    void OnLoad(EventArgs^ e) override { 
     HWND hWnd = (HWND)(void*)this->Handle; 
     YourDirectXInitializeFunction(hWnd); 
    } 
+0

私はそのアプローチを試みましたが、私は私のdirectX cppコードが実行されていないため、管理していません:( – Schifty

+0

C++/CLIはネイティブコードを呼び出すのに問題はありません。あなたは間違ったことをしていますが、パンくずリストを何も推測していません。エラーメッセージでもありません。あなたの質問を更新してください。 –

関連する問題