디시인사이드 갤러리

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

갤러리 본문 영역

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

(218.152) 2010.08.12 13:33:39
조회 298 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
343776 컴공 형님들 조언좀 해주세요 [4] ㅔㄱ(175.209) 13.01.23 202 0
343774 여친생겼다 질문받는다 [7] ㄱㄷㄱㄱ(211.208) 13.01.23 178 0
343772 안드에서 JNI쓸때 시그원 왜쓰는지 몰랐는데 리눅스를 하다가 보니 GCC [2] ㅁㄴㅇㄻㅇ(114.71) 13.01.23 87 0
343771 HxD 랑 OllyDbg 를 회사 컴에다가 깔아도 됄까? [3] 천국거지갤로그로 이동합니다. 13.01.23 80 0
343770 C++표준도 계속 업데이트 되나요? [6] 금고래갤로그로 이동합니다. 13.01.23 104 0
343769 형들 나 좆고딩이긴한데 [10] ㅇㅇ(124.197) 13.01.23 225 1
343767 트라인 이란 게임 있는데 이게임 그래픽 질문좀... [3] 1(116.121) 13.01.23 114 0
343766 공군 전자계산특기 아는 형들 있엉? [1] 뇌파갤로그로 이동합니다. 13.01.23 65 0
343765 밑에 더블포인터 답변 ㅁㄴㅇ(59.25) 13.01.23 74 0
343764 C언어 더블포인터 관련 질문좀 받아주세요 [19] 네로시엔갤로그로 이동합니다. 13.01.23 287 0
343762 자라 정수정•‿•갤로그로 이동합니다. 13.01.23 53 1
343760 자바스크립트라는 새끼가 신기하다. [2] 힝아(115.161) 13.01.23 212 0
343758 안드로이드 아이폰 네이티브 어렵냐? [9] 주세혁드라이브갤로그로 이동합니다. 13.01.23 209 1
343755 형들 총체적 질문점 헤헿 [10] 납땜왕(14.32) 13.01.22 216 0
343754 아오 c언어ㅡㅡ [2] 할마마갤로그로 이동합니다. 13.01.22 129 0
343752 그린컴퓨터아트학원 이런곳 가면되나? [3] ㅁㄴㅇㄹ(124.146) 13.01.22 880 0
343751 매프레임 if문으로 체크 안하려면 어떻게함? [2] A(168.126) 13.01.22 64 0
343750 자바스크립트에서 Array String간 변환법 [4] ㅁㄴㅇ(59.25) 13.01.22 162 0
343749 자바나 C언어 학원에서 배우고 취업가능? [14] ㅁㄴㅇㄹ(124.146) 13.01.22 375 0
343747 안녕하세연 멘탈붕괴_갤로그로 이동합니다. 13.01.22 32 0
343744 리눅스 종류가 많은데.. [15] dd(210.94) 13.01.22 239 0
343743 아오 씨발 Python 이것도 언어라고.. [5] ㅂㅂ(123.129) 13.01.22 259 2
343741 안드로이드에 여자팬티보기나 별저질같은앱있잖아 [2] 보물같은인성갤로그로 이동합니다. 13.01.22 184 1
343740 어디 키넥트 관련된 정보 모아둔 사이트 없나? [11] 취직할수있나(116.123) 13.01.22 135 0
343739 안드로이드 기종 젤인기있는게뭐임 세계적으로? [6] 보물같은인성갤로그로 이동합니다. 13.01.22 142 0
343738 근데 디씨같은 대형사이트는 원래 기본적으로 글지워도 6개월인가 디비보관해 [2] lol백과사전(182.172) 13.01.22 160 1
343737 형들 FTP 서버에 있는 이 폴더들 사용처 좀 알려줘 [4] 안뇽해(182.218) 13.01.22 100 0
343736 오늘 어떤놈이 이걸 영단어로 어떻게 표현하는지 물어봤다 [1] Kyle(220.244) 13.01.22 139 0
343733 형들ㅠㅠ UDK 게임개발중인데 [4] sadasd(204.93) 13.01.22 115 0
343732 에어로홍님.. 경찰서에서 모니터링 한다는데 어케 줍니까... [1] 상상(175.123) 13.01.22 90 0
343730 오늘의 자바 nom nom 3탄. 이클립스설치방법.txt [2] Kyle(220.244) 13.01.22 96 0
343729 ㅅㅂ 일부러 악플달라케도 맘이 아파서 안되겟다 돌대갈(211.36) 13.01.22 66 0
343728 자바스크립 vs 자바의 .split.txt [5] Kyle(220.244) 13.01.22 167 0
343727 애들 c언어를 알려주게 됬어요 ㅜㅜ [9] sdf(210.223) 13.01.22 204 0
343724 고등학교 수학 공부중인데 수학은 필수인것같다-ㅁ-;; [3] 초ㅂ(211.224) 13.01.22 179 0
343722 아무래도 난 대학 하나로만 소멤 서류 붙은 것 같다 [2] ghj(183.101) 13.01.22 322 0
343721 형들 System32에 관해 좀 도와줘 [7] 프갤맨(124.197) 13.01.22 145 0
343720 패킷이 단편화되면 쪼개지잖아 ? [23] 빡쳐(1.219) 13.01.22 263 0
343716 아 난 존나 끈기가 없다 [12] 베세ㄱ스다갤로그로 이동합니다. 13.01.22 184 0
343715 C++에서 함수가 [1] ㅇㅇ(222.112) 13.01.22 58 0
343710 아 목아프다 [5] 정수정•‿•갤로그로 이동합니다. 13.01.22 117 0
343709 쓸대없는 sqlite 를 php5 에서 지울순 없나요? [1] Kyle(220.244) 13.01.22 66 0
343708 ㅎㅎㅎ예비 치킨집사장이 질문좀합니다 ㅎㅎ [3] ㅡㅡ(59.15) 13.01.22 113 0
343707 아까소멤전화한다던애 어디갔냐 [28] ㅇㅇㅇ(117.111) 13.01.22 408 0
343706 C 질문좀요 [1] 이힝(119.194) 13.01.22 42 0
343704 쓰레드.suspend() 할 때 마지막 라인까지는 처리 하도록 보장하는 [10] C#(124.216) 13.01.22 144 0
343703 에휴 븅신들 XSS 연구할시간에 [1] exploit갤로그로 이동합니다. 13.01.22 127 0
343702 webhacking.kr 여기 문제풀고싶은데여.. [4] ㅁㄴ(175.215) 13.01.22 141 0
343701 C의 printf로 NSObject * 타입 출력할 수 있음? [3] ㅁㄴㅇ(119.202) 13.01.22 69 0
343700 경찰서 가려면 인젝션 배워야됨? [1] 인젝션(222.116) 13.01.22 98 0
뉴스 스트레이 키즈 리노, 구찌 글로벌 앰버서더 발탁 디시트렌드 07.01
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2