프로그래밍 관련/게임프로그래밍

[정보] MFC + DXUT 기본적으로 붙인것~ (타일붙인 파일포함)

AlrepondTech 2011. 3. 29. 14:56
반응형
 

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

[정보] MFC + DXUT 기본적으로 붙인것~ (타일붙인 파일포함)

 

dxut_mfc.part1.rar
다운로드

 

 

dxut_mfc.part2.rar
다운로드

 

 

maptool-19(dxut mfc)간단한타일.zip
다운로드

 

 다이렉트 SDK 를 참조해서 DXUT+MFC를 만들어 보았습니다. (구현해 보신분들은 패스 ㅋㅋㅋ)

 간단하게 mfc와 dxut만 있습니다 ^^ (다른분들 만들어 두었던 예제들 붙이다 만 상태의 코드들도 많은..정리가..;;)

 불안정해성  ㅠㅠ 만약 버그나 이상한점 있으면 꼭!!! 말해주세요~ (제가봐도 헤깔리는게 한두가지가;;;)

 

 

버전은  Microsoft DirectX SDK (October 2006) 입니다

 

 

 일단 기본적으로 보실것만 써 놓았습니다.

//---------------------------------------------------------------------

//DxView.Cpp

//---------------------------------------------------------------------

 

//---------------------------------------------------------------------

 

static CDxView* s_pRenderView = NULL; //각각 draw,moveframe등등 관련 동작해주는 랜더뷰

 

 

LRESULT CALLBACK FullScreenWndProc( HWND hWnd, UINT msg, WPARAM wParam,
           LPARAM lParam )
{

 

//..............................코드들

 

 return DefWindowProc( hWnd, msg, wParam, lParam );
}

 

 


void CDxView::OnInitialUpdate() 

// 초기화 부분입니다 여기가 WinMain 이라고 보시면 됩니다


 

    //--------------------------------------------------------
    //DX 전용 초기화 

//....... 코드들

 

//

여기에서 m_wndSplit00.GetPane(0,1)위치의 핸들(Dxview)을 넘겨주고 RegisterClass( &wndClass ); 설정

 m_hwndRenderWindow =pMF->m_wndSplit00.GetPane(0,1)->GetSafeHwnd();

 // Register a class for a fullscreen window
 WNDCLASS wndClass = { CS_HREDRAW | CS_VREDRAW, FullScreenWndProc, 0, 0, NULL,
  NULL, LoadCursor(NULL, IDC_ARROW), (HBRUSH)GetStockObject(WHITE_BRUSH), NULL,
  _T("Fullscreen Window") };
 RegisterClass( &wndClass );
 

 m_hwndRenderFullScreen = CreateWindow( _T("Fullscreen Window"), NULL,
  WS_POPUP, 0, 0, 640, 480,
  GetTopLevelParent()->GetSafeHwnd(), 0L, NULL, this );

 // If we haven't initialized the D3D framework, do so now
 if( !DXUTGetD3DDevice() )
 {
  
 

   //................코드들

 

 

   //

 DXUT 유명한 함수들이져 ㅋㅋ.. 여기서 한번 부르고 DXUTMainLoop() 함수를 부르지 못합니다. (mfc)와 같이 이용하기 때문에

   //

 즉 여기에서는 한번 설정해주고 DXUT의 이함수들의 상위 함수를 다시 불러주어야 합니다.

   //

상위함수부분은 DXUT.cpp에 설정 되어 있습니다. 만약 DXUTSetCallbackFrameRender 로 설정된 OnFrameRenderCB를

   //

계속 불러주고 싶다면 Mfc에 연속적으로 불러주는 랜더링이라불리우는 함수에 DXUTRender3DEnvironment()를 불러주면 됩니다.

   //

다른 방법두 있지만 저는 일단 이대로의 방법을 했습니다. 

   //

그리고 전부 상위에서 안불러도 적용되는 것들은 그냥 나두어두 됩니다, Reset,Lost등등, 하지만 안불러두 괜찮은지 그건 아직

   //

눈여겨 보구 있습니다. 나중을 대비해서 ^^;;

// Set up the DXUT callbacks
   DXUTSetCallbackDeviceCreated( OnCreateDeviceCB );
   DXUTSetCallbackDeviceReset( OnResetDeviceCB );
   DXUTSetCallbackDeviceLost( OnLostDeviceCB );
   DXUTSetCallbackDeviceDestroyed( OnDestroyDeviceCB );
   DXUTSetCallbackMsgProc( MsgProcCB );
   DXUTSetCallbackFrameRender( OnFrameRenderCB );
   DXUTSetCallbackFrameMove( OnFrameMoveCB );


   // Show the cursor and clip it when in full screen
 

  //..............코드들

   }
 }

 pDoc->Compile(); // 

MapToolDoc.cpp의 영역으로 갑니다~ 


}

 

// 

MapTool.cpp부분의 OnIdle함수에서 계속 함수를 불러들입니다.~ 리소스 아이디를 만들어서 ON_COMMAND로

// 

OnRender() 를 계속 불러들입니다~ 이렇게 하는 이유는 DXUTMainLoop()에서 루프를 따로 돌지 않기 때문인것 같습니다

void CDxView::OnRender() 
{
 if( DXUTGetD3DDevice() != NULL )
  DXUTRender3DEnvironment(); // 

아까 말했던 상위 rander위의 불러주는 함수입니다 

}

 

// 

메인에서 부르는 OnFrameRenderCB,CDxView::OnFrameMoveCB 의 등등의 함수들이 있습니다. 이 함수들에서

// 

바로 불러주는 것이 아니고 전역으로 받은 포인터로 다시 각각의 함수도 부릅니다. 포인터 안써도 직접써도 무방할것 같습니다 ^^ 

void CDxView::OnFrameRenderCB( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{

............
  s_pRenderView->OnFrameRender( pd3dDevice, fTime, fElapsedTime );
}


void CDxView::OnFrameMoveCB( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{

.................
  s_pRenderView->OnFrameMove( pd3dDevice, fTime, fElapsedTime );

}

 

//........................................................등등등 비슷한 함수들..............

 

//

메시지프로시져를 받는 부분입니다 .. 이것두 상위 부분을 불러들여 메세지를 계속적으로 보냅니다.



LRESULT CDxView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
 // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.

 DXUTStaticWndProc(m_hWnd,message, wParam, lParam );

 return CScrollView::WindowProc(message, wParam, lParam);
}

 

//---------------------------------------------------------------------

//MapToolDoc.cpp

//---------------------------------------------------------------------

 

//---------------------------------------------------------------------

 

 

//psj DX사용 함수 뷰어에서 init되면 여기서 컴파일 됨

void CMapToolDoc::Compile( bool bForceCompile )
{
 if( !bForceCompile && !m_bNeedToCompile )
  return;

//............................. 코드들

 CDxView* pRenderView = GetRenderView(); 

  //................코드들
}

 

//psj 뷰어를 넘겨준다 ㅁ

CDxView* CMapToolDoc::GetRenderView()
{
 POSITION pos = GetFirstViewPosition();
 while (pos != NULL)
 {
  CView* pView = GetNextView(pos);
  if( pView->IsKindOf( RUNTIME_CLASS( CDxView ) ) )
  {
   return (CDxView*)pView;
  }
 }
 return NULL;
}

 

 

 

//---------------------------------------------------------------------

//MapTool.cpp

//---------------------------------------------------------------------

 

//---------------------------------------------------------------------

 

 

// CMapToolApp 메시지 처리기

 

//

이 함수부분은 지속적으로 함수를 부르는 부분입니다 렌더링같은 함수를 부를때 사용합니다

 

//

DxView.Cpp/*//----------------------------------------------------------------
BEGIN_MESSAGE_MAP(CDxView, CScrollView)
 ........
 ON_COMMAND(ID_VIEW_RENDER, OnRender)
 .......
END_MESSAGE_MAP()
*//-----------------------------------------------------------------

//

여기 아이디를 통해서 지속적으로 불러 들입니다, 메인부분에 이와똑같이 한번 더 거칩니다.

//

만약에 지속적으로 부를 함수가 더있다면 이 부분과 똑같이 활용하면 됩니다.


BOOL CMapToolApp::OnIdle(LONG lCount)
{
 // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
 if( m_bRenderContinuously )
 {
  CWinApp::OnIdle(lCount);
  if( !m_bAppActivated )
   //Sleep(50);  
  m_pMainWnd->SendMessage(WM_COMMAND, ID_VIEW_RENDER); 
  return TRUE; // always request more time
 }
 else
 {
  return CWinApp::OnIdle(lCount);
 }

 

 //return CWinApp::OnIdle(lCount);
}

 

 

 

 

=================================

=================================

=================================

 

 

 

 

//여기까지 읽어 주셔서 감사 합니다~~~

//오늘도 오크 코딩~~~

//코드 보시구 이상하점 찾으시면 꼭 리플 남겨 주시는 센스 +.+ (오크 코딩이라 엄청난 가독성이...;;; 쿨럭)

//좋은 방법 있으신 분들 언제나 충언 해주세요 +.+

 

//압축은 alz,7z으로 알집으로 압축을 풀수 있습니다. (ㅠㅠ 나누어 압축)

 

=================================

=================================

=================================

 

 

반응형