¡ºMFC·Î °ÔÀÓÀ» ¸¸µé±â¡»


°­ÀÇ ÁÖÁ¦ : DirectX¸¦ MFC¿¡¼­ »ç¿ëÇÏÀÚ~

  Á¦ 1 Àå MFC·Î ±¸ÇöÇÏ´Â Ç®½ºÅ©¸° ó¸® ¹æ¹ý

   -> 1. DirectXÀÇ Æò¸é ±¸Á¶¿Í ±âº» Ŭ·¡½º ±¸¼º


Á¦°¡ ´ÙÀÌ·ºÆ® ¿¢½º¶ó´Â °ÍÀ» óÀ½ Á¢ÇÑ °Í Àº 2¹öÀü ¶§ ¿´ ½À´Ï´Ù. ¹ú½á
2³â ÀÌ»óÀÌ Áö³µ±º¿ä~.±×°Ô ´ëÇ×ÇØ ½Ã´ë3¸¦ ±ò¸é¼­ ±ò·Á¼­ ¾Ë°Ô µÆÁÒ. ±×           
ÈÄ·Î ¹öÀüÀÌ 3.0....5.2±îÁö ³ª¿Í Àִµ¥ ÀÌ¹Ì °ÔÀÓ °ü·ÃµÈ ·çƾÀº 3¹öÀü¿¡          
¼­ È®°íÈ÷ ÀÚ¸®°¡ ÀâÈù °Í °°½À´Ï´Ù.
5.0Àº 3Â÷¿ø ±â´ÉÀ» Çâ»óÇÑ Á¡¿¡¼­ Á¶±Ý ³ª¾Æ Á³°í~ 5.2´Â DVD±â´ÉÀ»
÷°¡Çß´Ù°í Çϴ±º¿ä~

Á¦°¡ º»°ÝÀûÀ¸·Î À̾߱â ÇÒ°Ç ÀÌ·± °ÑÄ¡ÀåÀÇ ±â´ÉÇâ»óÀÌ ¾Æ´Ñ ½Ç¼ÓÀÖ´Â
±â´É Çâ»óÀ» º¸ÀÚ¸é, »õ·Î¿î ÀÎÅÍÆäÀ̽º IDDVideoPortContainer,
DirectDrawColorControl ,IDirectDrawVideoPort, ±×¸®°í  
IDirectDrawSurface3Æ÷ÇÔ µÇ¾î ÀÖ°í, IDirectDrawSurface2°¡ º¸Ãæ °øÀ¯
µÇ¾î ÀÖ°í. ÁÖ¿äÇÑ °³¼±µÈ Á¡Àº ³ÐÀº Ç¥¸éÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù.

»ç½Ç ÀÌ ºÎºÐÀº Á¦°¡ ÀÎÅͳÝÀ» ÅëÇØ ¾òÀº ÀڷḦ ¹ø¿ªÇؼ­ ¿Ã¸®·Á´Ù
ÀÌ·¸°Ô ´Ù½Ã ÆíÁýÇØ¼­ ¿Ã¸³´Ï´Ù.  °¢°¢ÀÇ ±â´ÉÀº ÀÌ¹Ì 5.0 ·¹ÆÛ·±½ºÀÇ
¼­µÎ¿¡ ³ª¿À´Â °ÍÀε¥ ÀÚ¼¼ÇÑ °ÍÀº ·¹ÆÛ·±½º¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä~
(ÇØ¼®ÀÌ ¾ÈµÇ½Ã´Â ºÐÀº Àú¿¡°Ô Áú¹®À» Áּŵµ µË´Ï´Ù. )

Áö±Ý ÀÎÅͳÝÀ» ÅëÇØ °ÔÀÓ ÄÄÇ»ÅÍ µ¿ÇâÀ» »ìÆì º¸¸é 3Â÷¿øÀ» °¡Áö°í
Ä¡¿­ÇÑ ÀüÀïÀ» Ä¡·ç°í ÀÖ´õ±º¿ä~ ƯÈ÷ ¿ÀÇÂÁö¿¤ À̳Ä~ ´ÙÀÌ·ºÆ®¿¢½º³Ä~
ÀÇ µÎÁø¿µÀÌ Ä¡¿­ÇÏ°í °£È¤ µ¶ÀÚÀûÀÎ ±×·¯³ª ±×¸® ÈûÀ» ¹ßÈÖÇÒ ¼ö ¾ø´Â
µ¶Àڳ뼱À» Ãß±¸ÇÏ´Â ÆÀÀ̳ª ȸ»çµµ ÀÖ´õ±º¿ä~

¾î·°Å³ª 3Â÷¿ø¿¡¼­ ¸¹ÀÌ »ç¿ëÇϰí ÀÖ´Â °ÍÀº ¿ÀÇÂÁö¿¤ °ú ´ÙÀÌ·ºÆ® ¿¢½º
Àε¥ ¿ÀÇÂÁö¿¤Àº ÀÌ¹Ì ¸®´ª½º³ª À¯´Ð½º, ±×¸®°í ¼Ö¶ó¸®½º, ¿À¿¡½ºÅõ,
À©µµ¿ìÁî 95µîµî ¸¹Àº ¿î¿µÃ¼Á¦¿¡¼­ »ç¿ëµÇ¾î ¿Ô°í ±â´É¶ÇÇÑ Æí¸®ÇϰÔ
µÇ¾î ÀÖ¾î ÇÔ¼ö ·¹ÆÛ·±½º¸¸À» °¡Áö°í 3Â÷¿ø °¨°¢ÀÌ ÀÖ´Â(°³³äÀÌ ÀâÇô
ÀÖ´Â) µ¶ÀÚ¶ó¸é ´©±¸³ª ±¸ÇöÇÒ¼ö ÀÖ°Ô µÇ¾î ÀÖ½À´Ï´Ù.
±×·± ¹Ý¸é ´ÙÀÌ·ºÆ® ¿¢½º´Â ºü¸£´Ù´Â °ÍÀ» Ãß±¸ÇÏÁö¸¸ ¿ö³« ¸¹Àº
º¯¼ö¿Í ÀÎÀÚ¿ÍÀÇ ÀüÀïÀ» ÇѹÙÅÁÄ¡·ç°í ³­ÈÄ¿¡¾ß °¡´ÉÇÏ´Ï Á¶±Ý ¹ø°Å
·Ó´õ±º¿ä~

ÇÏÁö¸¸ ´ÙÀÌ·ºÆ® 3Â÷¿øÀ» °¢ÀÚ º»ÀÎÀÇ ±¸¹Ì¿¡ ¸Â°Ô Àß ±¸¼ºÇسõ°í
³ª¸§µ¥·Î ÀÎÅÍÆäÀ̽º¸¦ ±¸¼º¸¸ µÈ´Ù¸é ¿ÀÇÂÁö¿¤º¸´Ù Æí¸®ÇÏ°Ô ¾µ¼öµµ
ÀÖ°ÚÁÒ~ (À̰ÍÀº µ¶ÀÚÀÇ ¸ò!)

ÀÏ´Ü ¸¹Àº µ¶ºÐµéÀÌ MFC¸¦ µÎ·Á¿öÇϰí ÀÖ´Â °Í °°¾Æ ´ÙÀÌ·ºÆ®¿¢½º¸¦
¾î¶»°Ô Çϸé MFC¿Í ½±°Ô Á¢¸ñÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö¸¦ 2Â÷¿ø ÇÁ·Î±×
·¥°ú 3Â÷¿ø ÇÁ·Î±×·¥À» °¢°¢ Á¦ÀÛÇϸ鼭 ¹è¿ö º¸µµ·Ï ÇÏÁÒ~
(¾à°£ ±ÛÀÌ ¾î»öÇÒ ¼öµµ Àִµ¥ ÀÚ·áÁß ¿ø¾î¸¦ ±×µ¥·Î ¹ø¿ªÇؼ­ ³ÖÀº
ºÎºÐµµ ÀÖ´Ùº¸´Ï Á¶±Ý ÀÌ»óÇÒ ¼öµµ Àִµ¥ Á¦°¡ ³ª¸§µ¥·Î Á¤¸®ÇÏ·Á°í
Çߴµ¥ ¾ÆÁ÷ ÀÚ·áµéÀÌ Á¤¸®°¡ ¾ÈµÇ¾î ÀÌ·¸°Ô ¼­µÑ·¯ ÀÛ¼ºÇØ ¿Ã¸³´Ï´Ù.
)

1. ´ÙÀÌ·ºÆ® ¿¢½ºÀÇ »ç¿ë

ÀÌ¹Ì ¾Õ¼­ ÀúÀÇ ±ÛÀ» ÀÐÀ¸½Å ºÐÀ̳ª °øºÎ¸¦ ÇϽźÐÀº ´ÙÀÌ·ºÆ® ¿¢½º°¡
¾î¶²°Å±¸³ª ÇÏ´Â °ÍÀ» ¾Æ½Ç°Ì´Ï´Ù. º¸´Ù ºü¸¥ ±×·¡ÇÈ Ã³¸®¸¦ À§ÇÑ
µå¶óÀ̹öÀε¥, À̰ÍÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀº Ǯȭ¸éÀ» ´Ù ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú
À©µµ¿ìÁî ¸ðµå·Î ÀÛ¼ºÇÏ´Â ¹æ¹ý µÎ°¡Áö°¡ ÀÖ´Ù´Â °ÍÀ» ¾Æ½Ç°Ì´Ï´Ù.
¸ð¸¥´Ù±¸¿ä~ ±×·¸´Ù¸é ÀÌ·¸°Ô µÎ°¡Áö·Î »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù.

Àú´Â ´ÙÀÌ·ºÆ® ¿¢½º¸¦ »ç¿ëÇÒ¶§ IDirectDrawSurface2°ÍÀ» ÀÚÁÖ »ç¿ë
Çϴµ¥ ÀÌÀ¯´Â ±âÁ¸ÀÇ ´ÙÀÌ·ºÆ® ¿¢½º¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù¸é
±×°Í°ú Ãæµ¹À» ÀÏÀ¸Å°Áö ¾ÊÀ¸·Á°í À̰ÍÀ» »ç¿ëÇÕ´Ï´Ù. º¸Åë
IDirectDrawSurface¸¦ »ç¿ëÇÕ´Ï´Ù. ƯÈ÷ ¿Â¿¡¾î¶ó´Â  TV¼ö½ÅÄ«µåÀÇ
ÇÁ·Î±×·¥Àº IDirectDrawSurface¸¦ ÀÌ¿ëÇØ È­¸é¿¡ TV³»¿ëÀ» Âï´Âµ¥
À̰ͰúÀÇ Ãæµ¹À» ÀÐÀ¸Å°Áö ¾ÊÀ¸·Á¸é ´Ù¸¥ Surface¸¦ »ç¿ëÇØ¼­ Ãâ·Â
ÇÏ´Â °ÍÀÌ ³º°ÚÁÒ~

ÀÏ´Ü ´ÙÀÌ·ºÆ® ¿¢½º¸¦ MFC¿¡¼­ »ç¿ëÇϱâ À§ÇØ ±×¿¡ ÀûÇÕÇÑ ÄÚµùÀ»
ÇØ³õ¾Æ¾ß °ÚÁÒ~

class CDirectDraw
{
public:
        // two phase construction
        CDirectDraw ();
        void Create (HWND hWnd,
            DWORD dwDisplayWidth, DWORD dwDisplayHeight,
                DWORD dwBitPlanes, DWORD RefreshRate=0);

        ................
        ................

        ~CDirectDraw ();

public:
        // surface¸¦ Á¦¾î
        CPrimarySurface& FrontSurface ();
        CBackBuffer& BackBuffer (int iNumBackBuffer=0);

        .................
        .................

        // Load a palette from a bitmap:
        void  LoadPalette (LPCSTR szBitmap);

        // ÆÄ·¹Æ® °ü·Ã ÇÔ¼ö
        void GetEntries (DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries);
        void SetEntries (DWORD dwStartingEntry, DWORD dwCount,
                                                   LPPALETTEENTRY lpEntries);

private:
        // Guard against copies
        CDirectDraw (const CDirectDraw& src);
        CDirectDraw& operator = (const CDirectDraw& src);
};

´ÙÀÌ·ºÆ® ¿¢½º¸¦ »ý¼º ½Ã IDirectDraw2¸¦ ÃÖÃÊÀÇ ¸é¿¡ ÀÌ¿ëÇß°í ±× ´ÙÀ½
µÞ¸éµµ À̰ÍÀ» ÀÌ¿ëÇØ »ý¼ºÇß´Ù. ±×¸®°í ´ÜÀÏ ÆÄ·¹Æ®¸¸À» »ç¿ëÇϰÔ
ÇØ ³õ¾Ò´Ù. À̰ÍÀº ¾îµð±îÁö³ª ¿¹Á¦¸¦ À§ÇØ Á¦ÀÛµÈ °ÍÀ̹ǷÎ...
´ÙÀ½¿¡ Á¦ÀÛµÈ CreateDDInterface´Â »ý¼ºÇϸ鼭 ¹ß»ýµÇ´Â ¿¡·¯¸¦ ÀûÀý
ÇÏ°Ô µð¹ö±× ¸ðµå»ó¿¡¼­ ó¸® µÇ°Ô µÇ¾î ÀÖ´Ù. ±×¸®°í

void CDirectDraw::CreateDDInterface ()
{
        LPDIRECTDRAW lpDD_v1;
        HRESULT ddrval = DirectDrawCreate (NULL, &lpDD_v1, NULL);
        switch (ddrval)
        {
        case DD_OK:
                // ¼º°øÇϸé
                break;
#ifdef _DEBUG
        case DDERR_INVALIDPARAMS:
                TRACE ("Invalid parameters.\n");
                ASSERT (FALSE);
                break;
        case DDERR_INVALIDDIRECTDRAWGUID:
                TRACE ("Invalid GUID.\n");
                ASSERT (FALSE);
                break;
        case DDERR_DIRECTDRAWALREADYCREATED:
                TRACE ("DirectDraw object was alreadyaleady created.\n");
                ASSERT (FALSE);
                break;

        case DDERR_GENERIC:
                TRACE ("Generic error creating the interface.\n");
                throw ddrval;
                break;
        case DDERR_NODIRECTDRAWHW:
                TRACE ("DirectDraw hardware is not available.\n");
                throw ddrval;
                break;
        case DDERR_OUTOFMEMORY:
                TRACE ("Out of memory.\n");
                throw ddrval;
                break;
#endif

        default:
                TRACE ("Undocumented error.\n");
                throw ddrval;
        }
        // ¹Ù·Î ÀÌ ºÎºÐÀÌ Á¦2ÀÇ Æò¸éÀ» »ç¿ëÇÏ°Ô ÇÏ´Â ºÎºÐÀÌ´Ù.
        ddrval = lpDD_v1->QueryInterface ( IID_IDirectDraw2, (LPVOID *)&m_lpDD);
        ......
        ......
}

¾ÕÀÇ ³»¿ëÀ» ´Ù½Ã °£´ÜÇÏ°Ô Á¤¸®Çϸé...

void CDirectDraw::CreateDDInterface ()
{
        LPDIRECTDRAW lpDD_v1;
        HRESULT ddrval = DirectDrawCreate (NULL, &lpDD_v1, NULL);
        switch (ddrval)
        {
        case DD_OK:
                // ¼º°øÇϸé
                break;

        default:
                TRACE ("Undocumented error.\n");
                throw ddrval;
        }
        ddrval = lpDD_v1->QueryInterface ( IID_IDirectDraw2, (LPVOID *)&m_lpDD);
        ......
        ......
}


ÀÚ~ ¿©±â¼­ ¾ÕÀ¸·Î »ç¿ëµÈ Æò¸é¿¡ °üÇØ ¾Ë¾Æ º¸µµ·Ï ÇÏÀÚ~

 

2. »ç¿ëµÇ´Â Æò¸éµé

ÇÊÀÚ´Â Æò¸éµéÀ» ±¸¼ºÇϴµ¥ ÀÖ¾î °¢°¢ÀÇ Å¬·¡½º·Î Á¤ÀÇÇØ µÎ¾ú´Ù.
¾Æ¸¶µµ ¸¹Àº ºÐÀº º¯¼öÇϳª·Î ó¸®ÇÏ¸é µÉ°É? ¿Ö? Ŭ·¡½º·Î ÇÏÁö?
ÇÏ½Ç ÅÙµ¥.. °¢°¢ÀÇ ±â´ÉÀ» ±¸ºÐÀ» ÇÏ°í ±×¿¡ µû¶ó µ¶ÀÚÀûÀΠ󸮷Π                  
º¸´Ù È¿°ú¸¦ ÁÖ±â À§Çؼ­ ÀÔ´Ï´Ù.

 1) CPrimarySurface class
    ¾ÆÁÖ °£´ÜÇÏ°Ô ±¸¼ºÀÌ µÇ¾î Àִµ¥, µÚ¿¡ »ý¼ºµÈ Æò¸é°ú È­¸é
    ÀüȯÀ» À§ÇØ »ý¼º. ¿ÀÁ÷ º¸¿© ÁÖ±â À§ÇÑ Æò¸é Ŭ·¡½º´Ù.

 2) CBackBuffer class
    ½ÇÁ¦ µ¶ÀÚ°¡ Á÷Á¢ ±×¸²À» ±×¸®°í º¯ÇüÀ» °¡ÇÏ´Â Æò¸éÀÌ´Ù.

 3) CBitmapSurface class
    °ÔÀÓ¿¡ »ç¿ëµÇ´Â ±×¸²À» ´ã¾Æ µÎ´Â ÁÖ·Î ºñÆ®¸ÊÀ» ´ã´Âµ¥ »ç¿ë
    µÇ´Â Æò¸é Ŭ·¡½ºÀÌ´Ù.


´ÙÀ½ ¼Ò½º´Â ¾îµð¼­ ¸¹ÀÌ º»µíÇÑ ¿¹Á¦Àε¥ ¾îµð¼­ º¸´ø ¼Ò½ºÀε¥...
¾îµô ±î¿ä? SDKÀÇ Sample¿¡ º¸½Ã¸é µµ³ÓÃ÷¸¦ ¿òÁ÷ÀÌ´Â ¿¹Á¦°¡ ÀÖÀ»
°Ì´Ï´Ù. Çѹø »ìÆì º¸¼¼¿ä~
    
    ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
    if( ddrval != DD_OK )
    {
        return initFail(hwnd);
    }

    // Get exclusive mode
    ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE |
                                               DDSCL_FULLSCREEN );
    if( ddrval != DD_OK )
    {
        return initFail(hwnd);
    }

    // Set the video mode to 640 by 480 by 8640x480x8
    ddrval = lpDD->SetDisplayMode( 640, 480, 8);
    if(ddrval != DD_OK)
    {
        return initFail(hwnd);
    }

    // Create the primary surface with 1 back buffer
    ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
                          DDSCAPS_FLIP |
            DDSCAPS_COMPLEX;
    ddsd.dwBackBufferCount = 1;
    ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
    if( ddrval != DD_OK )
    {
        return initFail(hwnd);
    }

    ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
    if( ddrval != DD_OK )
    {
        return initFail(hwnd);
    }

¾î´À Á¤µµ °æÇèÀÌ ÀÖ°í Á» ÇØ º¸½Å ºÐµéÀº ÀÌ Á¤µµ´Â ¾Æ¹« °Íµµ ¾Æ                 ´Ï °Ô ÀÌÇØ°¡ ^^;
¾ÆÁÖ °£´ÜÇÑ ´ÙÀÌ·ºÆ® ¿¢½º »ý¼º ºÎºÐÀÔ´Ï´Ù. À§ÀÇ ÄÚµå¿Í ´Ù¸¥ Á¡ÀÌ
¸î ±ºµ¥ ÀÖÁÒ~ Áö³­¹ø °­Á±îÁö´Â ÀÌ·± ÇüÅÂÀÇ ÄÚµå·Î À̾߱â Çß°í
¾ÕÀ¸·Î´Â ÀúÀ§ÀÇ ÄÚµå·Î °­Á¸¦ ÇÕ´Ï´Ù.


À§ÀÇ Å¬·¡½ºÀÇ ÇÔ¼öµéÀ» ¾î¶»°Ô ¾µ±î? ÇÏ´Â Àǹ®ÀÌ »ý±æ ÅÙµ¥
´ÙÀ½°ú °°ÀÌ »ç¿ëµË´Ï´Ù. ÆÄ·¹Æ® ¼ÂÆÃ°ú ´ÙÀÌ·ºÆ® ¿¢½º »ý¼º~

    //
    // ´ÙÀÌ·ºÆ® ¿¢½º¸¦ »ý¼ºÇÏ´Â ºÎºÐ
    //
        m_DirectDraw.Create (hwnd, 640, 480, 8);

    // create and set the palette
        m_Palette.Create ();

        m_DirectDraw.SetPalette (m_Palette);


ÀÏ´Ü ¿©±â±îÁö Çϰí¿ä~ ´ÙÀ½¿¡ Çϱâ Àü¿¡ ¾Ë·Á µå¸± °ÍÀº~
MFC¿¡´Â SDI ¿Í MDI¶ó°í ÇÏ´Â °ÍÀÌ Á¸ÀçÇϴµ¥ Àú´Â ÀÌ °­Á¿¡¼­
SDI¸¦ À§ÁÖ·Î ÇÏ·Á°í ÇÕ´Ï´Ù. º¸´Ù °£ÆíÇϱ⠶§¹®ÀÌÁÒ~.
¿ì¼± SDI´Â ÇϳªÀÇ À©µµ¿ì¸¦ »ç¿ë ÇÏ´Â °ÍÀ̰í,MDI´Â ¿©·¯ °¡Áö
À©µµ¿ì¸¦ »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.
MFC¸¦ ÀÌ¿ëÇØ Àüüȭ¸éÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¸ð»öÇØº¸°í ±× ´ÙÀ½
â ¸ðµå¿¡¼­ ÀÛ¾÷ÇÏ´Â ¹æ¹ýÀ» ¾Ë·Á µå¸®ÁÒ~

API¸¦ ¾²´Ù°¡ MFC¸¦ »ç¿ëÇØº¸¸é ÀÌ·¸°Ô Æí¸®ÇÑ °ÍÀ» ¸ô¶ú³ª ÇÒ
°Ì´Ï´Ù. µÎ ¹ø ´Ù½Ã´Â API¸¦ ¾È ¾²Áö ¾ÊÀ»±î Çϳ׿ä~

Á¦2ÀÇ °­Á¿¡¼­´Â º»°ÝÀûÀÎ MFC¸¦ ÀÌ¿ëÇϵµ·Ï ÇÏÁÒ~


                           È帣´Â ¹°Àº ¸ØÃß°Ô ÇÒ ¼ö ÀÖÁö¸¸
                           ½Ã°£ÀÇ È帧Àº ´©±¸³ª
                           ¸ØÃâ ¼öµµ µ¹¸± ¼öµµ ¾ø³×~

 

°­ÀÇ ÁÖÁ¦ : DirectX¸¦ MFC¿¡¼­ »ç¿ëÇÏÀÚ~

  Á¦ 1Àå MFC·Î ±¸ÇöÇÏ´Â Ç®½ºÅ©¸° ó¸® ¹æ¹ý

      1. DirectXÀÇ Æò¸é ±¸Á¶¿Í ±âº» Ŭ·¡½º ±¸¼º
   -> 2. ½ÇÁ¦ MFCÀÇ ¸Þ¼¼Áö ¸Ê ±¸¼º

¿À´ÃÀº MFCÀÇ ¸Þ¼¼Áö¸ÊÀ» ±¸¼ºÇÏ´Â ¹æ¹ý°ú DirectX ¿ÍÀÇ Á¢¸ñÀ» À̾߱â
ÇØº¸µµ·Ï ÇսôÙ. µÎ¹øÂ° ½Ã°£ÀÎ ¸¸Å­ ù¹øÂ°¶§º¸´Ù ½Ã°£Àû ¿©À¯¸¦ °¡
Áö°í °­ÀǸ¦½á ³ª°¡µµ·Ï ÇϰڽÀ´Ï´Ù.

PS. -------------------------------------------------------------
ÀÌ ±ÛÀÇ ¸ðµç ÀúÀÛ±ÇÀº ±è¼ºÈÆ´Ô¿¡°Ô ÀÖÀ¸¸é º»ÀÎÀÇ Çã¶ô¾øÀÌ
ºÒ¹ýÀûÀ¸·Î µµ¿ëÇϰųª ´Ù¸¥ °÷¿¡ ±âÀçÇÒ ¼ö ¾ø½À´Ï´Ù. ¶ÇÇÑ Ã³À½ MFC
¸¦ ´Ù·ç´Â ºÐÀ̳ª DirectX¸¦ ±âº»ÀûÀ¸·Î ÇϽô ºÐÀÇ ´«³ôÀÌ¿¡ ¸ÂÃß¾î
ÀÛ¼ºµÇ¾î ÀÖÀ½À» ¹àÈû!(½Ç·ÂÀÌ ÁÁÀ¸½Å ºÐÀº ¾È Àо µÇ¿ä~ ^^;).
-----------------------------------------------------------------

3. ¸Þ¼¼Áö ¸ÊÀÇ ±¸¼º

º¸Åë MFC¸¦ ¾î¶»°Ô ¹è¿ö¾ß ÇÒÁö? ±×¸®°í ¹è¿ì°í ³­ ÈÄ ¾î¶»°Ô ½á¾ß ÇÒ
Áö¸¦ ¸Á¼³ÀÌ´Â ºÐÀÌ ¸¹½À´Ï´Ù. ±×·±µ¥ Àß È°¿ëÇÏ¸é ¹«Ã´À̳ª ½±°í °£
´Ü ÇÏ°Ô Ã³¸®¸¦ ÇÒ ¼ö ÀÖ´Â ÀåÁ¡ÀÌ ¸¹½À´Ï´Ù.

Microsoft Developer Stidio[VC ¿¡µðÅÍ]¿¡¼­ New¸¦ ¼±ÅÃÇϸé ÅǸ޴º
Áß Project¸¦ ¼±ÅÃÇÏ¸é ¿¡±¸~ ¹«½¼ À§ ÀÚ µå(Wizard)°¡ ¸¹ÀºÁö? ¾ó·¹?
¹«¾ó ¼±ÅÃÇØ¾ß~ Çϳª? (À½...´Ü¹ø¿¡ ¶Ç´Â Åë ¹äÀ¸·Î ¸ÂÃ߽ô ºÐÀÌ
ÀÖ±º¿ä~) MFC AppWizard(exe)¶ó´Â ¸Þ´º°¡ Àִµ¥ À̰ÍÀ» ¼±ÅÃÇØ¼­
´ÙÀ½¿¡ ¹°¾îº¸´Â °ÍÀ» »ó¼¼È÷ ÀÐ¾î º¸½ÅÈÄ ³ªÁß¿¡ ¿Ï¼ºÀÌ µÈ ¸Þ ¼¼Áö°¡
¹«Á¶°ÇÀûÀ¸·Î ´ÙÀ½°ú °°Àº ¸Þ¼¼ Áö°¡ ³ª¿É´Ï´Ù.

  +- Application : CDemoApp class
  |
  +- Frame       : CMainFrame class
  |
  +- Document    : CDemoDoc class
  |
  +- View        : CDemoView class

À§ÀÇ 4°³ÀÇ Å¬·¡½º°¡ »ý¼ºÀÌ µË´Ï´Ù. ¹Ù·Î Ŭ·¡½º°¡ ¸Þ¼¼Áö¸¦ ¶æÇÏ´Â
µ¥ óÀ½¿¡ °ü·Ã Á¤º¸ »ý¼º, °¢°¢ÀÇ À©µµ¿ìÀÇ ÇÁ·¡ÀÓÀ» °ü¸®, ¹®¼­ÀÇ
Á¤º¸ °ü¸®, ¸¶Áö¸·À¸·Î º¸¿© ÁÖ¸é µÇ°ÚÁÒ~

ÀÏ´Ü ÀÌ·¸°Ô ¾Ë°í °è ¼¼¿ä~ ´õ¿í ÀÚ¼¼ÇÑ ³»¿ëÀº MFC°ü·Ã Ã¥ÀÚ¸¦ º¸
½Ã¸é º¸´Ù »ó¼¼È÷ °¢°¢ÀÇ ¸Þ ¼¼Áö¿¡ ´ëÇØ ¾Ë¾Æ º¼ ¼öÀÖÀ» °Ì´Ï´Ù.
(¿ä°Ç ¹«½¼ ÀǹÌÀ̳ĸé Àû¾îµµ MFC°ü·ÃÃ¥ÀÚ´Â ÇÑ ±Ç Á¤µµ´Â ÀÖ¾î¾ß
ÇÑ´Ù´Â À̾߱âÁÒ~ ^^;)

ÀÚ~ ±×·³ Àú±â 4°³ÀÇ ¸Þ ¼¼Áö°¡ ÇÊ¿äÇÒ±î¿ä? ..............
ÇÊ¿äÇÕ´Ï´Ù. ±×·±µ¥ ¿©±â¼­ µÎ °¡Áö¸¦ »ý°¢ÇØ µÎ¾î¾ß ÇÕ´Ï´Ù. ¹« ¾ó±î?
¹Ù·Î ¾î¶² ¸ðµå¿¡¼­ MFC¸¦ »ç¿ëÇÒ °ÍÀΰ¡ ÇÏ´Â ¹®Á¦°¡ Àִµ¥ ¹Ù·Î
ÀÌ ¹®Á¦¸¦ ÀüÁ¦·Î ÇÏ°í¼­ ¸Þ ¼¼Áö ¸ÊÀ» °ü¸® ÇØ¾ß ÇÕ´Ï´Ù.

À©µµ¿ì ¸ðµå¿¡¼­ ´ÙÀÌ·ºÆ® ¿¢½º¸¦ »ç¿ëÇÑ´Ù¸é À©µµ¿ì ±Ô¾à¿¡ ¸Â
Ã߾ Á¦ÀÛÀ» ÇØ¾ß ÇÕ´Ï´Ù. ±×°Ç ¹®¼­°ü¸®¿Í º¸¿©Áö´Â 󸮸¦ ÇØ¾ß
ÇÏ´Â ¹ø°Å·Î¿òÀÌ µû¸¨´Ï´Ù. ÇÏÁö¸¸ °´Ã¼ 󸮴 µ¶ÀÚÀûÀ¸·Î Çϰí
º¸ÀÌ´Â È­¸éÀ» º¸¿© Áֱ⸸ ÇÏ¸é ¾î¶³±î¿ä? º¸Åë °ÔÀÓ¿¡¼­´Â ÀÌ·±
¹æ¹ýÀ» »ç¿ëÇÏÁÒ~

ÀÏ´Ü °¡Àå °£´ÜÇØ º¸ÀÌ´Â Àüüȭ¸éÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ
º¸µµ·Ï ÇÏÁÒ~

Ç® È­¸éÀ» »ç¿ëÇÏ¸é ¹®¼­°ü¸®°¡ ÇÊ¿äÇÒ±î¿ä? È­¸éÀüü¸¦ °¡µæ µ¶ÀÚ°¡
Á¦ÀÛÇÑ ±×¸²µé·Î ä¿ì´Â »óÅ¿¡¼­ º°µµÀÇ º¸À̶ó´Â ¸Þ ¼¼Áö¸¦ À©µµ¿ì
¿¡°Ô º¸³¾ Çʿ䰡 ÀÖÀ»±î¿ä? ±×·¯´Ï±î~ ¿©±â¼­ ¸Þ ¼¼Áö´Â MFCÀÇ
¸Þ ¼¼Áö¸¦ ¸»ÇÕ´Ï´Ù.

ÀÏ´Ü ÇÊ¿äÇÑ °ÍÀ» º¸ÀÚ¸é ÃʱâÈ­¸¦ À§ÇÑ ¸Þ ¼¼Áö°¡ ÇÊ¿äÇÕ´Ï´Ù.
°ÔÀÓÀ» óÀ½ »ý¼ºÇϸ鼭 ¾ÕÀ¸·Î »ç¿ëµÉ ¸ðµå¿¡ ´ëÇØ À©µµ¿ì¿¡°Ô
'³ª ÀÌ·¸°Ô ¾µ ²¨¾ß~'¶ó°í ¾Ë·Á ÁÖ´Â ¸Þ ¼¼Áö¿Í~ µµ½º¿¡¼­ Á¦ÀÛÇÏ´ø
¹æ½ÄÀÎ Main()ÇÔ¼ö °ÝÀÎ ÇÁ·¹ÀÓ Ã³¸® ¸Þ ¼¼Áö¸¸ ÀÖÀ¸¸é ³¡À̰ÚÁÒ~

¾µ ¶§ ¾ø´Â ÆÄÀÏ Àº Áö¿ìÀÚ~ ¹«¾ó Áö¿ö¾ß ÇÒ±î? ¹Ù·Î µµÅ¥¸ÕÆ®ÇÔ¼ö°¡
ÀÖ´Â ÆÄÀÏ °ú ºñ~À¯ Ŭ·¡½º°¡ ÀÖ´Â ÆÄÀÏ À» Áö¿ì¸é µË´Ï´Ù.~ ¾ÆÁÖ °£
´ÜÇÏÁÒ~ ±×·¯¸é ¹«¾ùÀÌ ³²ÁÒ?

  +- Application : CDemoApp class
  |
  +- Frame       : CMainFrame class

À̰͸¸ÀÌ ³²°Ô µÇ´Âµ¥ À̰ÍÀ» ÀûÀýÇÏ°Ô »ç¿ëÇÏ¸é µË´Ï´Ù.

¸Þ ¼¼Áö Áß¿¡ IdleÀ̶ó´Â ¸Þ ¼¼Áö°¡ Àִµ¥ À̰ÍÀº À©µµ¿ì ÇÁ·Î±×·¥
À» °øºÎÇϽŠºÐ À̶ó¸é ¾Æ½Ã°ÚÁö¸¸ ¸Þ ¼¼Áö°¡ ¾ø´Â »óŸ¦ Æ÷ÂøÇØ¼­
µ¶ÀÚ°¡ ±× ½Ã°£À» »ç¿ëÇÏ°Ô ÇØÁÖ´Â ¸Þ ¼¼ÁöÀÔ´Ï´Ù.

ÀÌ ¸Þ ¼¼Áö´Â MFC¿¡¼­ ÇÔ¼ö·Î Á¦°øÀ» ÇØÁÝ´Ï´Ù. º¸Åë API¿¡¼­´Â ÇÔ¼ö
·Î Á¦°øµÇ±â º¸´Ù´Â

    while(¹«Á¶°Ç µ¹¾Æ¶ó~) {
        while( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) !=0 ) {
            if( GetMessage( &msg, NULL, 0, 0) == 0 ) ÇÁ·Î±×·¥ ³¡³»ÀÚ~;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        if (Ȱ¼ºÈ­ µÇ¾ú³ª?)
            ±×·³ ³»°¡ ó¸®Çϰí Ç ÇÔ¼ö ½ÇÇàÇÒ·¡~
    }

ÇÏÇÏ~ ÀÌ·¸°Ô API¿¡¼­´Â WinMain()À̶ó´Â ºÎºÐ¿¡ ¸Þ ¼¼Áö¸¦ º°µµ·Î
Ã¼Å©ÇØ¼­ »ç¿ëÇØ¾ß Çß½À´Ï´Ù. ±×·±µ¥ MFC¿¡¼­´Â ´Þ¶û~ OnIdle()ÀÌ
¶ó´Â ÇÔ¼ö°¡ Á¦°øÀÌ µÈ´Ù´Ï....(ºñÅëÇϱ¸³ª~ À̰ÍÀ» »¡¸® ¾Ë¾ÒÀ¸¸é
... ÇϽô ºÐµµ ÀÖ°ÚÁÒ~)

 


4. Application Message

ÀÚ~ ±×·¯¸é ¸Þ´º Áß¿¡¼­ Ŭ·¡½º À§ ÀÚ µå ¸¦ ½ÇÇàÇØ¼­ ¶ç¿ìÀÚ~ ±×°ÍÀ»
¶ç¿ì¸é ClassNameÀ» µÚÀûµÚÀûÇϸé '³ª Ŭ·¡½º¾ßApp'¶ó´Â ¸Þ ¼¼Áö°¡ ÀÖ
´Â µ¥ À̰Ϳ¡ °íÁ¤ÇÏ°í ¸Þ ½ÃÁö â¿¡¼­ OnIdle¶ó´Â °ÍÀ» Ŭ¸¯ÇÏ¸é ¿Í¿ì~
¸â¹ö ÇÔ¼ö¶õ À» º¸¸é ÀÌ ÇÔ¼ö°¡ µé¾î ¿Í ÀÖÀ» °Ì´Ï´Ù.
±×·¯¸é ¿¡µðÆ® ÄÚµå¶ó´Â ¹öư¹Ù¸¦ ´­·¯ º¸¸é

    BOOL ³ªÅ¬·¡½º¾ßApp::OnIdle(LONG lCount)
    {
            CWinApp::OnIdle (lCount);
            return ÂüÀϱú·Õ~;
    }

ÀÌ·¸°Ô ³ªÅ¸³­´Ù´Â Àü¼³ ¾Æ´Ñ Àü¼³ÀÌ ÀÖ´õ±º¿ä~

±×·³ ÀÌ ºÎºÐÀ» ¾î¶»°Ô ÀÌ¿ëÇÒ±î¿ä? µ¶ÀÚºÐÀÌ µ¹¸®°íÀÚ ÇÏ´Â ÇÁ·Î ±×
·¥À» ÀÌ ÇÔ¼ö¿¡ ³ÖÀ¸¸é ±×³É~ O~K~

Àá±ñ ¿¹¸¦ µéÀÚ¸é


BOOL ³ªÅ¬·¡½º¾ßApp::È­¸éÀ» ¾÷µ¥ÀÌÆ®ÇÒ·¡()
{
    if (!((CMainFrame*)m_pMainWnd)->m_bActive)
                                        return FALSE;

    DWORD               thisTickCount;
    RECT                rcRect;
    DWORD               delay[4] = {50, 78, 13, 93};
    int                 i;
    PALETTEENTRY        pe[256];
    HRESULT             ddrval;

    // Decide which frame will be blitted next
    thisTickCount = GetTickCount();
    ...................
    ...................
    return ÂüÀϱú·Õ~;
}

void ³ªÅ¬·¡½º¾ßApp::¸ðµÎ º¹±¸ÇÒ·¡()
{
    // m_DD.FrontSurface().Restore ();
    // m_Surface.Restore();
}

±×·¸´Ù¸é »ç¿ëÀ» ¾î¶»°Ô ÇØ¾ßÁÒ? À½..°£´ÜÇϾß~ ¾÷µ¥ÀÌÆ®ÇÔ¼ö¸¦
ÀÌ¿ëÇÏ¸é µË´Ï´Ù.

    BOOL ³ªÅ¬·¡½º¾ßApp::OnIdle(LONG lCount)
    {
            CWinApp::OnIdle (lCount);
            return È­¸éÀ» ¾÷µ¥ÀÌÆ®ÇÒ·¡();
    }

¹Ù²î¾úÁÒ~ ÀÌ·¸°Ô µÇ¸é ÀÏ´Ü È­¸éÀÌ °»½ÅÀÌ µÇ °Ú ±Ý ¸Þ ¼¼Áö¸¦
±¸¼ºÇß½À´Ï´Ù.  ¿ì¿Í~ ¾ÆÁÖ ½±ÁÒ~

ÀÏ´Ü À̺κÐÀÇ ¸Þ ¼¼Áö¸¦ ÀÌ·¸°Ô Á¦ÀÛÀ» ÇØ ³õ°í~

 


5. MainFrame Message

ÀÌ ¸Þ ¼¼Áö´Â ´ç¿¬ ÇÁ·Î±×·¥ÀÇ ÇٽɺκÐÀ̶ó°í ÇØµµ °ú¾ðÀÌ ¾Æ´Ñ
ºÎºÐÀ̶ó°í ÁüÀÛÇϽô ºÐÀÌ °è½Ã°ÚÁÒ~ ´ç±ÙÀÔ´Ï´Ù!

´Ù½Ã º¸ÀÚ¸é~ "MFCÀÇ ¸ðµç °ÍÀº Ŭ·¡½º À§ ÀÚ µå ·Î Ŭ·¡½º À§ÀÚ
µå´Â MFCÀÇ ¸Þ¼¼Áö·Î~" À̰ÍÀÌ Áø¸®¿ä~ ÂüÀ̷δÙ~ ( ¿ìÇìÇì~ )
À¢ Çê¼Ò¸®°¡...À̰ÍÀÌ ¹Ù·Î MFC¸¦ »ç¿ëÇÏ´Ù º¸¸é ³ªÅ¸³ª´Â Áõ¼¼?

ÀÏ´Ü Å¬·¡½º À§ ÀÚ µå ¸¦ ½ÇÇàÇÏÀÚ~ ´ç¿¬ ¸Þ´º¿¡¼­ Ŭ·¡½º À§ ÀÚ µå
¸¦ ã¾Æ¼­ Ŭ¸¯À» ÇÏ¸é µÇ°ÚÁÒ~ °Å±â¿¡ º¸¸é Ŭ·¡½º À̸§¿¡
º¸¸é 'CMainFrame'À̶ó´Â °ÍÀÌ ÀÖÁÒ~ ±×°ÍÀ» °í¸£¸é ¸â¹öÇÔ¼ö
¶õ À» º¸¸é ´Þ¶û~ PreCreateWindow() ÇÔ¼ö¸¸ÀÌ Á¸ÀçÇÏ´Â °ÍÀ»
¾Ë ¼ö ÀÖÀ» °Ì´Ï´Ù.
ÀÌ ÇÔ¼ö¸¦ ÀÏ´Ü ¿¡µðÆÃÇÕ´Ï´Ù. ¿¡µðÆ® ÄÚµå ¹Ù¸¦ ´­·¯¼­ È­¸éÀ»
°»½ÅÇսôÙ.


BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
        // TODO: Modify the Window class or styles here by modifying
        //  the CREATESTRUCT cs

        return CFrameWnd::PreCreateWindow(cs);
}

¿ä·¸°Ô ±¸¼ºÀÌ µÇ¾î ÀÖ½À´Ï´Ù. ÀÌ ÇÔ¼öÀÇ Æ¯Â¡Àº À©µµ¿ì¸¦
»ý¼ºÇÒ ¶§ ±×·¯´Ï±î~ µ¶ÀÚ²²¼­ Á¦ÀÛÇÏ´Â ÇÁ·Î±×·¥ÀÇ À©µµ¿ì
½ºÅ¸ÀÏÀ» Á¤ÀÇÇØ¼­ »ý¼ºÇÏ°Ô ÇÏ´Â ºÎºÐÀÔ´Ï´Ù.

±×·¯¸é CREATESTRUCT ±¸Á¶Ã¼¿¡´Ù°¡ Ä¿¼­¸¦ °¬´Ù µ¥°í~ F1۸¦
´­·¯ º¸¼¼¿ä~ ¾î¶² ¾µ ¶§ ¾ø´Â ¸»µéÀÌ?? (À×? ¿Ö ³»°Õ ¾Ïȣó·³
º¸ÀÌ´Â ±ÛÀÚµéÀÌ ³ªÅ¸³ª´Â °É±î? ÇÏÇÏ~)
°Å±â ±¸Á¶Ã¼¸¦ »ìÆìº¸¸é È­¸éÀÇ Å©±â¸¦ Á¤ÀÇ ÇÏ´Â º¯¼ö°¡
ÀÖ½À´Ï´Ù.
±× º¯¼ö¿¡ °ªÀ» ³Ö¾î À©µµ¿ì Å©±â¸¦ Á¤ÀÇ ÇսôÙ.

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
        // TODO: Modify the Window class or styles here by modifying
        //  the CREATESTRUCT cs

        cs.x = cs.y = 0;
        cs.cx = GetSystemMetrics (SM_CXSCREEN);
        cs.cy = GetSystemMetrics (SM_CYSCREEN);
        return CFrameWnd::PreCreateWindow(cs);
}
ÀÌ·¸°Ô ¹Ù²ß½Ã´Ù~ ¿©±â¼­ ½ÃÀÛ ÁÂÇ¥´Â 0À̶ó´Â °ªÀ¸·Î ÃʱâÈ­
ÇÏ¿© µÎ¾ú°í~ À©µµ¿ì Å©±â´Â ÇöÀç ½Ã½ºÅÛÀÇ ÃÖ´ë °ªÀ» ¹Þ¾Æ¼­
¼¼ÆÃ ÇÏ°Ô µÇ¾î ÇÏ¿© µÎ¾ú½À´Ï´Ù.
¿Í~¿ì MFCµµ º°°³ ¾Æ´Ï³×?


ÀÚ~ ±×·³ ÀÌ°Í °¡Áö°í ´ÙÀÌ·ºÆ® ¿¢½º°¡? ¶ã±î ³ª? ¾ÕÀ¸·Î °¥±æ ÀÌ
³²¾Æ ÀÖ°í....Àá½Ã ÈÄ....(¹«·Á 5½Ã°£ ÈÄ ¿ï ¶ö ¶ó~ ±×»çÀÌ¿¡ ¾î¶²
ÀÏÀÌ?)

´Ù½Ã ¸¶À½À» °¡´Ùµë°í...À̹ø¿¡´Â °ÔÀÓÀ» ÁøÇàÇϴµ¥ ÀÖ¾î Ű
º¸µå´Â ³î°í ÀÖÀ»±î¿ä? ÀüÇô ¾Æ´ÏÁÒ~ °£´ÜÇÏ°Ô °ÔÀÓÀ» ºüÁ® ³ª
¿À·Á°í ÇÒ ¶§ ESC ۸¦ ´©¸£¸é ±×¿¡ ÇØ´çÇÏ´Â ¹ÝÀÀÀ» ÇØ¾ß °ÚÁö
¿ä~ ±×¸®°í ±âŸ µ¶ÀںеéÀÌ ¾î¶² ۸¦ ³Ö¾î º¸°Ú´Ù°í ÇÑ´Ù¸é
±×¿¡ ÇØ´çÇÏ´Â ¸Þ ¼¼Áöµµ ÷°¡ÇØ¾ß °ÚÁö¿ä~

¾î¶»°Ô ÷°¡ÇØ¾ß ÇÏÁÒ? ¿¡°í°í...¾î¶»°Ô Çϳª...±×·±µ¥ API¿¡¼­´Â
¾î¶»°Ô 󸮸¦ ÇßÁÒ~ ±× ¶§¸¦ ¾Æ½Ê´Ï±î?

      case WM_KEYDOWN :
           if( wParam == VK_UP )
                             ¿Ã¸®·¡();
           if( wParam == VK_DOWN )
                             ³»¸±·¡();
           if( wParam == VK_LEFT )      
                             ¿ÞÂÊÀ¸·Î °¥·¡();
           if( wParam == VK_RIGHT )
                             ¿À¸¥ÂÊÀ¸·Î °¥·¡();
           .............
           .............
           break;

ÀÌ·± ½ÄÀ¸·Î 󸮸¦ Çß¾ú½À´Ï´Ù. À½ ±×¸®°í º°µµ·Î ÇÔ¼ö¸¦ ¸¸µé
±âµµ ÇÏÁö¸¸ ±×·¡µµ ¾î¶»°Ç ÀÌ·± ½ÄÀ¸·Î 󸮸¦ Çß½À´Ï´Ù.
ÀÌ¹Ì À©µµ¿ì ÇÁ·Î±×·¥À» Çß´ø ºÐÀ̶ó¸é ³¸ ÀÍ´Â ¼Ò½º ºÎºÐÀ̶ó
°Å¸®³¦ ¾øÀÌ ¾ÆÇÏ~ ±×·¸±º ÇϽðÚÁÒ~
±×·¸´Ù¸é MFC¿¡¼­´Â ÀÌ·± ºÎºÐÀ» ¾î¶»°Ô 󸮸¦ ÇÒ ±î³ª?

Ŭ·¡½º À§ ÀÚ µå ¿¡¼­ º¸¸é WM_KEYDOWNÀ̶ó´Â ºÎºÐÀÌ ÀÖ½À´Ï´Ù.
ÀÌ ºÎºÐÀ» µÎ ¹ø Ŭ¸¯ÇÏ¸é ¸â¹öÇÔ¼ö¿¡ OnKeyDownÀ̶ó´Â ÇÔ¼ö°¡
»ý¼ºÀÌ µË´Ï´Ù. ±×·³ ¿ª½Ã ¿¡µðÆ® ¹öưÀ» ´­·¯ º¸¸é ´ÙÀ½°ú °°
Àº ¼Ò½º°¡ ³ªÅ¸³¯ °Ì´Ï´Ù.

void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
        // ¹öÃò¾ó ŰÁß¿¡ ESC¿Í F12¸¦ ´­·¶À»¶§ ÇÁ·Î±×·¥À» ³¡³¿        
        if ((nChar == VK_ESCAPE) || (nChar == VK_F12))
                PostMessage(WM_CLOSE, 0, 0);
        
        CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

¿Í¿ì~ °£´ÜÇØ º¸ÀÌÁÒ~ ±×·³¿ä~ °£´ÜÇÏ°Ô Ã³¸®µÇ°Ú±Ý µÇ¾î ÀÖ´Â
°ÍÀÌ MFCÀÔ´Ï´Ù.

±× ´ÙÀ½ È­¸éÀ» °»½ÅÇÏ´Â ¸Þ ¼¼Áö°¡ ÀÖ¾î¾ß ÀûÀýÇÑ À©µµ¿ì ³»ºÎ
½Ã°£¿¡ ¸ÂÃß¾î È­¸éÀÌ °»½ÅÀÌ µÇ°ÚÁö¿ä~ ÀÌ ºÎºÐÀº ´ÙÀ½ ¾î¶»°Ô
󸮸¦ ÇØ¾ß ÁÁÀ» ±î³ª?

¾Õ¼­ ¹è¿î ¹æ¹ýó·³ ¸Þ ¼¼Áö ºÎºÐ¿¡¼­ WM_PAINT¶ó´Â ºÎºÐÀ» Ŭ¸¯
ÇÏ¿© ÇÔ¼ö¸¦ »ý¼ºÇÏ¸é µË´Ï´Ù. À©µµ¿ì âÀ» ÀÌ¿ëÇØ¼­ »ç¿ëµÇ´Â
ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¹Ç·Î º°µµÀÇ °»½Åó¸® ·çƾÀº ÇÊ¿ä ¾ø½À´Ï´Ù.
´Ü¼øÀÌ ÀÌ ¸Þ ¼¼Áö¸¦ ³Ö¾î ÁÜÀ¸·Î È­¸é °»½ÅÀÌ ÀÌ·ç¾î Áö°Ô µË´Ï
´Ù.

±×·³ ´ÙÀ½°ú °°Àº Äڵ尡 »ý¼ºÀÌ µÇ¾î ÀÖÀ» °Ì´Ï´Ù.

void CMainFrame::OnPaint()
{
        CPaintDC dc(this); // device context for painting
        
        // TODO: Add your message handler code here
        // We need do nothing.
        
        // Do not call CFrameWnd::OnPaint() for painting messages
}

¿©±â¼­ this°¡ ³ªÅ¸³»µí ÀÚ½ÅÀÇ DC¸¦ °»½ÅÇÏ°Ô µË´Ï´Ù.

[#Âü°í] ¿©±â¼­ this ¿¬»êÀÚ´Â C++¿¡¼­ »ç¿ëµÇ´Â ¿¬»êÀÚ·Î ÀÚ½Å
À» ³ªÅ¸³»´Â ¿¬»êÀÚ ¶Ç´Â ÇÁ·Î±×·¥ÀÇ ¿¹¾à¾î¶ó°í ÇÒ ¼ö ÀÖ½À´Ï´Ù.
Áï, ¸Þ¸ð¸®ÀÇ Æ÷ÀÎÅÍ ¿¬»êÀÚ¿Í´Â º°°³·Î 󸮵ÇÁö¸¸ ½ÇÁ¦ ¶â¾î
º¸¸é ºñ½ÁÇÑ ±â´ÉÀ» Çϸ鼭 »ç¿ë»ó Àǹ̴ ´Ù¸£´Ù. ¸Þ¸ð¸®°¡
Áö½ÃÇÏ´Â °ÍÀÇ ¸íÈ®¼ºÀ» µÎ±âÀ§ÇØ this¿¬»êÀÚ¸¦ »ç¿ëÇÑ´Ù.
(À̱¸ À̰ÍÀÌ ¸Â ´Ù°í ÁÖÀå ÇÒ ¼ö¾øÁö¸¸ ÀÌ·¸°Ô ÀÌÇØÇϸé ÇѰá
µµ¿òÀÌ µÇ°ÚÁö¿ä~ ^^;)


±âŸ Ȱ¼ºÈ­ µÇ¾î ÀÖ´ÂÁöÀÇ ¿©ºÎ¸¦ ÆÇ´ÜÇÏ´Â ¸Þ ¼¼Áöµµ ÀÖ°í ÷°¡
°¡´ÉÇÑ ¸Þ ¼¼Áö´Â Ŭ·¡½º À§ ÀÚ µå ¿¡ ÀÖ½À´Ï´Ù.
÷°¡ÇÒ ¼ö ÀÖ´Â ±â´É, ÇÏÁö¸¸ ²À ÇÊ¿äÇÑ °Í¸¸À» ³Ö¾î¾ß ÇÕ´Ï´Ù.


ÀÚ~ ÀÌ Á¤µµ µÇ¸é ¾î´À Á¤µµ MFC ÀÇ Ç®½ºÅ©¸°À» ÀÌ¿ëÇÑ °ÔÀÓÀ»
Á¦ÀÛ ÇÒ ¼öÀÖ½À´Ï´Ù. ±× ´ÙÀ½ ³ª¸ÓÁö ij¸¯ÅÍÀÇ µ¿ÀÛÀ̳ª ÀΰøÁö´É
ó¸®, Âï±â µîµîÀÇ °ÔÀÓÀÇ ±â´ÉÀº º°µµÀÇ ÇÔ¼ö·Î Á¦ÀÛÇÏ°í ¾îµð?
¹Ù·Î Application Ŭ·¡½ºÀÇ IdleÇÔ¼ö¿¡ ÷°¡ÇÏ¸é µË´Ï´Ù.

¿©±â±îÁö 1ÀåÀÇ MFC¸¦ ÀÌ¿ëÇÑ Ç®½ºÅ©¸° Ȱ¿ëÆíÀÌ¿´½À´Ï´Ù.
´ÙÀ½½Ã°£¿¡ Á¦ 2Àå À©µµ¿ì ¸ðµå¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æ º¸µµ·Ï
ÇÏÁö¿ä~ Á¶±Ý º¹ÀâÇѵ¥ (¸Þ ¼¼Áö°¡ ¸¹°Åµç¿ä~) ÇϳªÇϳª »ìÆì
º¸¸é¼­ Á¦ÀÛÀ» ÇØ º¸µµ·Ï ÇÏÁö¿ä~

 


°­ÀÇ ÁÖÁ¦ : DirectX¸¦ MFC¿¡¼­ »ç¿ëÇÏÀÚ~

  Á¦ 1Àå MFC·Î ±¸ÇöÇÏ´Â Ç®½ºÅ©¸° ó¸® ¹æ¹ý

      1. DirectXÀÇ Æò¸é ±¸Á¶¿Í ±âº» Ŭ·¡½º ±¸¼º
      2. ½ÇÁ¦ MFCÀÇ ¸Þ¼¼Áö ¸Ê ±¸¼º

  Á¦ 2Àå MFC·Î ±¸ÇöÇÏ´Â À©µµ¿ì ¸ðµå ó¸® ¹æ¹ý

   -> 1. MFCÀÇ Æ¯Â¡°ú ¸Þ¼¼Áö ±¸Á¶

¹ú½á 3¹øÂ° °­ÀǸ¦ ÁغñÇØ¾ß ÇÏ´Â ½Ã°£ÀÌ µÇ¾ú±º¿ä. ¸Å¹ø °­Á¸¦Áغñ
Çϸ鼭 ¹«Ã´À̳ª ±äÀåµÇ°í °ÆÁ¤ÀÌ µË´Ï´Ù. ¿Ö³Ä±¸¿ä? ¾î¶»°Ô ÇÏ¸é º¸
´Ù ½±°Ô µ¶Àںе鲲 ÀÌÇØ¸¦ ½ÃÄѵ帱±î ½ÍÀº ¸¶À½¿¡... ^^;

À̹ø ½Ã°£ºÎÅÍ´Â ´ÙÀÌ·ºÆ® ¿¢½º¸¦ ÀÌ¿ëÇØ ¸Ê¿¡µðÅͳª ½ºÇÁ¶óÀÌÆ® µ¿ÀÛ
ÅøÀ» Á¦ÀÛÇÒ¼ö ÀÖ´Â ±â¹ÝÀ» ´ÙÁö±â À§ÇÏ¿© MFC¸¦ ÀÌ¿ëÇÑ À©µµ¿ìÁî ¸ð
µå¿ëÀ¸·Î °øºÎÇϵµ·Ï ÇսôÙ.

1. MFC·Î Á¦ÀÛµÈ ÇÁ·Î±×·¥ÀÇ Æ¯Â¡

ÀϹÝÀûÀ¸·Î °øÅëÀûÀΠǥÁØÀ» °¡Áö°í¼­ À©µµ¿ìÁî ÇÁ·Î±×·¥À» Á¦ÀÛÇϰÔ
µË´Ï´Ù. À̰ÍÀº ÀÌ¹Ì API¸¦ °øºÎÇϸ鼭 À©µµ¿ìÁîÀÇ Ç¥ÁØÀ» µû¸£¸é¼­
¹ß»ýµÇ´Â ÀÎÅÍÆäÀ̽ºÀÇ µðÀÚÀÎÀÇ Ç¥ÁØÈ­°¡ »ý±â¾î »ç¿ëÇÏ´Â À¯Àú·Î
ÇÏ¿©±Ý È¥µ·À» ÀÏÀ¸Å´ÀÌ ¾øÀÌ Ã¼°è¼ºÀ» º¸¿©ÁÖ±â À§ÇÔÀÌ ¾Æ´Ò±î ÇÕ´Ï
´Ù.

±×·± ¸é¿¡¼­ MFC·Î Á¦ÀÛÇϴµ¥¿¡µµ ¾î¶°ÇÑ °øÅëµÈ ÅëÀϼºÀÌ µû¸¨´Ï´Ù.
Åø¹ÙÀÇ »ý¼º, µµ¿ò¸» º¸±â ±â´É, ¸Þ´º±â´É µîµî µµ½º½ÃÀý¿¡´Â º¹ÀâÇÏ
°Ô ÆË¾÷ÀÌ´Ï Ç®´Ù¿îÀÌ´Ï ¾ÆÀÌÄÜ »ý¼º ¹æ¹ýÀÌ´Ï ÇÏ¿© º°µµ·Î ¹è¿ì°í
½ÀµæÇؼ­ ó¸®ÇÏ´Ï À̸® Àú¸® ½Ã°£µµ °É¸®°í »ç¿ëÇÏ´Â »ç¶÷À¸·Î ÇÏ¿©
½Àµæ·Âµµ ÇÊ¿ä·Î ÇÏ°Ô Çß½À´Ï´Ù. ±×·¯³ª À©µµ¿ìÁî´Â ÅëÀÏµÈ ÀÎÅÍÆäÀÌ
½º·Î ½±°Ô Á¦ÀÛÇÏ°í »ç¿ëÇÏ´Â °ÍÀÌ ¸¶À½ÀÌ µéÁÒ~

ÀÚ~ ÇÊÀÚ°¡ ¿Ö ÀÌ·± ¸»À» Çß³Ä¸é ¹Ù·Î À©µµ¿ìÁî ¸ðµå·Î Á¦ÀÛÇÏ´Â ÇÁ
·Î±×·¥¿¡ ÀÖ¾î ÀÎÅÍÆäÀ̽º ºÎºÐÀ» ½Å°æÀ» ¾È¾µ¼ö ¾ø´Ù´Â °ÍÀÌÁÒ~
ÇÏÁö¸¸ API¿¡¼­´Â ¾î¶»°Ô Çß³ª¿ä? ÀÏÀÏÀÌ ÇØ´ç ºÎºÐÀ» Á¦ÀÛÇØÁÖ¾î¾ß
ÇßÁö¿ä~ ±×·¯³ª MFC´Â óÀ½ ÇÁ·ÎÁ§Æ® »ý¼º½Ã Á¶°Ç¿¡ ¸Â´Â ÄÚµå»ý¼ºÀÌ
ÀÌ·ç¾îÁö¹Ç·Î ÀÎÇØ °£´ÜÇÑ ÀÎÅÍÆäÀ̽º´Â ±¸¼ºÀÌ µÇ¾î ÀÖ´Ù´Â °ÍÀÌÁÒ~
Áö±ÝÀÌ¶óµµ ½±°Ô »ý¼ºµÈ ¼Ò½º¸¦ F7¸¦ ´­·¯ ÄÄÆÄÀÏÈÄ ½ÇÇàÀ» ÇØº¸½Ã¸é
½±°Ô ¾Æ½Ç°Ì´Ï´Ù.

¸Þ¼¼ÁöÀÇ ½¬¿î °ü¸®
ÀÌ°Ç API¸¦ »ç¿ëÇÏ´Ù MFC¸¦ »ç¿ëÇϸé óÀ½ºÎÅÍ ´À³¢´Â Á¡Àε¥ ¸Þ¼¼Áö
¸¦ ÇÔ¼ö´ÜÀ§·Î °ü¸®ÇÏ°í Æ¯È÷ Ŭ·¡½º À§ÀÚµå·Î ÀÎÇØ °ü¸®µÇ¹Ç·Î Ưº°
È÷ ½Å°æ¾²Áö ¾Ê¾Æµµ ¿øÇÏ´Â ±â´ÉÀ» Ãß°¡ÇÏ¸é µË´Ï´Ù.

À̺¸´Ù MFCÀÇ Æ¯Â¡Àº ¸¹Àºµ¥ Á¦°¡ ´Ù ´Ã¾î ³õÀ» ¼ö´Â ¾ø°í, ½ÇÁ¦·Î
µ¶ÀںеéÀÌ Á¦ÀÛÀ» Çϸ鼭 ÇǺηΠ´À³¢´Â °ÍÀÌ ºü¸¦°Ì´Ï´Ù.

 


2. À©µµ¿ìÁî ¸ðµå¿¡¼­ÀÇ ¸Þ¼¼Áö ±¸Á¶

¾Õ¼­ ¹è¿î Ç®½ºÅ©¸° ¸ðµå¿¡¼­´Â Application°ú FrameÀ̶ó´Â µÎ°³ÀÇ
Ŭ·¡½º¸¦ ÀÌ¿ëÇß´Ù. ±×°ÍÀº º°µµÀÇ È­¸é °»½ÅÀÌ ÇÊ¿ä¾ø´Ù ¾µ¶§ ¾ø´Â
¸Þ¼¼Áö·Î ÀÎÇØ ¹ø°Å·Î¿òÀ» ¾ø¾Ö±â À§Çؼ­ÀÌ´Ù.
Ưº°È÷ Åø¹Ù¶ó´ø°¡ ¸Þ´º°¡ ³ª¿À´Â °Íµµ ¾È´Ñµ¥ µµ±Ô¸àÆ® ¸Þ¼¼Áö´Ï
ºä¸Þ¼¼Áö°¡ ÇÊ¿ä¾ø±â ¶§¹®ÀÌ´Ù.
À̹æ¹ý¸»°íµµ ¾ÆÀ̾˷α׸¦ ÀÌ¿ëÇØ ÇÏ´Â ¹æ¹ýÀÌ Àִµ¥Ã³À½ ¼Ò½º¸¦
»ý¼ºÇÒ¶§ ´ÙÀ̾˷α׷Π»ý¼ºÇÏ¸é ¸¹Àº ·®ÀÇ ¸Þ¼¼Áö°¡ ¾ø´Âµ¥ À̰Í
À» »ç¿ëÇØ¼­ °ÔÀÓÀ» Á¦ÀÛÇÏ´Â ¹æ¹ýµµ ÁÁÀ» °ÍÀÌ´Ù.

±×·¸´Ù¸é À̹øÁ¦ÀÛÇÏ´Â À©¸ðµå¿ë °ÔÀÓÀº ¾î¶²½ÄÀ¸·Î ¸Þ¼¼Áö°¡ ±¸¼º
µÇ¾î ÀÖ³ª¸¦ »ìÆìº¸¸é

  +- Application : CDemoApp class
  |
  +- Frame       : CMainFrame class
  |
  +- Document    : CDemoDoc class
  |
  +- View        : CDemoView class

¿ÀÀ×? ±âÁ¸ÀÇ ¸Þ¼¼Áö¿Í ÀüÇô ´Ù¸¦°ÍÀÌ ¾ø³×? À½~ ÀÌÀÌ»óÀÇ ¸Þ¼¼Áö´Â
µ¶ÀںеéÀÌ ÇÊ¿äÇÑ ´ÙÀ̾˷α׸¦ »ý¼ºÇÒ¶§ ÇÊ¿ä ÇÏÁö¸¸ Á¦°¡Á¦½ÃÇÏ´Â
MFC·Î ¿¡´Ï¸ÞÀ̼ÇÀÌ µÇ´Â ÇÁ·Î±×·¥Àº ÀÌÁ¤µµ Ŭ·¡½º¸é ÃæºÐÇÕ´Ï´Ù.

À̹ø¿¡ Á¦À۵Ǵ À©¸ðµå¿ëÀº Ç®¸ðµå¿¡ ºñÇØ View ºÎºÐÀÌ °­Á¶°¡ µÇ´Â
ºÎºÐÀÌ´Ù. ±×·¯¹Ç·Î À̺κÐÀ» »ó¼¼È÷ Áý°í ³Ñ¾î °¡µµ·Ï Çϰí ÀÏ´Ü °¢
°¢ÀÇ ¸Þ¼¼Áö¿¡ ´ëÇØ ¾Ë¾Æ º¸°í Áö³ª°¡ÀÚ~

 1) CAboutDlg ´Â µµ¿ò¸»À» ó¸®Çϱâ À§ÇÑ ºÎºÐÀ̵¥ Ưº°ÀÌ ½Å°æ¾µ°Ç
    ¾ø½À´Ï´Ù. ´Ù¸¸ ¸®¼Ò½º °ü¸®±â¿¡¼­ µµ¿ò¸»ÀÌ ³ª¿À´Â ¹Ú½º¸¦ À̸®
    Àú¸® ¸ð¾çÀ» ³»¾î ¸ÚÀ» µé¿© ³õÀ¸¸é ³¡~

 2) CDemoApp ¿¡¼­ »ç¿ëµÇ´Â ÁÖµÈ ±â´ÉÀº Idle Time¹ß»ýÇÏ´Â °ÍÀ» ÀÌ
 ¿ëÇØ µ¶ÀںеéÀÌ ÇÊ¿ä·Î ÇÏ´Â ±â´ÉÀ» »ç¿ëÇÏ¸é µË´Ï´Ù.

 3) CMainFrame ¿¡¼­´Â Áö³­¹ø°ú´Â ´Ù¸£°Ô Á߿伺Àº ¶³¾îÁø´Ù. ÇÏÁö¸¸
    ¾øÀ¸¸é ¾ÈµÇ´Â Ŭ·¡½ºÀÔ´Ï´Ù. ±×·¯¸é ¾î¶² ±â´ÉÀ» ÷°¡ÇÏ´À³Ä?
    ¹Ù·Î Åø¹Ù¸¦ »ý¼ºÇÏ°í ¸Þ´ºÀ» »ý¼ºÇϰí, ±×¸®°í °¡Àå Áß¿äÇÑ À©µµ
    ¿ìÀÇ ±âº» ¹ÙÅÁÀÌ µÇ´Â È­¸é ¹Ú½ºÀÇ µðÀÚÀÎÀ» ÇØ¾ß °ÚÁÒ~ ÀÌ°Ç Áö
    ³­¹ø ½Ã°£¿¡ À̾߱â ÇßÀ¸´Ï ±×°ÍÀ» ÂüÁ¶~

 4) CDemoDoc ÇöÀç ¿¡´Ï¸ÞÀ̼ÇÀ» ±¸ÇöÇϹǷΠº°µµÀÇ ¹®¼­¸¦ °ü¸®ÇÒ ÇÊ
    ¿ä´Â ¾øÁö¿ä~ ±×·¯´Ï À̺κÐÀº ½Å°æÀ» ²¨µµ µË´Ï´Ù. Ç㳪 Áö¿ì°Å
    ³ª ¾ø¾Ö¸é Å©³ªÅ« ¿À·ù°¡....(ÀÌ°É Áö¿ï°æ¿ì °¨´çÇÒ ¹®Á¦´Â ÇãÇã~
    ¾îÂîµµ¸®·±Áö?)

 5) CDemoView µåµð¾î °¡Àå Áß¿äÇÑ ÀÌŬ·¡½º´Â À©¸ðµåÀÇ °ÔÀÓÁ¦ÀÛ¿¡
    Áö´ëÇÑ ¿µÇâ·ÂÀ» ¹ßÈÖÇϴ Ŭ·¡½º¶ó°í ÇØµµ °ú¾ðÀÌ ¾Æ´Ï¶ó ÇÕ´Ï´Ù
     


3. Application ¸Þ¼¼ÁöÀÇ ±¸¼º

À̹ø¿¡ Á¦ÀÛÇÏ´Â Application ¸Þ¼¼Áö´Â Áö³­¹ø°ú º°´Ù¸¥ °ÍÀº ¾ø´Ù
ÇÏÁö¸¸ Áö³­¹øº¸´Ù ¼ö¿ùÇÏ´Ù ¿Ö³Ä¸é ½¬´Â ½Ã°£À» üũÇÏ´Â ÇÔ¼öÀ̿ܿ¡
Ãß°¡ ÇÔ¼ö¸¦ À̰÷¿¡ ÁýÁßÇÒ Çʿ䰡 ¾ø´Ù.

¸Þ¼¼ÁöÁß OnIdle¸¦ Ãß°¡Çؼ­ ´ÙÀ½°ú °°Àº ¼Ò½º¸¦ ¾à°£ ¼öÁ¤À» ÇØÁØ´Ù.

BOOL CMfcddex3App::OnIdle(LONG lCount)
{
        CWinApp::OnIdle (lCount);
        // Find the active view:
        CDemo3View* pActiveView = (CMfcddex3View*)((CMainFrame*)
                                 (m_pMainWnd))->GetActiveView ();
        return pActiveView->updateFrame ();
}

¿©±â¼­ CDemo3View Ŭ·¡½º´Â ¾Õ¼­ ¼³¸íÇßÁö¸¸ À©¸ðµå¿¡¼­ »ç¿ëµÇ´Â ¸ð
µç 󸮴 View¿¡ ÀÖÀ¸¹Ç·Î ±×°÷¿¡ È­¸é °»½Åó¸® ÇÔ¼ö°¡ ÀÖ´Ù ±×·¯¹Ç
·Î À̰÷ ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ¸Þ¼¼ÁöÁß ½¬´Â ½Ã°£¿¡ È­¸éÀ» °»½Å ÇØÁÖ°Ú±Ý
Çϸé ÀÏ´Ü ÀÚµ¿ Çø³ÇÎÀÌ ÀϾ°ÚÁö¿ä~

¿Í¿ì...½±´Ù ½¬¿ö~ ½¬¿î°Ç ´©±¸³ª ÇÒ¼ö ÀÖ´Â °ÍÀÌÁÒ~ MFCµµ ´©±¸³ª ÇÒ
¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù.

 

[Âü°í] ¸®¼Ò½º·Î Á¦ÀÛµÈ ´ÙÀ̾ó·Î±×ÀÇ ¸Þ ¼¼Áö

º¸Åë µ¶ÀÚºÐÀÌ Á¦ÀÛµÈ ´ÙÀ̾ó·Î±×¸¦ È­¸é¿¡ ¶Ù¾î¾ß Çϴµ¥ ¾î¶»°Ô ÇØ
¾ß ÇÒ±î? API¿¡¼­´Â ´ÙÀ̾ó·Î±×¸¦ ¶ç¿ì±â À§ÇØ DialogBox()¶ó´Â ÇÔ¼ö
¸¦ ÀÌ¿ëÇØ¼­ »ý¼ºÇϰí EndDialog()·Î ´Ý°í ÇßÀ» °Ì´Ï´Ù.

ÇÏÁö¸¸ MFC¿¡¼­´Â ÇØ´ç ¸®¼Ò½ºÀÇ À̸§À» Ŭ¸¯Çϸé DoDataExchange¶ó
´Â ÇÔ¼ö°¡ Àִµ¥ ´ÙÀ̾ó·Î±×¸¦ ÃʱâÈ­¿Í »ý¼ºÀ» ÇØÁÝ´Ï´Ù. ÀÌ·¸°Ô
ÇϹǷΠ½±°Ô µî·ÏÀ» ÇÒ ¼öÀÖ½À´Ï´Ù.
À̿ܿ¡µµ ¸®¼Ò½ºÀÇ ±â´ÉÀ» Ãß°¡ÇϱâÀ§ÇØ Command ÇÔ¼ö°¡ »ý±é´Ï´Ù.
ÀÌ·± °ÍÀº Á÷Á¢ ¸Þ ¼¼Áö ·¹ÆÛ·±½º³ª MFCÀÇ Àб⠱¦ÂúÀº Ã¥À» ÀÐ¾î º¸½Ã
¸é ÀÚ¼¼È÷ ³ª¿É´Ï´Ù.

                                         - fjudy -

 


°­ÀÇ ÁÖÁ¦ : DirectX¸¦ MFC¿¡¼­ »ç¿ëÇÏÀÚ~

  Á¦ 1Àå MFC·Î ±¸ÇöÇÏ´Â Ç®½ºÅ©¸° ó¸® ¹æ¹ý

      1. DirectXÀÇ Æò¸é ±¸Á¶¿Í ±âº» Ŭ·¡½º ±¸¼º
      2. ½ÇÁ¦ MFCÀÇ ¸Þ¼¼Áö ¸Ê ±¸¼º

  Á¦ 2Àå MFC·Î ±¸ÇöÇÏ´Â À©µµ¿ì ¸ðµå ó¸® ¹æ¹ý

      1. MFCÀÇ Æ¯Â¡°ú ¸Þ¼¼Áö ±¸Á¶
      2. DirectX »ç¿ë À§Ä¡¿Í ÀüüÀûÀÎ ÇÁ·Î±×·¥


¿¡±¸±¸....4¹øÂ° ¸¶Áö¸· ±ÛÀ» ½á¾ß Çϴµ¥ ÀÌ°É ±ô¹Ú ÀØ°í ´Ù¸¥ ÀÏÀ»
ÇÏ´Ùº¸´Ï...
ÀÎÅͳݿ¡ µ¹¾Æ ´Ù´Ï´Ù º¸¸é  Á¦ ±ÛÀÌ ÀÌ °÷ Àú °÷¿¡ ÀÖ´õ±º¿ä~ ^^;
¸¹ÀÌ Àоî ÁÖ½Ã°í °øºÎÇϽô ºÐµé²² °¨»ç µå¸®¸ç, ¾ÕÀ¸·Î ´õ¿í ´Ù¾ç
ÇÑ ÁÖÁ¦·Î °­Á Ȱµ¿À» ÇÒ±î ÇÕ´Ï´Ù.
Áö±Ý ÀÛ¾÷(¸·³ëµ¿)ÇÏ´Ù°¡ ³¯»õ°í ±ÛÀÌ ½áÁú±î ½Í³×¿ä?

 

 1. ´ÙÀÌ·ºÆ®¸¦ »ý¼ºÀ» ÇØ¾ß Çϴµ¥?

MFC¸¦ »ç¿ëÇϸ鼭 Ãʺ¸Àڷμ­ óÀ½¹®Á¦°¡ ¾îµð¿¡ ´ÙÀÌ·ºÆ® ¿¢½ºÀÇ ÃÊ
±âÈ­¸¦ ¾î´À ºÎºÐ¿¡ ÇØ¾ß ÇÒ±î? ¾î¶² Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡´Ù ³õ¾Æ¾ß ÇÒ±î
? ¾Æ´Ï¸é º°µµÀÇ »ý¼ºÀ̳ª ÃʱâÈ­¸¦ Çϱâ À§ÇÑ ¸Þ ¼¼Áö°¡ Á¸ÀçÇÏ´Â °Í
Àº ¾Æ´Ò±î? ÀÌ·± »ý°¢À» ÇÕ´Ï´Ù.

 # ÇÁ·Î±×·¡¸Ó°¡ ¾Ë¾Æ¾ß ÇÒ ¸í¾ð -----------------------------------

ÇÁ·Î±×·¡¸Ó°¡ »ý°¢ÇÑ ¸ðµç »ý°¢Àº ¸ðµÎ ÇÁ·Î±×·¥À¸·Î Á¦ÀÛÀÌ °¡´ÉÇÏ´Ù.
±×·¯¹Ç·Î Áö±Ý »ý°¢ÇÏ´Â °Í¿¡ ´ëÇØ Àß¾ÈµÈ´Ù¸é ±×°ÍÀº ±æÀ» ¹ß°ßÀ» ¸ø
ÇßÀ»»Ó! ¾ðÁ¨°¡´Â ±×°ÍÀ» Á÷Á¢ Á¦ÀÛÇÒ ¼ö ÀÖ´Ù.
-----------------------------------------------------------------

±×·¸´Ù¸é ´ÙÀÌ·ºÆ® ¿¢½º¸¦ ÃʱâÈ­Çϱâ À§ÇÑ ¸Þ¼¼Áö´Â ¾î¶²°ÍÀÎ ±æÀ»
ã¾Æ º¸ÀÚ~

MFC 3ÆíÀÇ °­Á¿¡ À̹ø¿¡ À©¸ðµå·Î Á¦ÀÛÀº View¸¦ Áß½ÉÀ¸·Î Á¦ÀÛÀ» ÇÑ
´Ù°í Çß´Ù. ±×·¸´Ù¸é ´«Ä¡°¡ ÀÖ´Â µ¶ÀÚ¶ó¸é Ŭ·¡½º À§Àڵ带 view Ŭ
·¡½º¿¡ ¸ÂÃß¾î ³õ°í ¾ÕÀ¸·Î Á¦ÀÛµÉ ¸Þ¼¼ÁöµéÀ» ÀÔ·ÂÇÒ Áغñ¸¦ Çϰí ÀÖ
À» °ÍÀÌ´Ù.

À©µµ¿ìÁ ´ÙÀÌ¾Ë·Î±× ¹Ú½ºÀÇ Ã³¸® ¹æ¹ýÀ» ¾Ë¾Æ º¸ÀÚ~
ÀÏ´Ü ¼ö¸¹Àº À©µµ¿ìÁî°¡ È­¸é¿¡ ¶°ÀÖ´Ù. ±×¸®°í ±×¼Ó¿¡¼­ ÀÚ½ÅÀÌ Á¦
ÀÛÇÑ ´ÙÀ̾˷α׳ª À©µµ¿ìÁî°¡ ¶ã¶§ óÀ½ ÇѹøÀº »ý¼º°ú µ¿½Ã¿¡ È­¸é
¿¡ º¸¿©Áö°Ô µÈ´Ù. ±×¸®°í ±× ´ÙÀ½ºÎÅÍ´Â º¯È­µÈ °Í¸¸ À©µµ¿ìÁîÀÚ¿ø¿¡
¸Þ¼¼Áö¸¦ º¸³»¾î º¯È­µÈ ºÎºÐÀ» °»½ÅÇØÁØ´Ù. À̰ÍÀÌ GUI ÀÇ ÇÙ½É ¾Ë°í
¸®Áò Áï, Ä¿³ÎÀÇ À̺κп¡ ÇØ´çÇÏ´Â ºÎºÐÀ̶ó°í ÇÒ¼ö Àִµ¥ ÇÏ¿©°£
±íÀÌ µé¾î°¥ ÇÊ¿ä¾øÀÌ ¿©±â±îÁö¸¸ À̾߱â Çϰí(±Ã±ÝÇϽŠºÐÀº ½Ã½ºÅÛ
ÇÁ·Î±×·¥À̳ª ¿î¿µÃ¼Á¦¿¡ ´ëÇØ °ü·Ã ¼­ÀûÀÌ ¼­Á¡¿¡ ÁñºñÇϹǷΠ¿©±â¼­
¹ø¿ª¼­ÀûÀº ¾²·¹±âÀÌ°í ¿ø¼­µéÀ» »çº¸½Ã´Â °ÍÀÌ ÀÖ¾î¿ä~ Ã¥Àº »¡°­»ö,
³ë¶û»ö, ÆÄ¶û»öÀ¸·Î ¸¹ÀÌ ³ª¿Í ÀÖ´õ±º¿ä~ ^^;) MFCÀÇ ¸Þ¼¼Áö ±¸Á¶µµ
ÃÖÃÊÀÇ ÃʱâÈ­¸¦ ÇØÁÖ´Â ºÎºÐ°ú ³ªÁß¿¡ °»½ÅÀÌ µÇ´Â ºÎºÐ, ±×¸®°í ÇÊ
¿ä½Ã À¯ÀúÀÇ °­Á¦¸Þ¼¼Áö³ª ¾î¶² ¿ÜºÎÀÇ ¸Þ¼¼Áö·Î ÀÎÇØ º¯È­¸¦ °»½ÅÇÏ
±âÀ§ÇÑ ¸Þ¼¼Áö·Î ³ªÀ§¾î Áý´Ï´Ù.

#Âü°í
À©µµ¿ìÁî ¸Þ¼¼Áö °ü·ÃµÈ Á¤º¸´Â À©µµ¿ìÁî NT ¼­ÀûÀÌ ÀÚ¼¼È÷ ³ª¿Í ÀÖÀ¸
¹Ç·Î À©µµ¿ìÁî NT°ü·Ã ÇÁ·Î±×·¡¹Ö Ã¥À» Âü°í Çϼ¼¿ä~ (°æÁ¦°¡ ¾î·Á¿ì
´Ï Ã¥À» »ç½ÃÁö ¸¶½Ã°í µµ¼­°üÀ̳ª ¼­Á¡¿¡¼­ Àо Âü°í¸¸Çϼ¼¿ä~
±×·³ µµ¿òÀÌ µÉ°Ì´Ï´Ù. ¿©À¯°¡ ÀÖÀ¸½Å ºÐÀº NT°ü·Ã ¼­Àûµµ ÇѱÇÀº °¡
Áö°í °è½Ã´Â °Íµµ ... ^^; )

±×·¸´Ù¸é ÀÏ´Ü ÃÖÃÊ¿¡ »ý¼ºÀ» Çϸ鼭 ´ÜÇѹø¸¸ ¸Þ¼¼Áö°¡ ¹ß»ýµÇ´Â ÇÔ
¼ö¸¦ ¸¸µé¾î º¸ÀÚ¸é ¿ª½Ã Ŭ·¡½º À§ÀÚµå·Î °¡¼¼¿ä~ (ÀÌ¹Ì °¡ ÀÖ´Ù±º¿ä
~)
¸Þ¼¼ÁöÁß¿¡ OnInitialUpdate¸¦ ¼±ÅÃÇØ¼­ º¸¸é

void Ŭ·¡½º¾ßView::OnInitialUpdate()
{
        CView::OnInitialUpdate();
        
      //  ´ÙÀÌ·ºÆ® ¿¢½º¸¦ »ý¼ºÇÑ´Ù. 640x480ÀÇ Å©±â·Î
        m_DD.Create (*this, 640, 480);

      // ÆÄ·¹Æ®¸¦ »ý¼ºÇϰí
        m_Palette.Create ();
        m_DD.SetPalette (m_Palette);


      // À¯Àú°¡ »ç¿ëÇÒ Æò¸éÀ» »ý¼º
        m_Surface.Create();

      ............
      ............
}

º¸Åë º¸¿©Áֱ⠰ü·Ã Ŭ·¡½º´Â CView¿¡¼­ »ó¼ÓÀ» ¹Þ½À´Ï´Ù. ±×·¯´Ï
CViewÀÇ ÇüÀ» Âü°íÇÏ´Â °ÍÀº ´ç±ÙÀÌÁÒ? ´ÙÀÌ·ºÆ®¿¢½º´Â ÇϳªÀÇ ÇÁ·Î±×
·¥¿¡ Çѹø¸¸ »ý¼ºÀÌ µÇ´Ï À§ÀÇ ¸Þ¼¼Áö°¡ ÀÌÁ¶°Ç¿¡ ¸ÂÀ¸´Ï ÇÊ¿äÁ¶°ÇÀÎ
°Í°ú µ¿½Ã¿¡ ÃæºÐÁ¶°ÇÀÌÁÒ~ (À×? ÇÊ¿ä´Â ¾Æ´Ñµí~~--;)


 2. Âï¾î Áֱ⵵ ÇØ¾ß Çϴµ¥...

È­¸é¿¡ ÇϳªÀÇ º¯È­°¡ »ý±â¸é ±×°ÍÀ» ±×·ÁÁÖ´Â ¸Þ¼¼Áö´Â ´ç¿¬ÀÌ ÀÖ¾î
¾ß È­¸é¿¡ ¹«¾ð°¡°¡ µîÀåÇÕ´Ï´Ù. ¾ø¾îµµ µÇÁö¸¸ ±×·¡µµ ÀÖÀ¸¸é ....
±×·¯¹Ç·Î À̰ÍÀ» °¡´ÉÇÏ°Ô ÇØÁÖ´Â ¸Þ¼¼Áö¸¦ ã¾Æ º¸ÀÚ¸é (µÚÀûµÚÀû~)
À×? ´©±¸ÁÒ? Paint¸¦ ¾²½Ã´Ù°í ÇϽźÐÀÌ?
Paintµµ ¸Â±äÇÕ´Ï´Ù¸¸ Á¦°¡ ¿©±â¼­ ±¸ºÐÀ» º°µµ·Ï ¢±â´Â ¹¹ÇÏÁö¸¸ ÀÎ
À§¼º¹®Á¦·Î Paint¿Í Draw¸¦ ±¸ºÐÀ» Áþ´Âµ¥ ÀÏ´Ü ÀÚ¿¬ÀûÀÎ °ÍÀ» Ãß±¸ÇÏ
´Â ÇÊÀڷνã Draw¸¦ ¾²·Á°í ÇÕ´Ï´Ù.

void Ŭ·¡½º¸Â¾ÆView::OnDraw(CDC* pDC)
{
        CMfcddex3Doc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);

        // TODO: add draw code for native data here
}

¿ä·¸°Ô »ý¼ºÀÌ µÇ¾î ÀÖÁÒ? ÀÌ ºÎºÐÀº ¹Ù²Ù°Å³ª Ãß°¡ÇÒ°Ç ¾ø½À´Ï´Ù. ´Ù
¸¸ µ¶ÀÚ´ÔµéÀÌ Ãß°¡ÇÏ½Ç °ÍÀÌ ÀÖÀ¸½Ã´Ù¸é Ãß°¡ÇØ ³ÖÀ¸¼Åµµ µË´Ï´Ù.

±×·¸´Ù¸é ¿©±â¼­ ½ÇÁ¦·Î °ÔÀÓÀ» ÁøÇàÇÏ´Â ºÎºÐÀº ¾î´À ºÎºÐÀϱî?

¾Õ¼­¼­ ¹è¿î Àüü¸ðµå MFC¸¦ »ý°¢Çغ¸ÀÚ °Å½Ã¼­´Â ¾ÖÇø®ÄÉÀÌ¼Ç Å¬·¡½º¿¡
È­¸éÀ» º¹±¸ÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î ¸¶Ä¡ µµ½ºÀÇ °ÔÀÓÀ» Á¦ÀÛÇϵí Á¦ÀÛÀ»
Çß´Ù. À̹ø¿¡µµ ´Ù¸¦ °ÍÀº ¾ø´Ù.

µµ½º¿¡¼­ °ÔÀÓÀ» Á¦ÀÛ ÇÒ ¶§ Main¿¡ ¸ù¶¥ Áý¾î ³Ö´Â ¹æ¹ýó·³ ´ÙÀ½ ÇÔ¼ö
´Â ±×·¯ÇÑ ¹æ½ÄÀ¸·Î ÄÚµùÀÌ µÇ¾î ÀÖ±ä Çѵ¥

BOOL Ŭ·¡½º¸¶Á®View::Main()
{
//      if (!((CMainFrame*)m_pMainWnd)->m_bActive)
//              return FALSE;
// Ȱ¼ºÈ­°¡ µÇ¾î ÀÖ´À³Ä?¿¡ °ü·ÃµÈ º¯¼öÀÇ °ªÀ» Âü°íÇÏ´Â °ÍÀε¥
// ÀÌÇÁ·Î±×·¥¿¡¼­ ¹è°æÀ» º¹±¸Çϴµ¥ ÇÊ¿ä¾ø´Ù.
    DWORD               thisTickCount; // ½Ã°£À» äũÇϱâÀ§ÇÑ
    RECT                rcRect;
    DWORD               delay[4] = {50, 78, 13, 93};
    int                 i;
    PALETTEENTRY        pe[256]; // ÆÄ·¹Æ®¸¦ ´ã±âÀ§ÇÑ
    HRESULT             ddrval;

    // ÇöÀç ½Ã°£À» º¸°£Çϰí
    thisTickCount = GetTickCount();
    for(i=0; i<3; i++)
    {
        if((thisTickCount - m_lastTickCount[i]) > delay[i])
        {
            // Move to next frame;
            m_lastTickCount[i] = thisTickCount;
            m_currentFrame[i]++;
            if(m_currentFrame[i] > 59)
                m_currentFrame[i] = 0;
                        // Added to move the sprites.
                        if (++m_xpos[i] > (640-64))
                                m_xpos[i] = 0;
                        if (++m_ypos[i] > (480-64))
                                m_ypos[i] = 0;
        }
    }

    // 640x480ÀÇ ÇÑ ÇÁ·¹ÀÓÀ» °¡Á®¿À±â À§ÇÑ ±×¸² Å©±â
    rcRect.left = 0;
    rcRect.top = 0;
    rcRect.right = 640;
    rcRect.bottom = 480;
    while( 1 )
    {
        ddrval = m_DD.BackBuffer().BltFast (0, 0, m_Surface, rcRect,
                                                DDBLTFAST_NOCOLORKEY );

        if( ddrval == DD_OK )
        {
            break;
        }
        if( ddrval == DDERR_SURFACELOST )
        {
            restoreAll();
        }
        if( ddrval != DDERR_WASSTILLDRAWING )
        {
            return TRUE;
        }
    }
    if(ddrval != DD_OK)
    {
        return TRUE;
    }

    for(i=0; i<3; i++)
    {
        rcRect.left   = m_currentFrame[i]%10*64;
        rcRect.top    = m_currentFrame[i]/10*64 + 480;
        rcRect.right  = m_currentFrame[i]%10*64 + 64;
        rcRect.bottom = m_currentFrame[i]/10*64 + 64 + 480;

        while( 1 )
        {
            ddrval = m_DD.BackBuffer().BltFast (m_xpos[i], m_ypos[i],
                                          m_Surface,rcRect, DDBLTFAST_SRCCOLORKEY );

            if( ddrval == DD_OK )
            {
                break;
            }
            if( ddrval == DDERR_SURFACELOST )
            {
                restoreAll();
            }
            if( ddrval != DDERR_WASSTILLDRAWING )
            {
                return TRUE;
            }
        }
    }

  // Flip the surfaces
    while( 1 )
    {
        ddrval = m_DD.Paint (); // Âï¾î~ ¹«Á¶°Ç Âï¾î~
        if( ddrval == DD_OK )
        {
            break;
        }
        if( ddrval == DDERR_SURFACELOST )
        {
            restoreAll();
        }
        if( ddrval != DDERR_WASSTILLDRAWING )
        {
            break;
        }
    }

        return TRUE;
}

(À̰ŠMFC ¸Â¾Æ¿ä? ¸ð¾ç¸¸ MFC ¾Æ´Ï ¿¹¿ä? ) ¿ï ¶ö ¶ó~ ºÐ¸íÈ÷ À̹æ¹ýÀ»
»ç¿ëÇÏ¸é °ÔÀÓ Á¦ÀÛ ÅøÀ» SDI·Î ±¸¼ºÇÏ°í ´ÙÀÌ·ºÆ®ÀÇ Æò¸éÀ» Àâ°í º¹Àâ
ÇÑ Ã³¸®¾øÀÌ ÀÎÅÍÆäÀ̽º ºÎºÐÀ» ½Å°æ ½á¼­ ÅøÀ» Á¦ÀÛÇÒ ¼ö ÀÖ´Ù.


´Ù½Ã Á¤¸®¸¦ ÇÏÀÚ¸é~

 1. ¸Þ ¼¼Áö¸¦ ±¸¼ºÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æ¾ß ÇÑ´Ù.

 2. ´ÙÀÌ·ºÆ® ¿¢½º¸¦ MFC¿¡ ÀÀ¿ëÇÏ´Â ¹æ¹ýÀº ´Ù¾çÇÏ´Ù.
    1) ´ÙÀ̾ó·Î±×·Î »ý¼ºÇؼ­ Á¦ÀÛ
    2) µµÅ¥¸ÕÆ®¿Í ºä °¡ ¾øÀÌ Á¦ÀÛÇÑ´Ù.
    3) À©µµ¿ì ¸ðµå¿¡¼­ Ãæµ¹¾øÀÌ »ç¿ëÇÑ´Ù.
    3) ±âŸ ¹æ¹ý

 3. ¾îµð¿¡¼­ »ý¼ºÇÏ°í ¾îµð¼­ ¼Ò¸êÀ» ÇÏ´ÂÁö¸¦ ÆÄ¾ÇÇÑ´Ù.
    [ ¸Þ ¼¼Áö ºÐ¼®À» ÅëÇÑ À§Ä¡°áÁ¤ ]

 4. ÀÀ¿ë ÇÁ·Î±×·¥½Ç·ÂÀ» ½×´Â´Ù.

Á¦°¡ À§ÀÇ 2¹ø¿¡¼­ 2),3)À» ´Ù·ç¾î º¸¾Ò´Âµ¥ ¾ÕÀ¸·Î ±âȸ°¡ ÀÖ´Ù¸é
±âŸ¹æ¹ýÀ» ¾Ë·Á µå¸®°í º¸´Ù ´Ù¾çÇÑ ¹æ¹ýÀÌ ³ª¿Í µ¶Àںе鲲¼­ ¼±ÅÃ
À» ÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¶§°¡ ¿À±â¸¦ ¹Ù¶ó¸é¼­ ´ÙÀÌ·ºÆ® ¿¢½º¸¦ MFC
¿¡¼­ »ç¿ë ÇÏÀÚ ÆíÀ» ¸¶°¨ÇϰڽÀ´Ï´Ù.

¾ÕÀ¸·Î º¸´Ù ºü¸¥ ¹æ¹ýÀ¸·Î È­¸é¿¡ Âï´Â ¹æ¹ý, 3Â÷¿ø À½ÇâÈ¿°ú ó¸®
¹æ¹ý, ±âŸ Á¦°¡ °¡Áö°í ÀÖ´Â Á¤º¸¸¦ ±â¼úÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù.

ÀÌ¹Ì ¾Ë°í °è½Ã´Â ºÐµéÀº ¾Æ¹« °Íµµ ¾Æ´ÏÁö¸¸ óÀ½ °øºÎÇϰųª Á¢ÇÏ´Â
ºÐµé¿¡°Ô ¸¶¶¥ÇÑ ÀÚ·á°¡ ¾ø¾î °í»ýÇϽô ºÐµéÀ» »ý°¢ÇÏ¸é ²Ï µµ¿òÀÌ                
µÇ´Â ±ÛÀ» Àû¾î º¸¾Ò½À´Ï´Ù.
                                                - fjudy -