stdafx.hDirectX Include
#include<d3dx9.h> #include <d3d9.h> #include <d3dx9.h> #pragma comment(lib, "d3d9") #ifdef _DEBUG #pragma comment(lib, "d3dx9d") #else #pragma comment(lib, "d3dx9") #endif↑ Stdafx.h 파일에 각 파일 포함하는 내용
1. View 클래스에 객체를 사용하기 위해 멤버변수를 등록
CXXXView.h객체 변수 선언
// 작업입니다. public: //DirectX 9 Var bool m_bComplete; //초기화 완료후 실제 DIRECTX 사용가능 플래그 (생성자에서 FALSE로 초기화) CRect m_rcClient; LPDIRECT3D9 m_pD3D; //D3D 디바이스를 생성할 D3D 객체변수 LPDIRECT3DDEVICE9 m_pd3dDevice; //렌더링에 사용될 D3D 디바이스
2. 객체의 초기화
CXXXView.cppView 생성자 객체 초기화
CXXXView::CXXXView()
{
// TODO: 여기에 생성 코드를 추가합니다.
this->m_bComplete = FALSE;
this->m_pD3D = NULL;
this->m_pd3dDevice = NULL;
}
3. 실제 Initialize -> OnInitialUpdate() 재정의하여 작성
CXXXView.cpp실제 Initialize 부분
void CXXXView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
// 디바이스 생성을 위한 D3D 객체 생성
{
AfxMessageBox(_T("D3D 객체 생성 실패"));
return;
}
//윈도우 싸이즈를 얻는다.
GetClientRect(&this->m_rcClient);
// 디바이스 생성을 위한 구조체
D3DPRESENT_PARAMETERS d3dpp;
// 반드시 구조체를 초기화 한후 사용
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE; //창모드
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //가장 효율적인 SWAP 효과
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // FPS 오류를 방지하기위해 무조건 그리기
d3dpp.BackBufferCount = 1; //백버퍼 개수 설정
d3dpp.BackBufferWidth = this->m_rcClient.Width();
d3dpp.BackBufferHeight = this->m_rcClient.Height();
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //바탕화면 사이즈의 후면버터 생성
// 실제 디바이스를 설정한다.
// 1 디폴트 비디오카드를 사용한다.
// 2 HAL 디바이스를 생성한다.
// 3 정점 처리를 모든 카드에서 지원하는 SW처리로 생성한다.
if(FAILED( this->m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,GetSafeHwnd(),D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&this->m_pd3dDevice) ))
{
AfxMessageBox(_T("D3D 디바이스 생성 실패"));
return;
}
this->m_bComplete = TRUE;
}
4. Render() 함수 구현 View -> 함수 추가하여 사용
CXXXView.cpp실제 렌더링 함수
// 렌더링 함수
void CEx1View::Render(void)
{
if(!this->m_pd3dDevice)
return;
//후면버퍼 클린 블랙으로 채움
this->m_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_RGBA(0,0,0,255),1.0f,0);
if(SUCCEEDED( this->m_pd3dDevice->BeginScene() ))
{
//실제 렌더링 명령수행
//렌더링 종료
this->m_pd3dDevice->EndScene();
}
//버퍼 전환
this->m_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
5. 실제 호출 부분 구현 MFC에서는 App -> OnIdle 함수를 재정의하여 사용한다.
CXXX.cppCXXXApp 클래스의 OnIdle 를 재정의하여 사용
BOOL CEx1App::OnIdle(LONG lCount)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd();
CEx1View *pView = (CEx1View *)pFrame->GetActiveView();
if(pView->m_bComplete)
{
pView->Render();
return TRUE;
}
//return CWinApp::OnIdle(lCount); // 무조건 TRUE를 리턴하여야. 에러가 안남.
}
6. 프로그램 종료시 객체의 소멸
CXXXView.cppView 클래스 PostNCDestroy 함수 재정의해서 사용
void CEx1View::PostNcDestroy()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
// D3D객체의 CleanUP()
this->CleanUp();
CView::PostNcDestroy();
}
// D3D 객체 삭제
void CEx1View::CleanUp(void)
{
//객체 선언때와 반대로 늦게 할당한것부터 해제한다.
if(this->m_pd3dDevice)
this->m_pd3dDevice->Release();
if(this->m_pD3D)
this->m_pD3D->Release();
}
7. 만약 MFC에서 잔상이 남게되면 View 클래스에서 메세지 -> WM_ERASEBKGND 를 재정의한다.
CXXXView.cppWM_ERASEBKGND 재정의 사용
BOOL CEx1View::OnEraseBkgnd(CDC* pDC)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
if(this->m_bComplete)
this->Render();
return false;
// return CView::OnEraseBkgnd(pDC);
}
내가 듣고싶은 음악
내가 들려주고싶은 음악
2012.01.02 15:33:56 (*.87.0.210)
authentic nfl jerseys
they can be used on as wellcoach bags on sale
may most likely needcoach outletonline
bags might as well buycoach outlet online
Many people can likecoach bags outlet
porary fashionablecoach bags outlet
together with lifestylecoach outlet store
well known greatwholesale designer bags
comfortable with itcheap coach
very coolwholesale nfl jerseys
We love to buyauthentic jerseys
Look beautiful bag charm