2007년 4월 19일 목요일

Using DirectX with MFC

우선 “stdafx.h”에

// Direct3D includes
#include <d3d9.h>
#include <d3dx9.h>
#include <dxerr.h>

// DirectSound includes
#include <mmsystem.h>
#include <mmreg.h>
#include <dsound.h>

#pragma comment( lib, "dxerr.lib" )
#pragma comment( lib, "dxguid.lib" )
#if defined(DEBUG) || defined(_DEBUG)
#pragma comment( lib, "d3dx9d.lib" )
#else
#pragma comment( lib, "d3dx9.lib" )
#endif
#pragma comment( lib, "d3d9.lib" )
#pragma comment( lib, "winmm.lib" )
#pragma comment( lib, "comctl32.lib" )

를 추가한다. 그때 그때 필요한 헤더파일과 라이브러리를 포함해야 한다.

그리고 XXXView.h 파일을 열고 아래 내용들을 추가한다.

CRect m_rectClient;         // Client window size
IDirect3D9* m_pD3D;         // The IDirect3D9 interface
IDirect3DDevice9* m_pd3dDevice; // D3D Device
D3DPRESENT_PARAMETERS m_d3dpp;  // The present parameters.
bool m_bReady;          // Is DX9 ready to render?
void Render();          // Render


XXXView.cpp 파일을 열고 OnInitialUpdate() 함수를 override하고 아래 내용을 추가한다.

void XXXView::OnInitialUpdate()
{
    CView::OnInitialUpdate();

    // TODO: Add your specialized code here and/or call the base class
    HWND hDevice, hFocus; 
HRESULT hr; 

hDevice = GetSafeHwnd(); 
hFocus  = GetTopLevelParent() ->GetSafeHwnd(); 

GetClientRect(&m_rectClient); 

// Create Direct3D object
        m_pD3D = Direct3DCreate9(D3D_SDK_VERSION); 

D3DDISPLAYMODE d3ddm; 
m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm); 

// D3DPRESENT_PARAMETERS 구조체의설정
::ZeroMemory(&m_d3dpp, sizeof(m_d3dpp)); 
m_d3dpp.Windowed            = TRUE; 
m_d3dpp.BackBufferCount     = 1; 
m_d3dpp.SwapEffect          = D3DSWAPEFFECT_DISCARD; 
m_d3dpp.EnableAutoDepthStencil  = TRUE; 
m_d3dpp.AutoDepthStencilFormat  = D3DFMT_D16; 
m_d3dpp.hDeviceWindow       = hDevice; 
m_d3dpp.BackBufferWidth     = m_rectClient.Width(); 
m_d3dpp.BackBufferHeight        = m_rectClient.Height(); 
m_d3dpp.BackBufferFormat        = d3ddm.Format
m_d3dpp.Flags                 |= D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

// 디바이스작성
hr = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 
D3DDEVTYPE_HAL, 
hFocus, 
D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
&m_d3dpp, 
&m_pd3dDevice);

    m_pd3dDevice->SetDialogBoxMode(TRUE);
    m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

m_bReady = TRUE;
}

Render() 함수는 아래와 같다.

void CeConsoleView::Render()
{
m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    if(SUCCEEDED(m_pd3dDevice->BeginScene())) 
    {
        m_pd3dDevice->EndScene(); 
    }

    m_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

마지막으로 OnDraw() 함수에 아래 내용을 추가하면 준비는 완료

    // TODO: add draw code for native data here
    if( m_bReady )
        Render();


댓글 없음: