디시인사이드 갤러리

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

갤러리 본문 영역

Direct X 풀스크린에서 알트탭시에 문제가 ㅜㅜ

(218.152) 2010.09.04 12:33:28
조회 380 추천 0 댓글 2


그냥 아무것도 안 그리고 파란 화면으로 지우는건데요
풀스크린(F1버튼) 에서 알트 탭 누르면 최소화 되면서 다른 창으로 넘어가야 하는데...
포커스를 계속 갖고 있는지... 화면이 깜빡거리면서 장애모드... ALT+F4로 끄면 되긴함(원래 안먹어야 정상 아닌지?)
이것땜에 밤 꼴딱 샜어여... 어디가 잘못된건지... 토글기능 있는 완전 간단한 소스 비교해봐도 프로시저에서 딱히 별다른 처리 안해주던데...
한개 cpp로 바로 컴파일되는거니 좀 도와주시면 감사하겠습니다 ㅜㅜ

#include <d3d9.h>
#include <d3dx9.h>
#include <tchar.h>

#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 iDXAppBase
{
private:
        static iDXAppBase* ms_pInstance;
protected:
        HWND m_hWnd;
        bool m_bWindowed;
        int m_width;
        int m_height;
        LONG m_wndStyle;
        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:
        iDXAppBase(void);
        virtual ~iDXAppBase(void);
        int Run();
        //
        HWND GetHWND(){ return m_hWnd; }
        float GetFPS(){ return m_fFPS; }
        LPDIRECT3DDEVICE9 GetDevice(){ return m_pDevice; }
        HRESULT ChangeMode(int winSizeX, int winSizeY, int resolutionX, int resolutionY, bool bWindowed);
        HRESULT ToggleFullscreen();
protected:
        //오버라이드 해야할 함수
        virtual LRESULT MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)=0;
        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 HRESULT _CreateWindow();
        virtual HRESULT _CreateDevice();
        virtual void _UpdateFrameInfo();
        virtual void _FinalCleanUp();
        virtual HRESULT _HandleDeviceLost();
        virtual HRESULT _ResetAndRestore(D3DPRESENT_PARAMETERS* pD3dpp=NULL);

        //윈도우 프로시저
        static LRESULT CALLBACK _BaseProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
};

#include <assert.h>

#pragma comment( lib, "winmm.lib" )
#pragma comment( lib, "d3d9.lib" )

#define DEFAULT_TITLE _T("D3D Application")

iDXAppBase* iDXAppBase::ms_pInstance = NULL;

iDXAppBase::iDXAppBase(void)
{
        ms_pInstance = this;    //프로시저 연결용
        m_hWnd = NULL;
        m_width = 800;
        m_height = 600;
        m_wndStyle = WS_OVERLAPPEDWINDOW;
        m_bWindowed = true;
        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));
}

iDXAppBase::~iDXAppBase(void)
{
}

LRESULT CALLBACK iDXAppBase::_BaseProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch(message)
        {
                /*
        case WM_SIZE:
                {
                        if(wParam==SIZE_MINIMIZED)
                        {
                                assert(0);
                        }
                        break;
                }
                */
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
        //iDXAppBase를 상속받은 프로시저에서 메세지 처리
        return ms_pInstance->MsgProc(hWnd, message, wParam, lParam);
}

HRESULT iDXAppBase::_CreateWindow()
{
        //미리 핸들을 지정했을수도 있다
        if(m_hWnd)
        {
                ShowWindow(m_hWnd, SW_SHOWDEFAULT);
                UpdateWindow(m_hWnd);
                return S_OK;
        }

        //윈도우 클래스 초기화
        WNDCLASS    wndClass;       // structure used to register window class
        // Initialise WNDCLASS structure.
        wndClass.style          = 0;
        wndClass.lpfnWndProc    = iDXAppBase::_BaseProc;
        wndClass.cbClsExtra     = 0;
        wndClass.cbWndExtra     = 0;
        wndClass.hInstance      = GetModuleHandle(0);
        wndClass.hIcon          = LoadIcon(0, IDI_WINLOGO);
        wndClass.hCursor        = LoadCursor(0, IDC_ARROW);
        wndClass.hbrBackground  = 0;//static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
        wndClass.lpszMenuName   = 0;
        wndClass.lpszClassName  = DEFAULT_TITLE;
        RegisterClass(&wndClass);

        // get size of window to use so that client area is desired size
        RECT wnd_size = {0,0,m_width,m_height};
        AdjustWindowRect(&wnd_size, WS_OVERLAPPEDWINDOW, FALSE);

        // create new window
        m_hWnd = CreateWindow(DEFAULT_TITLE, DEFAULT_TITLE,
                m_wndStyle,
                00,
                wnd_size.right - wnd_size.left,
                wnd_size.bottom - wnd_size.top,
                GetDesktopWindow(), 0, wndClass.hInstance, 0);

        if(m_hWnd == NULL)
                return E_FAIL;

        m_wndStyle = GetWindowLong(m_hWnd, GWL_STYLE);
        //윈도우를 보이게 한다
        ShowWindow(m_hWnd, SW_SHOWDEFAULT);
        UpdateWindow(m_hWnd);

        return S_OK;
}

HRESULT iDXAppBase::_CreateDevice()
{
        if(m_pD3D == NULL)
        {
                m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
                if(m_pD3D == NULL)
                        return E_FAIL;
        }

        if(m_pDevice == NULL)
        {
                //m_d3dpp의 값이 깨끗하다면 디폴트값을 지정한다
                D3DPRESENT_PARAMETERS cleanParam;
                ZeroMemory(&cleanParam, sizeof(cleanParam));
                if(!memcmp(&m_d3dpp, &cleanParam, sizeof(D3DPRESENT_PARAMETERS)))
                {
                        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;
                }
                //디바이스 생성
                return m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd,
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_d3dpp, &m_pDevice);
        }

        return S_OK;
}

int iDXAppBase::Run()
{
        if(FAILED(_CreateWindow()))
        {
                assert(0&&"_CreateWindow() FAILED");
                return -1;
        }
        if(FAILED(_CreateDevice()))
        {
                assert(0&&"_CreateDevice() FAILED");
                return -1;
        }
        //3d객체 초기화 함수 호출
        if(FAILED(OnInitObjects(m_pDevice)))
        {
                assert(0&&"OnInitObjects() FAILED");
                return -1;
        }
        //D3DPOOL_DEFAULT 객체 생성
        if(FAILED(OnInitResetObjects(m_pDevice)))
        {
                assert(0&&"OnInitResetObjects() FAILED");
                return -1;
        }

        //메시지 루프 수행
        MSG msg;
        ZeroMemory(&msg, sizeof(msg));
        while(msg.message != WM_QUIT)
        {
                if(PeekMessage(&msg, 000, PM_REMOVE))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
                else
                {
                        _UpdateFrameInfo();
                        OnFrameMove(m_fElapsedTime);

                        if(FAILED( OnDraw(m_pDevice) ))
                        {
                                if(FAILED(_HandleDeviceLost()))
                                {
                                        //한번 더 시도
                                        Sleep(500);
                                        if(FAILED(_HandleDeviceLost()))
                                        {
                                                assert(0&&"알 수 없는 에러");
                                                break;
                                        }
                                }
                        }
                }
        }
        //D3DPOOL_DEFAULT로 할당된것 해제
        OnDeleteResetObjects(m_pDevice);
        //3d 객체 해제
        OnDeleteObjects(m_pDevice);
        //디바이스 및 D3D해제
        _FinalCleanUp();

        return 0;
}


HRESULT iDXAppBase::_HandleDeviceLost()
{
        HRESULT hr;
        hr = m_pDevice->TestCooperativeLevel();

        if(FAILED(hr))
        {
                //복구 불능일때
                if(hr ==  D3DERR_DEVICELOST)
                {
                        OnDeleteResetObjects(m_pDevice);
                        OnDeleteObjects(m_pDevice);

                        SAFE_RELEASE(m_pDevice);
                        //디바이스 생성
                        if(SUCCEEDED(hr = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd,
                                D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_d3dpp, &m_pDevice)))
                        {
                                OnInitObjects(m_pDevice);
                                return OnInitResetObjects(m_pDevice);
                        }
                        else
                        {
                                assert(0&&"_HandleDeviceLost() - 디바이스 재생성 실패");
                                return hr;
                        }
                }
                else if(hr == D3DERR_DEVICENOTRESET)
                {
                        OnDeleteObjects(m_pDevice);
                        _ResetAndRestore();
                        return OnInitObjects(m_pDevice);
                }
        }

        return hr;
}

//프레임 정보 업데이트
void iDXAppBase::_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 iDXAppBase::_FinalCleanUp()
{
        SAFE_RELEASE(m_pDevice);
        SAFE_RELEASE(m_pD3D);
        if(m_hWnd)
        {
                DestroyWindow(m_hWnd);
                m_hWnd = 0;
        }
        UnregisterClass(DEFAULT_TITLE, GetModuleHandle(0));
}

HRESULT iDXAppBase::ChangeMode(int winSizeX, int winSizeY, int resolutionX, int resolutionY, bool bWindowed)
{
        D3DPRESENT_PARAMETERS tempD3dpp = m_d3dpp;
        m_d3dpp.BackBufferWidth = resolutionX;
        m_d3dpp.BackBufferHeight = resolutionY;
        m_d3dpp.Windowed = bWindowed;

        RECT rc = {0,0, winSizeX, winSizeY};

        //윈도우 모드로
        if(bWindowed)
        {
                SetWindowLong(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);
                if(SUCCEEDED(_ResetAndRestore(&m_d3dpp)))
                {
                        AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
                        SetWindowPos(m_hWnd, HWND_NOTOPMOST, 00, rc.right-rc.left, rc.bottom-rc.top, SWP_SHOWWINDOW);
                        m_bWindowed = true;

                        return S_OK;
                }
        }
        else    //풀스크린 모드로
        {
                SetWindowLong(m_hWnd, GWL_STYLE, WS_POPUP|WS_VISIBLE);
                if(SUCCEEDED(_ResetAndRestore(&m_d3dpp)))
                {
                        SetWindowPos(m_hWnd, HWND_NOTOPMOST, 00, rc.right-rc.left, rc.bottom-rc.top, SWP_SHOWWINDOW);
                        m_bWindowed = false;

                        return S_OK;
                }
        }
        //실패한경우
        m_d3dpp = tempD3dpp;
        SetWindowLong(m_hWnd, GWL_STYLE, m_bWindowed?(WS_OVERLAPPEDWINDOW):(WS_POPUP|WS_VISIBLE));
        assert(0&&"ChangeMode() FAILED");
        return E_FAIL;
}

HRESULT iDXAppBase::ToggleFullscreen()
{
        return ChangeMode(m_width, m_height, m_d3dpp.BackBufferWidth, m_d3dpp.BackBufferHeight, !m_bWindowed);
}

HRESULT iDXAppBase::_ResetAndRestore(D3DPRESENT_PARAMETERS* pD3dpp)
{
        if(pD3dpp == NULL)
        {
                pD3dpp = &m_d3dpp;
        }

        HRESULT hr = E_FAIL;
        hr = OnDeleteResetObjects(m_pDevice);
        if(FAILED(hr))
        {
                assert(0&&"_ResetAndRestore() - OnDeleteResetObjects FAILED");
                return hr;
        }

        hr = m_pDevice->Reset(pD3dpp);
        if(FAILED(hr))
        {
                if(hr == D3DERR_INVALIDCALL)
                {
                        assert(0&&"_ResetAndRestore() - D3DERR_INVALIDCALL");
                }
                else
                {
                        assert(0&&"_ResetAndRestore() - m_pDevice->Reset FAILED");
                }

                return hr;
        }

        return OnInitResetObjects(m_pDevice);
}


class cTestApp
        :public iDXAppBase
{
        virtual LRESULT MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
        {
                switch(message)
                {
                case WM_KEYDOWN:
                        if(wParam == VK_F1)
                                ToggleFullscreen();
                        break;
                case WM_RBUTTONDOWN:
                        PostQuitMessage(0);
                        break;
                }
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        virtual HRESULT OnInitObjects(LPDIRECT3DDEVICE9 pDevice){ return S_OK; }
        virtual HRESULT OnInitResetObjects(LPDIRECT3DDEVICE9 pDevice){ return S_OK; }//D3DPOOL_DEFAULT로 생성되는 객체
        virtual HRESULT OnFrameMove(float elapsedTime){ return S_OK; }
        virtual HRESULT OnDraw(LPDIRECT3DDEVICE9 pDevice)
        {
                pDevice->Clear(00, D3DCLEAR_TARGET, D3DCOLOR_XRGB(00255), 1.0f0);

                // draw display
                if (FAILED(pDevice->BeginScene()))
                        return E_FAIL;

                pDevice->EndScene();

                return pDevice->Present(0000);
        }
        virtual HRESULT OnDeleteResetObjects(LPDIRECT3DDEVICE9 pDevice){ return S_OK; }
        virtual HRESULT OnDeleteObjects(LPDIRECT3DDEVICE9 pDevice){ return S_OK; }
};

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
        cTestApp app;
        return app.Run();
}




추천 비추천

0

고정닉 0

0

댓글 영역

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

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 지금 결혼하면 스타 하객 많이 올 것 같은 '인맥왕' 스타는? 운영자 24/10/28 - -
206187 무적신록님 [1] 다람쥐v갤로그로 이동합니다. 10.09.04 104 0
206186 m.oolzo.com 꼬랐다 DMW갤로그로 이동합니다. 10.09.04 151 0
206185 moo [1] DMW갤로그로 이동합니다. 10.09.04 59 0
206184 공비 너는 나에게 굴욕을 주었어 칭송받는자(210.118) 10.09.04 111 0
206182 테이블 하나 날렸다 시밤 [3] 어색해도좋아갤로그로 이동합니다. 10.09.04 78 0
206178 형들 안드로이드 프로젝트를 하게 됐는데... 방향 좀 잡아줘.. [14] 졷뉴비(116.44) 10.09.04 195 0
206175 왜 열심이 게임만드는 사람을 까냐? [5] DMW갤로그로 이동합니다. 10.09.04 203 0
206174 [ 천재플머 보고서 ] 천재플머와 일반인들의 차이 [4] 천재플머(61.77) 10.09.04 193 0
206171 무적신록 조루쎾쓰님께 [7] 쎾쓰킹(110.9) 10.09.04 155 0
206170 크롬6 나왔슴 [1] 턱지수갤로그로 이동합니다. 10.09.04 93 0
206169 이런 CGI 어케 만듬? [3] ㅇㅇ(121.151) 10.09.04 133 0
206168 [ 천재플머 보고서 ] 인간의 두 얼굴 - 프로그래머편 2 (총 2부작) [5] 천재플머(61.77) 10.09.04 212 0
206167 60만원 정도되는 물건 제가 사서 10% 할인해서 팔께요.. [1] 초밥술사갤로그로 이동합니다. 10.09.04 71 0
206166 하드만갈아끼면 완전 새컴퓨터가되는거얍?? [5] 뉴빈(211.200) 10.09.04 107 0
206165 무적신록 횽 소환 [12] 생각놀이갤로그로 이동합니다. 10.09.04 143 0
206163 밑에 리겜이라고 만들었다는거(4) [1] 쎾쓰킹(110.9) 10.09.04 108 0
206161 밑에 리겜이라고 만들었다는거(3) [5] 생각놀이갤로그로 이동합니다. 10.09.04 131 0
206156 횽아들 matlab 설치하고 실행했더니 에러뜨는데 도와줘 ㅠㅠ [3] 매트랩(121.169) 10.09.04 293 0
Direct X 풀스크린에서 알트탭시에 문제가 ㅜㅜ [2] (218.152) 10.09.04 380 0
206152 저의 연봉을 제시해주세요 [2] sh(68.147) 10.09.04 150 0
206149 이제부터 주4일 일하고 대신... [3] sh(68.147) 10.09.04 110 0
206147 요즘 가루가 되도록 까이고 있는 "김그림" [7] 야메떼♥갤로그로 이동합니다. 10.09.04 174 0
206146 형들 엑세스 답좀알려줘 ㅠㅠ [2] 엑셀(222.239) 10.09.04 47 0
206145 안드로이드 공부 1일차 소감. [3] 졷뉴비(116.44) 10.09.04 174 0
206143 넷북살라고 중고나라보니깐 인간들 진짜 양심없네 음.. [2] ㅡㅡ(116.36) 10.09.04 189 0
206142 횽들중에 60만원상당의 물건이필요하신분 [2] 초밥술사갤로그로 이동합니다. 10.09.04 97 0
206140 아... 현재 패닉상태 [2] 졷뉴비(116.44) 10.09.04 93 0
206139 도와주셈.. 이거 땜에 진도를 못나감 ㅠㅠ.. [4] 졷뉴비(116.44) 10.09.04 133 0
206135 프갤형님들 C언어 질문입니다.. 굽신굽신 (_ _) [4] 꼬꼬망(110.35) 10.09.04 166 0
206134 안드로이드용 테트리스 만들었는데.. [2] 주방아가씨갤로그로 이동합니다. 10.09.04 187 0
206132 간지 플갤 횽들아 나 삼성파브인데 AS단자랑 HDMI단자랑 차이나는거야? [2] ㅁㄴㅇ(175.195) 10.09.04 1265 7
206131 사는곳이..... [1] degul갤로그로 이동합니다. 10.09.04 72 0
206130 ㅎㅇ~ 2학기가 시작되어 알고리즘,언어론,네트워크,OOP 수업하겠네요~ [1] Rhea갤로그로 이동합니다. 10.09.04 123 0
206129 형들 나 자바배우고싶어 [6] Aray갤로그로 이동합니다. 10.09.04 153 0
206128 형들 늅늅이를 위해 설명해줘 자바나 오라클이나그게머야 [1] 늅늅이(125.134) 10.09.04 62 0
206127 더블릿 문제 미묘한 에러로 계속 오답뜨는데.. [2] ㄴㅇㄹ(220.117) 10.09.04 76 0
206126 아 미치겠다 제발 도와줘요 횽들 ㅠㅠ 졷뉴비(116.44) 10.09.04 75 0
206122 형들.. Mac은 파이어폭스 부가기능 어느 폴더로 가나요..? Witch Doctor갤로그로 이동합니다. 10.09.04 94 0
206121 요즘은 연봉 제시해달라고 하는게 유행인듯요 [7] Rei@디씨갤로그로 이동합니다. 10.09.04 268 0
206117 2012년 되면 다 뒤짐여. ㅇㅇㅇ [3] ㅇㅇㅇ(121.144) 10.09.03 122 0
206116 ??? [1] ㅁㅁ(116.44) 10.09.03 44 0
206115 학원 갈라는데 자바&오라클 vs 자바&안드로이드 머가 나을까? [5] ㅇㅇ(61.78) 10.09.03 195 0
206114 궁금한게 있는데... [1] 외곬수갤로그로 이동합니다. 10.09.03 56 0
206112 입대가 다가옵늬다 [3] 위디안갤로그로 이동합니다. 10.09.03 88 0
206111 저의 연봉을 제시해주세요 [11] DMW(125.138) 10.09.03 378 0
206110 한국 롯데리아가 일본 버거킹을 인수했다네요 [1] Rei@디씨갤로그로 이동합니다. 10.09.03 160 0
206109 형들 안드로이드 이것도 궁금한게.... [1] 졷뉴비(116.44) 10.09.03 56 0
206108 형들 안드로이드 질문 좀 받아줘요 [3] 졷뉴비(116.44) 10.09.03 95 0
206107 내장 파괴자 [2] ㅇㅇㅃ갤로그로 이동합니다. 10.09.03 146 0
206106 프로그래밍을 처음 배우려 하는데.. [6] 초짜(180.71) 10.09.03 160 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2