기본 Winmain.cpp 다이렉트x 초기화 포함
#include <Windows.h> #include <d3dx9.h> #pragma comment ( lib, "d3d9.lib" ) #pragma comment ( lib, "d3dx9.lib" ) #pragma comment ( lib, "winmm.lib" ) //사용자 추가 전역 변수 int ActiveFlage = TRUE; // 반복 체크 LPDIRECT3D9 pDX = NULL; // dx객체 LPDIRECT3DDEVICE9 pDevice = NULL; // dx디바이스 D3DPRESENT_PARAMETERS stParam; // 파라메터 구조체 // 사용자 추가 핸들 // 콜백 함수 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); // 다이렉트x 초기화 VOID Device_Init(INT WIDTH, INT HEIGHT, HWND hwnd); int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { static TCHAR szAppName[] = "My Project"; MSG msg; HWND hwnd; WNDCLASSEX wndclass; //HDC hdc; int WIDTH = 800,\ HEIGHT = 600; int roop = 1; bool bWindow = TRUE; // 창모드 체크 wndclass.cbSize = sizeof( wndclass ); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon( NULL, MAKEINTRESOURCE( IDI_APPLICATION ) ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = ( HBRUSH )GetStockObject( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; // 메뉴없음 wndclass.lpszClassName = szAppName; wndclass.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); RegisterClassEx ( &wndclass ); hwnd = CreateWindow( szAppName, szAppName, WS_SYSMENU, ( GetSystemMetrics( SM_CXSCREEN ) - WIDTH ) / 2, ( GetSystemMetrics( SM_CYSCREEN ) - HEIGHT ) / 2, WIDTH, HEIGHT, NULL, NULL, hInstance, NULL ); ShowWindow( hwnd, iCmdShow ); UpdateWindow ( hwnd ); //다이렉트 X 관련 Device_Init(WIDTH, HEIGHT, hwnd); D3DXMATRIX mWorld; // 월드 행렬 D3DXMATRIX mView; // 뷰 행렬 D3DXMATRIX mProj; // 투영 행렬 // 투영행렬 셋팅 D3DXMatrixPerspectiveFovLH ( &mProj, 1.0f, 1.333f, 0.1f, 1000 ); float fCamera_x = 0.0f; float fCamera_y = 0.0f; float fCamera_z = 100.0f; while( roop ) { while( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) != 0 ) { if( GetMessage( &msg, NULL, 0, 0 ) == 0 ) { roop = 0; } TranslateMessage( &msg ); DispatchMessage( &msg ); } if ( ActiveFlage == TRUE ) // 실제 게임 코딩영역 { if ( GetAsyncKeyState(VK_ESCAPE) ) { ActiveFlage = FALSE; roop = NULL; } if ( GetAsyncKeyState( 'W' ) ) { fCamera_z-=0.01f; } if ( GetAsyncKeyState( 'S' ) ) { fCamera_z+=0.01f; } if ( GetAsyncKeyState( 'A' ) ) { fCamera_x+=0.01f; } if ( GetAsyncKeyState( 'D' ) ) { fCamera_x-=0.01f; } if ( GetAsyncKeyState( VK_SPACE ) ) { fCamera_x = 0.0f; fCamera_y = 0.0f; fCamera_z = 100.0f; } // 카메라 셋팅 D3DXMatrixLookAtLH ( &mView, &D3DXVECTOR3(fCamera_x, fCamera_y, fCamera_z), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f) ); pDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0xff000000, 1.0f, 0UL ); // 화면을 검은색으로 지움 pDevice->BeginScene(); // 그리기 시작 pDevice->EndScene(); // 그리기 종료 pDevice->Present( NULL, NULL, NULL, NULL ); // 화면에 뿌려줌 } } pDevice->Release(); // 디바이스 해제 return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch ( iMsg ) { case WM_ACTIVATE: { break; } case WM_CREATE: { ActiveFlage = TRUE; break; } case WM_CLOSE: { ActiveFlage = FALSE; PostQuitMessage(0); break; } case WM_PAINT: break; default: break; } return DefWindowProc( hwnd, iMsg, wParam, lParam ); } VOID Device_Init(INT WIDTH, INT HEIGHT, HWND hwnd) { stParam.AutoDepthStencilFormat = D3DFMT_D24X8; // 깊이 버퍼를 24비트로 만듬 stParam.BackBufferCount = 1; // 1개의 백버퍼를 만듬 stParam.BackBufferFormat = D3DFMT_X8R8G8B8; // 백버퍼 포멧형태 stParam.BackBufferHeight = HEIGHT; // 버퍼 크기 stParam.BackBufferWidth = WIDTH; // 버퍼 크기 stParam.EnableAutoDepthStencil = TRUE; // 스텐실 버퍼 자동생성 사용 stParam.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; // 시스템 자체가 백버퍼를 건딜 수 있게 한다 ( 하지만 작동 안함 ) stParam.Windowed = TRUE; // 창모드로한다 stParam.hDeviceWindow = hwnd; // 디바이스가 어느 윈도우랑 연결될지 체크 윈도우 핸들을 넣어준다 stParam.SwapEffect = D3DSWAPEFFECT_DISCARD; // 백버퍼에서 프론트버퍼로 가져올 방식 stParam.FullScreen_RefreshRateInHz = 0; // 모니터 주사율 창모드는 0 stParam.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // 프레젠트 명령어가 호출되면 바로 프론트 버퍼에 뿌림 stParam.MultiSampleQuality = D3DMULTISAMPLE_NONE; // 멀티셈플링 옵션으로 안씀(느려서) pDX = Direct3DCreate9( D3D_SDK_VERSION ); pDX->CreateDevice(0, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &stParam, &pDevice ); // 맨앞 0번은 몇번째 그래픽 카드를 쓸것인지 0번이 현재 모니터에 뿌려주고있는 그래픽카드 }
이 소스코드는 기본적인 윈도우창을 띄움과 다이렉트x를 초기화 하는 코드이다.
에러가 나지 않으려면 다이렉트X JUNE 2010 SDK를 설치해야 하며 추가 라이브러리와 포함디렉토리를 설정해주어야한다.
또한 유니코드가 아닌 멀티바이트 형식으로 해야 에러가 나지 않을것이다.