[DirectX] cos skopalem uzywajac CreateDevice

0

Program kompiluje się, lecz okienku zaraz ucieka, gdyż coś nie tak jest z create device (sprawdzam go za pomocą FAILED i niestety wynik jest pozytywny;/). Poniżej kod programu:

#include <d3dx9.h> 
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
 
//zmienne directx

IDirect3D9* pD3D;
IDirect3DDevice9* pDev;




//nazwa obiektu okna

TCHAR NazwaOkna[]="NazwaOkna";

//procedura zdarzeniowa okna

LRESULT CALLBACK WindowEventProc(HWND hWindow, UINT umsg, WPARAM wParam, LPARAM lParam)
{
		switch(umsg)
		{
		case WM_DESTROY:
			{
				PostQuitMessage(0);
				return 0;
			}
		}
	return DefWindowProc(hWindow,umsg,wParam,lParam);
}

////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
  LPSTR lpszCmdLine,   int nCmdShow) 
{ 

	//rejestracja klasy okna - wpisanie wartosci
		WNDCLASSEX KlasaOkna;

		//wyczyszczenie miejsca na klase
	ZeroMemory(&KlasaOkna, sizeof(WNDCLASSEX));

	KlasaOkna.cbSize=sizeof(WNDCLASSEX);
	KlasaOkna.hInstance=hInstance;
	KlasaOkna.lpfnWndProc=WindowEventProc;
	KlasaOkna.lpszClassName=NazwaOkna;
	KlasaOkna.hCursor=LoadCursor(NULL, IDC_ARROW);
	KlasaOkna.hIcon=LoadIcon(NULL, IDI_APPLICATION);
	KlasaOkna.hbrBackground=(HBRUSH) COLOR_WINDOW;


	//rejestruje klase okna
	RegisterClassEx (&KlasaOkna);

	//tworzenie okna

	HWND Okno;
	Okno = CreateWindowEx(NULL,
						NazwaOkna,
						NazwaOkna,
						WS_OVERLAPPEDWINDOW,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						NULL,
						NULL,
						hInstance,
						NULL);
	ShowWindow (Okno,nCmdShow);



	if(NULL==(pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
	MessageBox(0,"fail_sdk_version","fail0",0);
	D3DDISPLAYMODE d3ddm;
	if(FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
	MessageBox(0,"fail1_get_adapter_mode","fail1",0);
	
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp,sizeof(d3dpp));
	d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
	d3dpp.Windowed = true;
	d3dpp.BackBufferFormat = d3ddm.Format;

	if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Okno,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&pDev)))
		MessageBox(0,"fail_create device","fail2",0);


	//stworzenie obiektu tupu MSG
	MSG msgk;
	msgk.message=NULL;
	//pętla komunikatów
	while (GetMessage(&msgk,NULL,0,0))
	{
		if(PeekMessage(&msgk,NULL,0,0,PM_REMOVE))
		{
			TranslateMessage(&msgk);
			DispatchMessage(&msgk);
		}
		else
		{
			pDev->Clear(0,0,D3DCLEAR_TARGET,0xff00ff00,1,0);
			pDev->BeginScene();
			pDev->EndScene();
			pDev->Present(0,0,0,0);
		}
	}
	pDev->Release();
	pD3D->Release();

	return static_cast<int>(msgk.wParam);

}

Czy to tylko u mnie, czy jednak jest jakiś błąd w kodzie?

0

a u mnie ten fragment kodu działa - okno z zielonym tłem. WindowsXP SP3 + karta ATI

0

działa, ale jednak nie tak jak powinno - okno nie reaguje na zdarzenia poprawnie - masz popsutą pętle komunikatów.

zamien sobie np. na:

        MSG msgk;
        msgk.message=NULL;

        do
        {	
	  if(!PeekMessage(&msgk,NULL,0,0,PM_REMOVE))
	  {
            pDev->Clear(0,0,D3DCLEAR_TARGET,0xff00ff00,1,0);
            pDev->BeginScene();
            pDev->EndScene();
            pDev->Present(0,0,0,0);
	  }
	  else
	  {
	    TranslateMessage(&msgk); 
	    DispatchMessage(&msgk);
	  }
    }while(msgk.message != WM_QUIT);     

1 użytkowników online, w tym zalogowanych: 0, gości: 1