22020, 1/1101 회원가입  로그인  
   kjh00114
   http://bolg.naver.com/kjh00114
   소스코드 설명해주실분 @_@;;

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Board&no=15750 [복사]


#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <ddraw.h>
#include <stdio.h>
#include <stdarg.h>
#include "resource.h"
#define NAME                "DDExample1"
#define TITLE               "Direct Draw Example 1"
#define TIMER_ID            1
#define TIMER_RATE          500
LPDIRECTDRAW7               g_pDD = NULL;        // DirectDraw object
LPDIRECTDRAWSURFACE7        g_pDDSPrimary = NULL;// DirectDraw primary surface
LPDIRECTDRAWSURFACE7        g_pDDSBack = NULL;   // DirectDraw back surface
BOOL                        g_bActive = FALSE;   // Is application active?

static char                 szMsg[] = "Page Flipping Test: Press F12 to exit";
static char                 szFrontMsg[] = "Front buffer (F12 to quit)";
static char                 szBackMsg[] = "Back buffer (F12 to quit)";



struct _5 {};

static void
ReleaseAllObjects(void)
{
    if (g_pDD != NULL)
    {
        if (g_pDDSPrimary != NULL)
        {
                        //// 생성된 표면 해제
            g_pDDSPrimary->Release();
            g_pDDSPrimary = NULL;
        }
        g_pDD->Release();
        g_pDD = NULL;
    }
}

HRESULT
InitFail(HWND hWnd, HRESULT hRet, LPCTSTR szError,...)
{
    char                        szBuff[128];
    va_list                     vl;

    va_start(vl, szError);
    vsprintf(szBuff, szError, vl);
    ReleaseAllObjects();
    MessageBox(hWnd, szBuff, TITLE, MB_OK);
    DestroyWindow(hWnd);
    va_end(vl);
    return hRet;
}



struct _4 {};
static void
UpdateFrame(HWND hWnd)
{
    static BYTE                 phase = 0;
    HDC                         hdc;
    DDBLTFX                     ddbltfx;
    RECT                        rc;
    SIZE                        size;
        
    // Use the blter to do a color fill to clear the back buffer
    ZeroMemory(&ddbltfx, sizeof(ddbltfx));
    ddbltfx.dwSize = sizeof(ddbltfx);
    ddbltfx.dwFillColor = 0;                                // 픽셀 RGB 값 또는 팔레트
    g_pDDSBack->Blt(NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);

    if (g_pDDSBack->GetDC(&hdc) == DD_OK)
    {
        SetBkColor(hdc, RGB(0, 0, 255));
        SetTextColor(hdc, RGB(255, 255, 0));

                //// 플래그 전환
        if (phase)
        {
            GetClientRect(hWnd, &rc);
            GetTextExtentPoint(hdc, szMsg, lstrlen(szMsg), &size);
            TextOut(hdc, (rc.right - size.cx) / 2, (rc.bottom - size.cy) / 2,
                    szMsg, sizeof(szMsg) - 1);
            TextOut(hdc, 0, 0, szFrontMsg, lstrlen(szFrontMsg));
            phase = 0;
        }
        else
        {
            TextOut(hdc, 0, 0, szBackMsg, lstrlen(szBackMsg));
            phase = 1;
        }
        g_pDDSBack->ReleaseDC(hdc);
    }
}


struct _3 {};
long FAR PASCAL
WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HRESULT                     hRet;

    switch (message)
    {
        case WM_ACTIVATE:
            // Pause if minimized
                        // wParam 상위 2바이트 : 최소화된 상태이면 0이 아니다
            g_bActive = !((BOOL)HIWORD(wParam));                        
            return 0L;

                //// 어플리케이션이 종료되기전에 발생
                //    WM_CLOSE -> DefWindowProc() -> DestroyWindow()
                // -> WM_NCDESTROY / WM_DESTROY
        case WM_DESTROY:
            // Clean up and close the app
            ReleaseAllObjects();
                        // WM_QUIT 메시지 발생
                        // 일반적으로 WM_DESTROY에서 사용
            PostQuitMessage(0);
            return 0L;

        case WM_KEYDOWN:
            // Handle any non-accelerated key commands
            switch (wParam)
            {
                case VK_ESCAPE:
                case VK_F12:
                                        // 윈도우 or 어플리케이션을 종료 시키는 메시지 발생
                    PostMessage(hWnd, WM_CLOSE, 0, 0);
                    return 0L;
            }
            break;

        case WM_SETCURSOR:
            // Turn off the cursor since this is a full-screen app
            SetCursor(NULL);
            return TRUE;

        case WM_TIMER:
            // Update and flip surfaces
            if (g_bActive && TIMER_ID == wParam)
            {
                UpdateFrame(hWnd);
                while (TRUE)
                {
                    hRet = g_pDDSPrimary->Flip(NULL,        // 플립핑 체인의 표면 주소
                                                                                // NULL이면 부가 ( 연계된) 표면을 순차 플립
                                                                       0);                // 0이면 플립핑 작동과 상관없이 즉시 리턴
                    if (hRet == DD_OK)
                        break;
                    if (hRet == DDERR_SURFACELOST)
                    {
                                                //// 표면을 복구
                        hRet = g_pDDSPrimary->Restore();
                        if (hRet != DD_OK)
                            break;
                    }
                                        // 드로우 중이면 루프
                    if (hRet != DDERR_WASSTILLDRAWING)
                        break;
                }
            }
            break;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}



struct _2 {};
static HRESULT
InitApp(HINSTANCE hInstance, int nCmdShow)
{
    HWND                        hWnd;
    WNDCLASS                    wc;
    DDSURFACEDESC2              ddsd;                // 표면에 대한 속성 설정
    DDSCAPS2                    ddscaps;        // 표면 능력 설정
    HRESULT                     hRet;

    // Set up and register window class
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON));
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName = NAME;
    wc.lpszClassName = NAME;
    RegisterClass(&wc);

    // Create a window
    hWnd = CreateWindowEx(WS_EX_TOPMOST,
                          NAME,
                          TITLE,
                          WS_POPUP,
                          0,
                          0,
                          GetSystemMetrics(SM_CXSCREEN),
                          GetSystemMetrics(SM_CYSCREEN),
                          NULL,
                          NULL,
                          hInstance,
                          NULL);
    if (!hWnd)
        return FALSE;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    SetFocus(hWnd);
    hRet = DirectDrawCreateEx(NULL,                                                // NULL == 주장치사용
                                      (VOID**)&g_pDD,                        // directdraw 객체
                                                          IID_IDirectDraw7,
                                                          NULL);                                        // 확장성 인자 ( X )
    if (hRet != DD_OK)
        return InitFail(hWnd, hRet, "DirectDrawCreateEx FAILED");

        // 실행수준
    // Get exclusive mode
    hRet = g_pDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
    if (hRet != DD_OK)
        return InitFail(hWnd, hRet, "SetCooperativeLevel FAILED");
        
    // Set the video mode to 640x480x8
    hRet = g_pDD->SetDisplayMode(640, 480, 8,
                                         0,                // 리프레쉬율 ( 0 == 디폴트 )
                                                                 0);
    if (hRet != DD_OK)
        return InitFail(hWnd, hRet, "SetDisplayMode FAILED");

    // Create the primary surface with 1 back buffer
    ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;                                // 지정 멤버의 유효성 설정
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP |
                          DDSCAPS_COMPLEX;                                                        // 하나 이상의 표면
                                                                                                                                        // 즉, 생성될 표면에 연계되는 표면의 생성
    ddsd.dwBackBufferCount = 1;
    hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
    if (hRet != DD_OK)
        return InitFail(hWnd, hRet, "CreateSurface FAILED");

    // Get a pointer to the back buffer
    ZeroMemory(&ddscaps, sizeof(ddscaps));
    ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack);
    if (hRet != DD_OK)
        return InitFail(hWnd, hRet, "GetAttachedSurface FAILED");

    // Create a timer to flip the pages
    if (TIMER_ID != SetTimer(hWnd, TIMER_ID, TIMER_RATE, NULL))
        return InitFail(hWnd, hRet, "SetTimer FAILED");

    return DD_OK;
}



struct _1 {};
int PASCAL
WinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow)
{
    MSG                         msg;

    if (InitApp(hInstance, nCmdShow) != DD_OK)
        return FALSE;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
DirectX 페이지 플립핑예제인데요..
함수라던지.. 등등 조금만 설명 부탁드립니다..

  Hit : 11604     Date : 2010/04/19 08:47



    
syana 다이렉트라.. 함수만 설명하겠습니다.

ReleaseAllObjects(void) - 모든 오브젝트를 해제합니다. 생성된 객체를 해제해주어야 합니다. 메모리를 할당해주었는데, free해주지 않으면 메모리 누수가 일어나겠죠?
InitFail(HWND hWnd, HRESULT hRet, LPCTSTR szError,...) - 에러 발생시 메세지를 띄우고 프로그램을 종료하는 함수입니다.
UpdateFrame(HWND hWnd) - 화면에 출력하는 함수입니다.
WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) - 윈도우즈 메세지를 처리하는 부분입니다. 활성화 되었을때나, 파괴될때 또는 키가 눌렸을때 같은..
InitApp(HINSTANCE hInstance, int nCmdShow) - 어플리케이션을 설정하는 함수입니다. 여기서 기본적인 윈도우 객체를 초기화하고 생성합니다.
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) - 일반적인 메인함수입니다. c/c++에서 마치 int main(void)부분입니다. 여기서 InitApp를 불러와 기본적으로 윈도우 객체를 생성하고 메세지를 처리합니다.

뭐 자세한건 함수 내용을 차근차근 읽어보시면 아실수 있는 부분입니다.
저도 다이렉트와 WinAPI본지 꽤 오래 되서 제가 설명하게 맞는지 잘 모르겠네요.
2010/04/19  
kjh00114 음.. 그러면 ZeroMemory UpdateWindow도 알수있을까요? 2010/04/19  
syana ZeroMemory에 대한 것은 코멘트로 친절하게 남겨져 있네요.
// Use the blter to do a color fill to clear the back buffer
ZeroMemory(&ddbltfx, sizeof(ddbltfx));

UpdateWindow 는 강제로 WM_PAINT를 불러오는 함수입니다.

질문 하시기전에 검색 또는 레퍼런스 참고 하시는게 우선이 아닐까요?
2010/04/19  
qa22ahj MSDN가면 친절히 설명이 되어있답니다. 심지어 다이렉트까지도요.. MSDN는 로컬 설치를 추천합니다만 인터넷에서 봐도 무방합니다. 2010/04/21  
     [공지]해커스쿨 이용수칙 2021/04/11 수정판 [55] 한승재 01/05 12818
22019   해커구함     k1230
10/04 24
22018   카타고 AI[1]     해킹잘하고싶다
10/01 49
22017   시스코 라우터랑 스위치 케이블 장비 질문이에요.[1]     해킹잘하고싶다
09/22 112
22016   ㅇㅅㅇ     해킹잘하고싶다
08/15 296
22015   요즘 하고 있는 거     해킹잘하고싶다
07/13 503
22014   2위 ㅇㅅㅇ     해킹잘하고싶다
07/13 441
22013   ...     해킹잘하고싶다
03/31 832
22012   ...     해킹잘하고싶다
03/25 811
22011   15년전쯤 이 사이트 보고 꿈을 정했었는데~~~[1]     ambition65
03/20 1215
22010   으앙!!![1]     해킹잘하고싶다
02/05 954
22009   오랜만~     DarkSlayer
12/11 1155
22008   해커스쿨 옛날 BGM[1]     wkfhddl4041
11/07 1256
22007   히잉...     해킹잘하고싶다
11/02 1080
22006   바둑과 장기     해킹잘하고싶다
10/30 1166
22005   나는 언제 애인이 생기나욤...     해킹잘하고싶다
10/27 1243
22004   전국 1위     해킹잘하고싶다
10/27 1189
22003   담배 ㅋㅋ[1]     해킹잘하고싶다
10/27 1191
22002   매트릭스의 파란약을 아십니까..?     해킹잘하고싶다
10/27 1147
22001   ㅇㅇ[1]     해킹잘하고싶다
10/20 1116
1 [2][3][4][5][6][7][8][9][10]..[1101]

Copyright 1999-2026 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org