디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

다람쥐님... 클래스여(조공짤첨부)

(218.152) 2010.08.12 13:33:39
조회 289 추천 0 댓글 11


#pragma once
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment( lib, "winmm.lib" )
#pragma comment( lib, "d3d9.lib" )

#ifndef SAFE_DELETE
#define SAFE_DELETE(p)       { if (p) { delete (p);     (p)=NULL; } }
#endif
#ifndef SAFE_DELETE_ARRAY
#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p);   (p)=NULL; } }
#endif
#ifndef SAFE_RELEASE
#define SAFE_RELEASE(p)      { if (p) { (p)->Release(); (p)=NULL; } }
#endif

class iDXApp
{
protected:
        HWND m_hWnd;
        bool m_bWindowed;
        int m_savedWidth;
        int m_savedHeight;
        LONG m_savedWinStyle;
        char* m_title;
        float m_fElapsedTime;
        float m_fFPS;
        float m_fLastTime;
        float m_fSecCount;
        int m_frameCount;
        LPDIRECT3D9 m_pD3D;
        LPDIRECT3DDEVICE9 m_pDevice;
        D3DPRESENT_PARAMETERS m_d3dpp;
public:
        iDXApp(void);
        virtual ~iDXApp(void);
        HRESULT Init(const char* windowTitle, int width, int height);
        int Run();
        //
        HWND GetHWND(){ return m_hWnd; }
        float GetFPS(){ return m_fFPS; }
        LPDIRECT3DDEVICE9 GetDevice(){ return m_pDevice; }
        HRESULT ToggleFullScreen();
public:
        //오버라이드 해야할 함수
        virtual LRESULT MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)=0;
protected:
        virtual HRESULT OnInitObjects(LPDIRECT3DDEVICE9 pDevice)=0;
        virtual HRESULT OnInitResetObjects(LPDIRECT3DDEVICE9 pDevice){ return S_OK; }//D3DPOOL_DEFAULT로 생성되는 객체
        virtual HRESULT OnFrameMove(float elapsedTime)=0;
        virtual HRESULT OnDraw(LPDIRECT3DDEVICE9 pDevice)=0;
        virtual HRESULT OnDeleteResetObjects(LPDIRECT3DDEVICE9 pDevice){ return S_OK; }
        virtual HRESULT OnDeleteObjects(LPDIRECT3DDEVICE9 pDevice)=0;
protected:
        //내부 사용함수
        virtual void _UpdateFrameInfo();
        virtual void _FinalCleanUp();
        virtual HRESULT _HandleDeviceLost();
        virtual HRESULT _ResetDevice(D3DPRESENT_PARAMETERS* d3dpp);
        //friend LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
};


//cpp파일
#include "iDXApp.h"
#include <assert.h>

static iDXApp* s_pDXApp = NULL;

iDXApp::iDXApp(void)
{
        s_pDXApp = this;        //프로시저 연결용
        m_hWnd = NULL;
        m_savedWidth = 0;
        m_savedHeight = 0;
        m_savedWinStyle = 0;
        m_bWindowed = true;
        m_title = NULL;
        m_fElapsedTime = 0.f;
        m_fFPS = 0.f;
        m_fLastTime = 0.f;
        m_fSecCount = 0.f;
        m_frameCount = 0;
        m_pD3D = NULL;
        m_pDevice = NULL;
        ZeroMemory(&m_d3dpp, sizeof(m_d3dpp));
}

iDXApp::~iDXApp(void)
{
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch(message)
        {
                /*
        case WM_PAINT:
                s_pDXApp->_UpdateFrameInfo();
                s_pDXApp->OnDraw(s_pDXApp->GetDevice());
                break;
                */
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
        //iDXApp를 상속받은 프로시저에서 메세지 처리
        return s_pDXApp->MsgProc(hWnd, message, wParam, lParam);
}

HRESULT iDXApp::Init( const char* windowTitle, int width, int height )
{
        //윈도우 생성
        m_hWnd = NULL;
        m_title = new char[strlen(windowTitle)+1];
        strcpy(m_title, windowTitle);
        WNDCLASS    wndClass;       // structure used to register window class
        // Initialise WNDCLASS structure.
        wndClass.style          = 0;
        wndClass.lpfnWndProc    = WndProc;
        wndClass.cbClsExtra     = 0;
        wndClass.cbWndExtra     = 0;
        wndClass.hInstance      = GetModuleHandle(0);
        wndClass.hIcon          = LoadIcon(0, IDI_WINLOGO);
        wndClass.hCursor        = LoadCursor(0, IDC_ARROW);
        wndClass.hbrBackground  = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
        wndClass.lpszMenuName   = 0;
        wndClass.lpszClassName  = m_title;
        RegisterClass(&wndClass);
        // get size of window to use so that client area is desired size
        m_savedWidth = width;
        m_savedHeight = height;
        RECT wnd_size = {0,0,width,height};
        AdjustWindowRect(&wnd_size, WS_OVERLAPPEDWINDOW, FALSE);

        // create new window
        m_hWnd = CreateWindow(m_title, m_title,
                WS_OVERLAPPEDWINDOW,
                00,
                wnd_size.right - wnd_size.left,
                wnd_size.bottom - wnd_size.top,
                00, GetModuleHandle(0), 0);

        m_savedWinStyle = GetWindowLong(m_hWnd, GWL_STYLE);

        //direct X
        m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);

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

                m_d3dpp.BackBufferFormat = d3ddm.Format;
                m_d3dpp.hDeviceWindow    = m_hWnd;
                m_d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
                m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
                m_d3dpp.Windowed         = m_bWindowed;

                //디바이스 생성
                if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd,
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_d3dpp, &m_pDevice)))
                {
                        return E_FAIL;
                }
        }

        return S_OK;
}

int iDXApp::Run()
{
        //윈도우를 보이게 한다
        ShowWindow(m_hWnd, SW_SHOWDEFAULT);

        //3d객체 초기화 함수 호출
        OnInitObjects(m_pDevice);
        //D3DPOOL_DEFAULT 객체 생성
        OnInitResetObjects(m_pDevice);

        //메시지 루프 수행
        MSG msg;
        ZeroMemory(&msg, sizeof(msg));
        HRESULT hr = S_OK;
        while(msg.message != WM_QUIT)
        {
                if(PeekMessage(&msg, 000, PM_REMOVE))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
                else
                {
                        _UpdateFrameInfo();
                        OnFrameMove(m_fElapsedTime);
                        hr = OnDraw(m_pDevice);
                        if(FAILED(hr))
                        {
                                if(FAILED(_HandleDeviceLost()))
                                {
                                        Sleep(500);
                                        if(FAILED(_HandleDeviceLost()))
                                                assert(0&&"디바이스 에러");
                                }
                        }
                }
        }
        //D3DPOOL_DEFAULT로 할당된것 해제
        OnDeleteResetObjects(m_pDevice);
        //3d 객체 해제
        OnDeleteObjects(m_pDevice);
        //디바이스 및 D3D해제
        _FinalCleanUp();

        return 0;
}


HRESULT iDXApp::_HandleDeviceLost()
{
        HRESULT hr;
        hr = m_pDevice->TestCooperativeLevel();
        //복구 가능한경우
        if(hr == D3DERR_DEVICENOTRESET)
        {
                return _ResetDevice(&m_d3dpp);
        }
        else if(hr == D3DERR_DEVICELOST)
        {
                OnDeleteResetObjects(m_pDevice);
                SAFE_RELEASE(m_pDevice);
                //디바이스 생성
                if(SUCCEEDED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd,
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_d3dpp, &m_pDevice)))
                {
                        return OnInitResetObjects(m_pDevice);
                }
                else
                {
                        //TODO:에러메세지
                        assert(0);
                        return E_FAIL;
                }
        }
}

//프레임 정보 업데이트
void iDXApp::_UpdateFrameInfo()
{
        m_frameCount++;
        float fNowTime = timeGetTime()/1000.f;
        m_fElapsedTime = fNowTime - m_fLastTime;
        m_fSecCount += m_fElapsedTime;

        if( m_fSecCount >= 1.f )
        {
                m_fFPS = (float)m_frameCount/m_fSecCount;
                m_fSecCount = 0.f;
                m_frameCount = 0;
        }

        m_fLastTime = fNowTime;
}

void iDXApp::_FinalCleanUp()
{
        SAFE_RELEASE(m_pDevice);
        SAFE_RELEASE(m_pD3D);
        if(m_hWnd)
        {
                DestroyWindow(m_hWnd);
                m_hWnd = 0;
        }
        UnregisterClass(m_title, GetModuleHandle(0));
        SAFE_DELETE_ARRAY(m_title);
}

HRESULT iDXApp::ToggleFullScreen()
{
        D3DPRESENT_PARAMETERS d3dpp = m_d3dpp;
        if(m_bWindowed)
        {
                m_d3dpp.BackBufferHeight = GetSystemMetrics( SM_CYSCREEN );
                m_d3dpp.BackBufferWidth = GetSystemMetrics( SM_CXSCREEN );
                m_bWindowed = false;
                m_d3dpp.Windowed = m_bWindowed;
                if(SUCCEEDED(_ResetDevice(&m_d3dpp)))
                {
                        SetWindowLong(m_hWnd, GWL_STYLE, WS_VISIBLE);
                        /*SetWindowPos(m_hWnd, HWND_TOP, 0, 0, 0, 0,
                                SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);*/
                        return S_OK;
                }
        }
        else
        {
                m_d3dpp.BackBufferHeight = m_savedHeight;
                m_d3dpp.BackBufferWidth = m_savedWidth;
                m_bWindowed = true;
                m_d3dpp.Windowed = m_bWindowed;
                if(SUCCEEDED(_ResetDevice(&m_d3dpp)))
                {
                        SetWindowLong(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);

                        RECT rc = {0,0,m_savedWidth,m_savedHeight};
                        AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
                        SetWindowPos(m_hWnd, HWND_NOTOPMOST, 00, rc.right-rc.left, rc.bottom-rc.top,
                                SWP_FRAMECHANGED | /*SWP_NOMOVE | SWP_NOSIZE | */SWP_SHOWWINDOW);

                        //RECT rct = {0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN )};
                        //InvalidateRect(m_hWnd, &rct, TRUE);
                        //UpdateWindow(m_hWnd);
                        return S_OK;
                }
        }
        //실패한경우
        m_bWindowed = !m_bWindowed;
        m_d3dpp = d3dpp;
        return E_FAIL;
}

HRESULT iDXApp::_ResetDevice(D3DPRESENT_PARAMETERS* d3dpp)
{
        if(SUCCEEDED(OnDeleteResetObjects(m_pDevice)))
        {
                if(SUCCEEDED(m_pDevice->Reset(d3dpp)))
                {
                        return OnInitResetObjects(m_pDevice);
                }
        }
        return E_FAIL;
}

ToggleFullScreen함수 호출시 잔상 남는 문제가 있어서... 어디가 문제를 일으킨걸까요...

추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 경제관념 부족해서 돈 막 쓸 것 같은 스타는? 운영자 24/05/13 - -
211188 안드로이드 코딩할때 중요하게 여겨야 되는게 있다면 뭐가 있을까? [3] whatugonnado갤로그로 이동합니다. 10.10.07 108 0
211187 장난스럽게 확산되는 음모론 드립의 위험성. [15] 한마디(61.77) 10.10.07 250 0
211186 열도의 쑈프로 rntjr갤로그로 이동합니다. 10.10.07 99 0
211185 오늘의 마지막 드립.. [1] 어떡해갤로그로 이동합니다. 10.10.07 94 0
211184 개샓기 전문대생이였어? dㅇ(211.55) 10.10.07 136 0
211182 프갤님들 도와주세요. [13] Stygia갤로그로 이동합니다. 10.10.07 187 0
211181 비주얼 스튜디오 구하고싶은데 [9] 불타징(121.144) 10.10.07 141 0
211180 한때 여신으로 생각했던 마츠나카 아야키짜응..... [2] Rhea갤로그로 이동합니다. 10.10.07 212 1
211179 C언어 이제 함수 드갈라 하는데 [4] 스패츠나츠갤로그로 이동합니다. 10.10.07 129 0
211178 으으음 교접하고 싶다.... [5] Rhea갤로그로 이동합니다. 10.10.07 194 0
211175 이것도 취향 존중? [5] 스패츠나츠갤로그로 이동합니다. 10.10.07 124 0
211173 옛날 대학생이랑 요즘 대학생이랑 차이가 느므 난다. [3] 이건뭐야(168.131) 10.10.07 234 0
211172 홈런배틀이라는 어플 아는사람은 본다. [4] 임베디드(112.150) 10.10.07 383 0
211171 간지쩌는 횽아들아 저 좀 살려주세여 ㅠ,ㅠ [1] 꼬꼼화(58.140) 10.10.07 114 0
211170 플밍 고수횽들 간단한 콘솔 그래픽좀 가르쳐주세여 [6] 플밍 초보(220.68) 10.10.07 90 0
211166 이런거 솔직히 필요함?? [14] 스패츠나츠갤로그로 이동합니다. 10.10.07 172 0
211164 연산자 관련 질문. [16] 스패츠나츠갤로그로 이동합니다. 10.10.07 112 0
211163 제가 하려는 일이 시스템 프로그래머? [3] 스패츠나츠갤로그로 이동합니다. 10.10.07 123 0
211161 c 처음으로 배우려고 하는데 [1] ㅁㄴㅇㄹㄴㅇ(122.39) 10.10.07 75 0
211160 질문좀 횽들! [3] 횽들(221.160) 10.10.07 46 0
211158 여자친구 집착이 너무 심한가.. [4] 히히힝(58.142) 10.10.07 264 0
211157 삼성이다 [1] Ordinary Day갤로그로 이동합니다. 10.10.07 152 0
211155 원수를 갚았다. [2] Ordinary Day갤로그로 이동합니다. 10.10.07 103 0
211154 자바 질문좀 키리키리키리갤로그로 이동합니다. 10.10.07 41 0
211153 아파치톰캣으로 서버세울때 질문! [7] Lastiverse갤로그로 이동합니다. 10.10.07 88 0
211152 근데 연회색 솔리드 화면인데 foriequal0갤로그로 이동합니다. 10.10.06 32 0
211151 횽들 윈7에서 비쥬얼스튜디오 안돌아가요? [15] 적이되고싶은가갤로그로 이동합니다. 10.10.06 249 1
211150 증감연산자에 대해서좀 알려주실분. [7] 머시깽이(211.238) 10.10.06 61 0
211149 우와 프갤 훃아들 왜들 이렇게 똑똑한거야... 대단하네... 안철수빠(121.182) 10.10.06 70 0
211148 파이썬 공부하려는데요... [4] ㄹㅈㄹ(119.196) 10.10.06 136 0
211147 오늘 강연에서 커뮤니티중요하다는 얘기가 반이였음. [3] 시크한훈남갤로그로 이동합니다. 10.10.06 83 0
211146 클래스기본소스좀봐줘횽들 [5] 시크한훈남갤로그로 이동합니다. 10.10.06 99 0
211145 티맥스코어(TmaxCore) 잘 아는 횽 있음??? [1] ㅂㅈㄷㄹ(143.248) 10.10.06 305 0
211144 혹시 어셈블리 잘하는 횽들있어? [5] 컴공지망생(220.116) 10.10.06 128 0
211143 오늘 알아낸 안드로이드 개발에 관한 신박한 사실 [2] ㄴㅇㄹ(110.12) 10.10.06 112 0
211141 누가 와서 사장 죽빵 한대만 갈려주라 [1] ㄴㅇㄹ(110.12) 10.10.06 86 0
211140 이상적인 국가예산정책에 대해 그려봤습미당 [3] 원산폭격갤로그로 이동합니다. 10.10.06 110 0
211139 비주얼 베이직 6.0 질문점 [1] 풀어줘갤로그로 이동합니다. 10.10.06 40 0
211138 횽들 나좀 구해주세요 ㅠㅠㅠㅠㅠ 컴터학생(121.163) 10.10.06 134 0
211137 형들 아그c 값을 확인 했는데도 인수없이 컴파일 했을때 디버그에서 에러나 [3] 회색사과갤로그로 이동합니다. 10.10.06 41 0
211136 안드로이드좀 하는 횽아들 소환 [1] 삼다수(61.252) 10.10.06 49 0
211134 디씨 접속이 계속 지연되네요 [1] SIGSEGV갤로그로 이동합니다. 10.10.06 53 0
211132 디씨 광역삭제 쩌는구만. [3] Ordinary Day갤로그로 이동합니다. 10.10.06 70 0
211131 2진수 10101010 (부호비트를 고려할때) 10진수로 바꺼주세요 ㅠㅠ [6] 플밍초보(61.109) 10.10.06 289 0
211130 리눅스에서 gcc 컴파일 옵션 질문이요.ask [2] 자슬아치(123.98) 10.10.06 52 0
211129 나 오늘 안철수교수님과 토크쇼 그거갔다 왔는데 좋은거 갈켜드림. 시크한훈남갤로그로 이동합니다. 10.10.06 94 0
211128 오늘치 강의도 끝(BGM) [3] Rei@디씨갤로그로 이동합니다. 10.10.06 71 0
211127 dev-c++ 컴파일러 쓰는데 [3] 어게인(124.153) 10.10.06 135 0
211126 지금 티아라의 누군가 닮은 몸캠 영상 떠서 난리났음 ㅋㅋㅋ [3] 야메떼♥갤로그로 이동합니다. 10.10.06 164 0
211125 순대국밥 먹고싶다 [8] prismatic갤로그로 이동합니다. 10.10.06 69 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2