DirectX bereich in C++/CLI panel
-
HI! Versuche gerade in einem Panel einen DirectX Fenster zu erstellen. Dafür habe ich die funktionen init, render, clean. Anscheinend wird die init Funktion fehlerfrei durchlaufen, jedoch in der render und clean funktion gibt er mir eine Null Reference Exception zurück. Hier mal der Code:
Form1.hprivate: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { d3ddev = new d3ddevice(); d3ddev->init_D3D(reinterpret_cast<HWND>(panel1->Handle.ToPointer())); } private: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) { d3ddev->clean_D3D(); } private: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { d3ddev->render_frame(); panel1->Refresh(); }
und die d3ddevice class
void d3ddevice::init_D3D(HWND hWnd) { int screen_width = GetSystemMetrics(SM_CXSCREEN); int screen_height = GetSystemMetrics(SM_CYSCREEN); 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 = false; // program windowed, not fullscreen d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames d3dpp.hDeviceWindow = hWnd; // set the window to be used by Direct3D d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; // set the back buffer format to 32-bit d3dpp.BackBufferWidth = screen_width; // set the width of the buffer d3dpp.BackBufferHeight = screen_height; // set the height of the buffer // create a device class using this information and the info from the d3dpp struct d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev); } void d3ddevice::render_frame(void) { // clear the window to a deep blue d3ddev->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); // Begin the scene if( SUCCEEDED( d3ddev->BeginScene() ) ) // begins the 3D scene //todo : fill in rendering stuff d3ddev->EndScene(); // ends the 3D scene d3ddev->Present(NULL, NULL, NULL, NULL); // displays the created frame on the screen } // clean up Direct3D and COM void d3ddevice::clean_D3D(void) { d3ddev->Release(); // close and release the 3D device d3d->Release(); // close and release Direct3D }
Jemand eine Ahnung woran das liegt? Oder einen tipp was ich anders machen sollte????
Gruss
Littles
-
Ich vermute mal dein d3ddev wird null sein, wahrscheinlich weil CreateDevice() fehlschlägt...