¾È³çÇϼ¼¿ä~ ÀÌÁØ°ï(LeeChen) ÀÔ´Ï´Ù. ¸¹Àº ºÐ²²¼­ "¾ðÁ¦³ª °­Á¸¦ Çϳª¿ä?"¶ó°í ¸¹Àº Áú¹®À» ÇØ¿À½Ã´õ±º¿ä~ »ç½Ç 2D °­Á¸¦ Çسõ°í º»ÀÇ¾Æ´Ï°Ô ÀÚ·á°¡ ³¯¶ó °¡´Â ¹Ù¶÷¿¡~ (Á¦ Çϵ尡 °£È¤ ¸ØÃߴ ¢À» Çϰŵç¿ä~ ±×·¯¸é ½Ã½ºÅÛÀÌ ´Ù¿îÀÌ....) Áö³­¹ø¿¡´Â ÁÖ·Î API¸¦ À§ÁÖ·Î ´ÙÀÌ·ºÆ® ¿¢½º¸¦ ¼³¸íÀ» ÇÑ°Í °°½À´Ï´Ù. À̹ø¿¡´Â ¸¹Àº ·®ÀÇ °­Á´ ¾ÈµÉ°Í °°Àºµ¥ °£´ÜÇÏ°Ô Áý°í ³Ñ¾î °¡·Á°í ±ÛÀ» ¾²±â·Î ÇÏ¿´½À´Ï´Ù. ±â´Ù·Á Áֽô ºÐµéµµ °è½Ã°í Çؼ­... Á¦°¡ ´ÙÀÌ·ºÆ® ¿¢½º¶ó´Â °ÍÀ» óÀ½ Á¢ÇÑ°ÍÀº 2¹öÀü¶§ ¿´½À´Ï´Ù. ¹ú½á 2³âÀÌ»óÀÌ Áö³µ±º¿ä~ ±×ÈÄ·Î ¹öÀüÀÌ 3.0....5.2±îÁö ³ª¿Í Àִµ¥ ÀÌ¹Ì °ÔÀÓ °ü·ÃµÈ ·çƾÀº 3¹öÀü ¿¡¼­ È®°íÈ÷ ÀÚ¸®°¡ ÀâÈù °Í°°½À´Ï´Ù. 5.0Àº 3Â÷¿ø ±â´ÉÀ» Çâ»óÇÑÁ¡¿¡¼­ Á¶±Ý ³ª¾Æ Á³°í~ 5.2´Â DVD±â´ÉÀ» ÷°¡Çß´Ù°í ÇÏ´Â ±º¿ä~ ±×¸®°í ¾ÕÀ¸·Î ³ª¿Ã 6.0¿¡¼­´Â ¾î¶»°Ô ³ª¿ÃÁö´Â ¸ð¸£Áö¸¸ 3Â÷¿ø ±â´ÉÀÌ Opengl°ú È¥ÇÕÇüÅ·Π³ª¿Ã°Í °°´Ù´Â Àü¸ÁÀÌ ¸¹´õ±º¿ä~ Á¦°¡ º»°ÝÀûÀ¸·Î À̾߱â ÇÒ°Ç ÀÌ·± °ÑÄ¡ÀåÀÇ ±â´ÉÇâ»óÀÌ ¾Æ´Ñ ½Ç¼ÓÀÖ´Â ±â´É Çâ»óÀ» º¸ÀÚ¸é, »õ·Î¿î ÀÎÅÍÆäÀ̽º IDDVideoPortContainer, DirectDrawColorControl, IDirectDrawVideoPort, ±×¸®°í IDirectDrawSurface3Æ÷ÇÔ µÇ¾î ÀÖ°í, IDirectDrawSurface2°¡ º¸Ãæ °øÀ¯µÇ¾î ÀÖ°í. ÁÖ¿äÇÑ °³¼±µÈ Á¡Àº ³ÐÀº Ç¥¸éÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. »ç½Ç À̺κÐÀº Á¦°¡ ÀÎÅͳÝÀ» ÅëÇØ ¾òÀº ÀڷḦ ¹ø¿ªÇؼ­ ¿Ã¸®·Á´Ù ÀÌ·¸°Ô ´Ù½Ã ÆíÁý Çؼ­ ¿Ã¸³´Ï´Ù. °¢°¢À¸ ±â´ÉÀº ÀÌ¹Ì 5.0 ·¹ÆÛ·±½ºÀÇ ¼­µÎ¿¡ ³ª¿À´Â °ÍÀε¥ ÀÚ¼¼ÇÑ °ÍÀº ·¹ÆÛ·±½º¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä~ (Çؼ®ÀÌ ¾ÈµÇ½Ã´Â ºÐÀº Àú¿¡°Ô Áú¹®À» Áּŵµ µË´Ï´Ù. ) Áö±Ý ÀÎÅͳÝÀ» ÅëÇØ °ÔÀÓ ÄÄÇ»ÅÍ µ¿ÇâÀ» »ìÆì º¸¸é 3Â÷¿øÀ» °¡Áö°í Ä¡¿­ÇÑ ÀüÀïÀ» Ä¡·ç°í ÀÖ´õ±º¿ä~ ƯÈ÷ ¿ÀÇÂÁö¿¤À̳Ä~ ´ÙÀÌ·ºÆ®¿¢½º³Ä~ ÀÇ µÎÁø¿µÀÌ Ä¡¿­ÇÏ°í °£È¤ µ¶ÀÚÀûÀÎ ±×·¯³ª ±×¸® ÈûÀ» ¹ßÈÖÇÒ¼ö ¾ø´Â µ¶Àڳ뼱À» Ãß±¸ÇÏ´Â ÆÀÀ̳ª ȸ»çµµ ÀÖ´õ±º¿ä~ ¾î·°Å³ª 3Â÷¿ø¿¡¼­ ¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Â °ÍÀº ¿ÀÇÂÁö¿¤°ú ´ÙÀÌ·ºÆ® ¿¢½ºÀε¥ ¿ÀÇÂÁö¿¤Àº ÀÌ¹Ì ¸®´ª½º³ª À¯´Ð½º, ±×¸®°í ¼Ö¶ó¸®½º, ¿À¿¡½ºÅõ, À©µµ¿ìÁî 95µîµî ¸¹Àº ¿î¿µÃ¼Á¦¿¡¼­ »ç¿ëµÇ¾î ¿Ô°í ±â´É¶ÇÇÑ Æí¸®ÇÏ°Ô µÇ¾î ÀÖ¾î ÇÔ¼ö ·¹ÆÛ·±½º¸¸À» °¡Áö°í 3Â÷¿ø °¨°¢ÀÌ ÀÖ´Â(°³³äÀÌ ÀâÇô ÀÖ´Â) µ¶ÀÚ¶ó¸é ´©±¸³ª ±¸ÇöÇÒ¼ö ÀÖ°Ô µÇ¾î ÀÖ½À´Ï´Ù. ±×·± ¹Ý¸é ´ÙÀÌ·ºÆ® ¿¢½º´Â ºü¸£´Ù´Â °ÍÀ» Ãß±¸ÇÏÁö¸¸ ¿ö³« ¸¹Àº º¯¼ö¿Í ÀÎÀÚ¿ÍÀÇ ÀüÀïÀ» ÇѹÙÅÁÄ¡·ç°í ³­ÈÄ¿¡¾ß °¡´ÉÇÏ´Ï Á¶±Ý ¹ø°Å·Ó´õ±º¿ä~ ÇÏÁö¸¸ ´ÙÀÌ·ºÆ® 3Â÷¿øÀ» °¢ÀÚ º»ÀÎÀÇ ±¸¹Ì¿¡ ¸Â°Ô Àß ±¸¼ºÇسõ°í ³ª¸§µ¥·Î ÀÎÅÍÆäÀ̽º¸¦ ±¸¼º¸¸ µÈ´Ù¸é ¿ÀÇÂÁö¿¤º¸´Ù Æí¸®ÇÏ°Ô ¾µ¼öµµ ÀÖ°ÚÁÒ~ (ÀÌ°ÍÀº µ¶ÀÚÀÇ ¸ò!) ÀÏ´Ü ¸¹Àº µ¶ºÐµéÀÌ MFC¸¦ µÎ·Á¿öÇÏ°í ÀÖ´Â °Í °°¾Æ ´ÙÀÌ·ºÆ®¿¢½º¸¦ ¾î¶»°Ô Çϸé MFC¿Í ½±°Ô Á¢¸ñÇؼ­ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö¸¦ 2Â÷¿ø ÇÁ·Î±×·¥°ú 3Â÷¿ø ÇÁ·Î±×·¥À» °¢°¢ Á¦ÀÛÇϸ鼭 ¹è¿ö º¸µµ·Ï ÇÏÁÒ~ ( ¾à°£ ±ÛÀÌ ¾î»öÇÒ ¼öµµ Àִµ¥ ÀÚ·áÁß ¿ø¾î¸¦ ±×µ¥·Î ¹ø¿ªÇؼ­ ³ÖÀº ºÎºÐµµ ÀÖ´Ùº¸´Ï Á¶±Ý ÀÌ»óÇÒ ¼öµµ Àִµ¥ Á¦°¡ ³ª¸§µ¥·Î Á¤¸®ÇÏ·Á°í Çߴµ¥ ¾ÆÁ÷ ÀÚ·áµéÀÌ Á¤¸®°¡ ¾ÈµÇ¾î ÀÌ·¸°Ô ¼­µÑ·¯ ÀÛ¼ºÇØ ¿Ã¸³´Ï´Ù. ) . 1. 1. ´ÙÀÌ·ºÆ® ¿¢½ºÀÇ »ç¿ë ÀÌ¹Ì ¾Õ¼­ ÀúÀÇ ±ÛÀ» ÀÐÀ¸½Å ºÐÀ̳ª °øºÎ¸¦ ÇϽźÐÀº ´ÙÀÌ·ºÆ® ¿¢½º°¡ ¾î¶²°Å±¸³ª ÇÏ´Â °ÍÀ» ¾Æ½Ç°Ì´Ï´Ù. º¸´Ù ºü¸¥ ±×·¡ÇÈ Ã³¸®¸¦ À§ÇÑ µå¶óÀ̹öÀε¥, ÀÌ°ÍÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀº Ǯȭ¸éÀ» ´Ù ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú À©µµ¿ìÁî ¸ðµå·Î ÀÛ¼ºÇÏ´Â ¹æ¹ý µÎ°¡Áö°¡ ÀÖ´Ù´Â °ÍÀ» ¾Æ½Ç°Ì´Ï´Ù. ¸ð¸¥´Ù±¸¿ä~ ±×·¸´Ù¸é ÀÌ·¸°Ô µÎ°¡Áö·Î »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù. Àú´Â ´ÙÀÌ·ºÆ® ¿¢½º¸¦ »ç¿ëÇÒ¶§ IDirectDrawSurface2°ÍÀ» ÀÚÁÖ »ç¿ëÇϴµ¥ ÀÌÀ¯´Â ±âÁ¸ÀÇ ´ÙÀÌ·ºÆ® ¿¢½º¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù¸é ±×°Í°ú Ãæµ¹À» ÀÏÀ¸Å°Áö ¾ÊÀ¸·Á°í ÀÌ°ÍÀ» »ç¿ëÇÕ´Ï´Ù. º¸Åë IDirectDrawSurface¸¦ »ç¿ëÇÕ´Ï´Ù. ƯÈ÷ ¿Â¿¡¾î¶ó´Â TV¼ö½ÅÄ«µåÀÇ ÇÁ·Î±×·¥Àº IDirectDrawSurface¸¦ ÀÌ¿ëÇØ È­¸é¿¡ TV³»¿ëÀ» Âï´Âµ¥ ÀÌ°Í°úÀÇ Ãæµ¹À» ÀÐÀ¸Å°Áö ¾ÊÀ¸·Á¸é ´Ù¸¥ Surface¸¦ »ç¿ëÇؼ­ Ãâ·Â ÇÏ´Â °ÍÀÌ ³º°ÚÁÒ~ (ÀÌ°ÍÀº ¼­ÆäÀ̽ºÀÇ ¹öÀüÀÇ Â÷ÀÌ·Î »ý±ä °Ì´Ï´Ù. º¸´Ù ¾ÈÀü¼ºÀÌ ÀÖ°Ô Á¦À۵ȰÍÀÌ µÚ¿¡ ºÙ´Â ¼ýÀÚ°¡ Ä¿Áý´Ï´Ù. ÇöÀç(98.5)2¹öÀü±îÁö ³ª¿ÍÀÖ½À´Ï´Ù. ÀϹÝÀûÀ¸·Î ¼­ÆäÀ̽º¸¦ »ç¿ëÇÏ´Â ºÐµéµµ °è½Åµ¥ Á¶±Ý ¾ÈÁ¤ÀûÀÎ ¼­ÆäÀ̽º¸¦ »ç¿ëÇÏ´Â °Íµµ ±¦ÂúÀ» µíÇÕ´Ï´Ù.) ÀÏ´Ü ´ÙÀÌ·ºÆ® ¿¢½º¸¦ 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¸¦ À§ÁÖ·Î ÇÏ·Á°í ÇÕ´Ï´Ù. º¸´Ù °£ÆíÇϱ⠶§¹®ÀÌÁÒ~ MFC¸¦ ÀÌ¿ëÇØ Àüüȭ¸éÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¸ð»öÇغ¸°í ±×´ÙÀ½ â¸ðµå¿¡¼­ ÀÛ¾÷ÇÏ´Â ¹æ¹ýÀ» ¾Ë·Á µå¸®ÁÒ~ API¸¦ ¾²´Ù°¡ MFC¸¦ »ç¿ëÇغ¸¸é ÀÌ·¸°Ô Æí¸®ÇÑ °ÍÀ» ¸ô¶ú³ª ÇÒ °Ì´Ï´Ù. µÎ ¹ø´Ù½Ã´Â API¸¦ ¾È¾²Áö ¾ÊÀ»±î Çϳ׿ä~ Á¦2ÀÇ °­Á¿¡¼­´Â º»°ÝÀûÀÎ MFC¸¦ ÀÌ¿ëÇϵµ·Ï ÇÏÁÒ~ ---------------------------------------------- ½ÇÁ¦ MFCÀÇ ¸Þ¼¼Áö ¸Ê ±¸¼º 1.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Àå À©µµ¿ìÁî ¸ðµå¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æ º¸µµ·Ï ÇÏÁö¿ä~ Á¶±Ý º¹ÀâÇѵ¥ (¸Þ¼¼Áö°¡ ¸¹°Åµç¿ä~) ÇϳªÇϳª »ìÆì º¸¸é¼­ Á¦ÀÛÀ» Çغ¸µµ·Ï ÇÏÁö¿ä~ ---------------------------------------------- MFCÀÇ Å¬·¡½º¿Í ¸Þ¼¼Áö ±¸Á¶ ¹ú½á 3¹ø° °­ÀǸ¦ ÁغñÇØ¾ß ÇÏ´Â ½Ã°£ÀÌ µÇ¾ú±º¿ä. ¸Å¹ø °­Á¸¦ Áغñ Çϸ鼭 ¹«Ã´À̳ª ±äÀåµÇ°í °ÆÁ¤ÀÌ µË´Ï´Ù. ¿Ö³Ä±¸¿ä? ¾î¶»°Ô ÇÏ¸é º¸´Ù ½±°Ô µ¶Àںе鲲 ÀÌÇظ¦ ½ÃÄѵ帱±î ½ÍÀº ¸¶À½¿¡... ^^; À̹ø ½Ã°£ºÎÅÍ´Â ´ÙÀÌ·ºÆ® ¿¢½º¸¦ ÀÌ¿ëÇØ ¸Ê¿¡µðÅͳª ½ºÇÁ¶óÀÌÆ® µ¿ÀÛ ÅøÀ» Á¦ÀÛÇÒ¼ö ÀÖ´Â ±â¹ÝÀ» ´ÙÁö±â À§ÇÏ¿© MFC¸¦ ÀÌ¿ëÇÑ À©µµ¿ìÁî ¸ðµå¿ëÀ¸·Î °øºÎÇϵµ·Ï ÇսôÙ. 1. MFC·Î Á¦ÀÛµÈ ÇÁ·Î±×·¥ÀÇ Æ¯Â¡ ÀϹÝÀûÀ¸·Î °øÅëÀûÀΠǥÁØÀ» °¡Áö°í¼­ À©µµ¿ìÁî ÇÁ·Î±×·¥À» Á¦ÀÛÇÏ°Ô µË´Ï´Ù. ÀÌ°ÍÀº ÀÌ¹Ì API¸¦ °øºÎÇϸ鼭 À©µµ¿ìÁîÀÇ Ç¥ÁØÀ» µû¸£¸é¼­ ¹ß»ýµÇ´Â ÀÎÅÍÆäÀ̽ºÀÇ µðÀÚÀÎÀÇ Ç¥ÁØÈ­°¡ »ý±â¾î »ç¿ëÇÏ´Â À¯Àú·Î ÇÏ¿©±Ý È¥µ·À» ÀÏÀ¸Å´ÀÌ ¾øÀÌ Ã¼°è¼ºÀ» º¸¿©ÁÖ±â À§ÇÔÀÌ ¾Æ´Ò±î ÇÕ´Ï´Ù. ±×·± ¸é¿¡¼­ MFC·Î Á¦ÀÛÇϴµ¥¿¡µµ ¾î¶°ÇÑ °øÅëµÈ ÅëÀϼºÀÌ µû¸¨´Ï´Ù. Åø¹ÙÀÇ »ý¼º, µµ¿ò¸» º¸±â ±â´É, ¸Þ´º±â´É µîµî µµ½º½ÃÀý¿¡´Â º¹ÀâÇÏ°Ô Æ˾÷ÀÌ´Ï Ç®´Ù¿îÀÌ´Ï ¾ÆÀÌÄÜ »ý¼º ¹æ¹ýÀÌ´Ï ÇÏ¿© º°µµ·Î ¹è¿ì°í ½ÀµæÇؼ­ ó¸®ÇÏ´Ï À̸® Àú¸® ½Ã°£µµ °É¸®°í »ç¿ëÇÏ´Â »ç¶÷À¸·Î ÇÏ¿© ½Àµæ·Âµµ ÇÊ¿ä·Î ÇÏ°Ô Çß½À´Ï´Ù. ±×·¯³ª À©µµ¿ìÁî´Â ÅëÀÏµÈ ÀÎÅÍÆäÀ̽º·Î ½±°Ô Á¦ÀÛÇÏ°í »ç¿ëÇÏ´Â °ÍÀÌ ¸¶À½ÀÌ µéÁÒ~ ÀÚ~ ÇÊÀÚ°¡ ¿Ö ÀÌ·± ¸»À» Çß³Ä¸é ¹Ù·Î À©µµ¿ìÁî ¸ðµå·Î Á¦ÀÛÇÏ´Â ÇÁ·Î±×·¥¿¡ ÀÖ¾î ÀÎÅÍÆäÀ̽º ºÎºÐÀ» ½Å°æÀ» ¾È¾µ¼ö ¾ø´Ù´Â °ÍÀÌÁÒ~ ÇÏÁö¸¸ API¿¡¼­´Â ¾î¶»°Ô Çß³ª¿ä? ÀÏÀÏÀÌ ÇØ´ç ºÎºÐÀ» Á¦ÀÛÇØÁÖ¾î¾ß ÇßÁö¿ä~ ±×·¯³ª MFC´Â óÀ½ ÇÁ·ÎÁ§Æ® »ý¼º½Ã Á¶°Ç¿¡ ¸Â´Â ÄÚµå»ý¼ºÀÌ ÀÌ·ç¾îÁö¹Ç·Î ÀÎÇØ °£´ÜÇÑ ÀÎÅÍÆäÀ̽º´Â ±¸¼ºÀÌ µÇ¾î ÀÖ´Ù´Â °ÍÀÌÁÒ~ Áö±ÝÀÌ¶óµµ ½±°Ô »ý¼ºµÈ ¼Ò½º¸¦ F7¸¦ ´­·¯ ÄÄÆÄÀÏÈÄ ½ÇÇàÀ» Çغ¸½Ã¸é ½±°Ô ¾Æ½Ç°Ì´Ï´Ù. 1.1 ¸Þ¼¼ÁöÀÇ ½¬¿î °ü¸® ÀÌ°Ç 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ÀÇ Àб⠱¦ÂúÀº Ã¥À» ÀÐ¾î º¸½Ã¸é ÀÚ¼¼È÷ ³ª¿É´Ï´Ù. ¡¡ ---------------------------------------------------------------- DirectX »ç¿ë À§Ä¡¿Í ÀüüÀûÀÎ ÇÁ·Î±×·¥ 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Â÷¿ø À½ÇâÈ¿°ú ó¸® ¹æ¹ý, ±âŸ Á¦°¡ °¡Áö°í ÀÖ´Â Á¤º¸¸¦ ±â¼úÇØ º¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. ÀÌ¹Ì ¾Ë°í °è½Ã´Â ºÐµéÀº ¾Æ¹«°Íµµ ¾Æ´ÏÁö¸¸ óÀ½ °øºÎÇϰųª Á¢ÇÏ´Â ºÐµé¿¡°Ô ¸¶¶¥ÇÑ ÀÚ·á°¡ ¾ø¾î °í»ýÇϽô ºÐµéÀ» »ý°¢ÇÏ¸é º° µµ¿ò ¾ÈµÇ´Â ±ÛÀ» Àû¾î º¸¾Ò½À´Ï´Ù. ( ?? ¾î»öÇÑ ¹®±¸.... ) ------------------------------------------------------------ MFC¿¡¼­ D3D 8.0 »ç¿ëÇϱâ(Åø¸¸µé¶§ ¿ëÀÌ) Âü°í·Î ÀÌ°­Á´ ¿Ü±¹»çÀÌÆ®¸¦ ¹ø¿ª±â·Î ¹ø¿ªÇؼ­ ¿Å±ä°ÍÀÌ¶ó ¹®¸ÆÀÌ ¾ÕµÚ°¡ ¾î»öÇÒ¼ö ÀÖ½À´Ï´Ù. ÀÌ°­Á´ Àú¿¡°Ô °³ÀÎÀûÀ¸·Î "MFC¿¡¼­ D3D¸¦ ºÙÀÏ·Á±¸ Çϴµ¥ ¾î¶»°Ô ÇØ¾ß Çϳª¿ä?"¶ó´Â °ü·ÃÁú¹®À» ¸¹ÀÌ ÇØ¿À¼Å¼­ À̳»¿ëÀ» ½Ã°£ÀÌ ¾ø´Â °ü°è·Î ±×³É ĸÃÄÇؼ­ ¿Ã¸³´Ï´Ù. °³ÀÎÀûÀ¸·Î ½Ã°£ÀÌ ¸¹´Ù¸é °­Áµµ ¾²°í Ã¥µµ ¾²°í ½ÍÁö¸¸... ÀÌ·¡Àú·¡ Çΰè·Î ¸øÇÏ°í Àֳ׿ä~ ^^; ±×·³.µµ¿òÀÌ µÇ¼ÌÀ¸¸é ÇÕ´Ï´Ù. Direct3D¸¦ MFC·Î ÀÌ¿ëÇÏ´Â ¹æ¹ý ¡¡Direct3D¸¦ ÀÌ¿ëÇÑ ÅøÀ» ÀÛ¼ºÇÏ´Â °æ¿ì¿¡´Â, Win32SDK¸¦ ÀÌ¿ëÇصµ ÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, MFC¸¦ ÀÌ¿ëÇÏ´Â ÆíÀÌ ¹«¾ùÀΰ¡ Æí¸®ÇÑ ÀÏÀÌ ¸¹´Ù°í »ý°¢ÇÕ´Ï´Ù. °Ô´Ù°¡ µåÅ¥¸ÕÆ®ºä¾ÆÅ°Å×ũü¿Í °øÁ¸ÇÒ ¼ö ÀÖÀ¸¸é(ÀÚ) ´õ¿í´õ ÅøÀÌ ¸¸µé±â ½¬¿öÁö°ÚÁö¿ä. ¶Ç, MFC¸¦ »ç¿ëÇØ Direct3D¸¦ ÀÌ¿ëÇÏ´Â Çؼ³Àº ¾îµð¸¦ ã¾Æµµ ´«¿¡ ¶çÁö ¾Ê±â ¶§¹®¿¡, MFC¸¦ »ç¿ëÇÑ Direct3DÀÇ ÃʱâÈ­ ¹æ¹ýÀ» ¼Ò°³ÇÕ´Ï´Ù. Á¶±ÝÀÌ¶óµµ ¿©·¯ºÐÀÇ Âü°í°¡ µÇ¸é ´ÙÇàÀÔ´Ï´Ù. ¶Ç, ¿©±â¿¡¼­´Â MFCÀÇ °£´ÜÇÑ Áö½ÄÀ̳ª Direct3DÀÇ ÃʱâÈ­ ¹æ¹ýÀº ±âÁ¸ÀÇ °ÍÀ¸·Î ÇØ Çؼ³ÇØ °¥ °ÍÀÔ´Ï´Ù. MFC³ª Direct3DÀÇ ÃʱâÈ­ ¹æ¹ýÀº, ¿©·¯°¡Áö °÷¿¡¼­ Çؼ³µÇ°í Àֱ⠶§¹®¿¡, ±× ÂÊÀ» ºÁ ÁÖ¼¼¿ä. ÀÌÂÊÀ¸·ÎºÎÅÍ»ùÇÃÀ» ´Ù¿î·ÎµåÇÒ ¼ö ÀÖ½À´Ï´Ù. »ùÇÿ¡¼­´Â, Direct3D¸¦ ÃʱâÈ­Çϴ Ŭ·¡½º CDirect3D Ŭ·¡½º¸¦ ÀÛ¼ºÇØ, CView Ŭ·¡½ºÀÇ base class·Î ÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀº, DirectXSDK ºÎ¼ÓÀÇMFCFog»ùÇ÷Î, CD3DApplication Ŭ·¡½º¸¦ CFormView Ŭ·¡½ºÀÇ base class·Î ÇÏ°í ÀÖÀ¸¹Ç·Î, ¶È°°ÀÌ ÇÏ°í ÀÖ½À´Ï´Ù. CDirect3D Ŭ·¡½º´Â, CD3DApplication Ŭ·¡½ºÀÇ MFC ´ëÀÀ °£ÀÌÆÇÀ̶ó°í »ý°¢ÇØ ÁÖ¼¼¿ä. -------------------------------------------------------------------------------- 1¡¡¾îÇø®ÄÉÀÌ¼Ç Ã¼Á¦¸¦ ÀÛ¼º ¿ì¼± óÀ½¿¡, üÁ¦¸¦ ÀÛ¼ºÇսôÙ. MFC¡¡AppWizard·Î,ÀÛ¼ºÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀÇ Á¾·ù¸¦ SDI,¹®¼­/ºä¾ÆÅ°Å×ũü¸¦ ¼­Æ÷Æ®¿¡ üũ¸¦ ³Ö¾î ÈÄ´Â Àû´çÇÏ°Ô ¿É¼ÇÀ» ºÙ¿© ÀÛ¼ºÇØ ÁÖ¼¼¿ä. ÀÌ ½ÃÁ¡¿¡¼­ ÀÌÇÏÀÇ Å¬·¡½º°¡ ¿Ï¼ºµË´Ï´Ù. CxxxApp CMainFrame CxxxDoc CxxxView ¿©±â·ÎºÎÅÍ, Direct3D¸¦ ÃʱâÈ­ÇØ ³ª°¡´Â °ÍÀÔ´Ï´Ù¸¸, Direct3DÀÇ Ç¥½Ã¸¦ ¸Ã´Â Ŭ·¡½º, Áï, Direct3DDevice8¿Í °ü·ÃÁþ´Â Ŭ·¡½º´Â ¾î¶² °ÍÀÌ ÁÁÀ»±î¿ä? µð¹ÙÀ̽º´Â, À©µµ¿ì¿Í °ü·ÃÁöÀ¸¹Ç·Î, ÀÌ ¾È¿¡¼­´Â,CMainFrame Ŭ·¡½º, ȤÀºCxxxView Ŭ·¡½º¶ó´Â °ÍÀÌ µË´Ï´Ù. ¶Ç, µåÅ¥¸ÕÆ®ºä¾ÆÅ°Å×ũü¸¦ ä¿ëÇÏ°í ÀÖÀ¸¹Ç·Î, µð¹ÙÀ̽º¿Í °ü·ÃÁþ´Â Ŭ·¡½º´Â, Ç¥½Ã¸¦ ¸Ã´Â Ŭ·¡½º, ÁïCxxxView Ŭ·¡½º¶ó´Â °ÍÀÌ µË´Ï´Ù. CMainFrame Ŭ·¡½º¿Í µð¹ÙÀ̽º¸¦ °ü·ÃÁöÀ» ¼ö ÀÖ½À´Ï´Ù¸¸, µåÅ¥¸ÕÆ®ºä¸¦ ÀÌ¿ëÇÑ ÅøÀ» ÀÛ¼ºÀ̶ó°í ÇÏ´Â °ÍÀ̹ǷÎ, ¿©±â¿¡¼­´Â Àǹ̰¡ ¾øÀ» °ÍÀÔ´Ï´Ù. 2¡¡Direct3D¸¦ ÃʱâÈ­ÇÑ´Ù ±×·³,CxxxView Ŭ·¡½º¿¡ Direct3DÀÇ ÃʱâÈ­ 󸮸¦ Ãß°¡ÇØ ³ª°©½Ã´Ù. ±× Àü¿¡, ¾îµð¿¡¼­ Direct3DÀÇ ÃʱâÈ­ 󸮸¦ ½Ç½ÃÇϸé ÁÁÀº °ÍÀϱî¿ä? µð¹ÙÀ̽º¸¦ ÀÛ¼ºÇÒ ¶§´Â, À¯È¿ÇÑ À©µµ¿ì ÇÚµéÀÌ ÇÊ¿äÇÏ°Ô µË´Ï´Ù. ±× ¸»Àº, ¹ú½á À©µµ¿ì´Â ÀÛ¼º ³¡³­ »óÅ·Π¾øÀ¸¸é ¾ÈµË´Ï´Ù. ¾îÇø®ÄÉÀ̼ÇÀÇ ÃʱâÈ­ 󸮴Â,CxxxApp::InitInstance ÇÔ¼ö°¡ ´ã´çÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ ÇÔ¼ö Áß(¾È)¿¡¼­ Direct3DÀÇ ÃʱâÈ­ 󸮸¦ È¥ÀÚ¼­ ¸Ã¾Æ ó¸®Çصµ µÉ °ÍÀÔ´Ï´Ù. ¿©±â¿¡¼­´Â,CxxxView Ŭ·¡½º°¡ Direct3DÀÇ ÃʱâÈ­¸¦ ´ã´çÇϱâ·Î ÇÏ°Ú½À´Ï´Ù. CxxxView Ŭ·¡½º¿¡¼­ ÃʱâÈ­¸¦ ½Ç½ÃÇÏ´Â °æ¿ì,CView::OnInitialUpdate ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵å(override) ÇØ, Direct3DÀÇ ÃʱâÈ­¸¦ ½Ç½ÃÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀÔ´Ï´Ù. DirectXSDK »ùÇÿ¡¼­µµ ±×·¸°Ô ÇÏ°í ÀÖ½À´Ï´Ù ÇØ¡¤¡¤¡¤. ÃʱâÈ­ ÄÚµå´Â ÀÌÇÏ¿Í °°ÀÌ µÉ±î¿ä. void CxxxView::OnInitialUpdate() { CView::OnInitialUpdate(); HWND hDevice, hFocus; HRESULT hr; // À©µµ¿ì ÇÚµéÀÇ Ãëµæ hDevice = GetSafeHWnd(); hFocus = GetTopLevelParent() ->GetSafeHwnd(); // À©µµ¿ìÀÇ Å¬¶óÀ̾ðÆ® ¿µ¿ªÀ» Ãëµæ GetClientRect(&m_rcClient); // Direct3D ¿ÀºêÁ§Æ®ÀÇ ÀÛ¼º m_pD3D = Direct3DCreate8(D3D_SDK_VERSION); // µð½ºÇ÷¹ÀÌ ¸ðµåÀÇ Ãëµæ D3DDISPLAYMODE d3ddm; m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm); // D3DPRESENT_PARAMETERS ±¸Á¶Ã¼ÀÇ ¼³Á¤ ::ZeroMemory(&m_d3dpp, sizeof(m_d3dpp)); m_d3dpp.Windowed = TRUE; m_d3dpp.BackBufferCount = 1; m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; m_d3dpp.EnableAutoDepthStencil = TRUE; m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16; m_d3dpp.hDeviceWindow = hDevice; m_d3dpp.BackBufferWidth = m_rcClient.Width(); m_d3dpp.BackBufferHeight = m_rcClient.Height(); m_d3dpp.BackBufferFormat = m_d3ddm.Format; // µð¹ÙÀ̽º ÀÛ¼º hr = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hFocus, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_d3dpp, &m_pd3dDevice); /* Áß·«¡¤¡¤¡¤ */ // ÃʱâÈ­ ¿Ï·á m_bReady = TRUE; } ÅøÀ̹ǷÎ, À©µµ¿ì ¸ðµå·Î ÃʱâÈ­ÇÏ°í ÀÖ½À´Ï´Ù. ¶Ç, Æ÷Ä¿½º À©µµ¿ì¸¦ Åé ·¹º§ À©µµ¿ì, µð¹ÙÀ̽º À©µµ¿ì¸¦ CxxxView, ¹é ¹öÆÛÀÇ »çÀÌÁî´Â µð¹ÙÀ̽º À©µµ¿ìÀÇ Å¬¶óÀ̾ðÆ® ¿µ¿ª ÀüüÀûÀ¸·Î ÃʱâÈ­ÇÏ°í ÀÖ½À´Ï´Ù. ±×·±µ¥ ¿©´ãÀÌ µË´Ï´Ù¸¸, Æ÷Ä¿½º À©µµ¿ì¶õ ´©±¸Àϱî¿ä? ÇïÇÁ¿¡´Â ÀÌÇÏ¿Í °°ÀÌ ¾²¿©Á® ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº, IDirect3D8::CreateDevice ÇÔ¼öÀÇ Àμö, hFocusWindowÀÇ ¼³¸íÀÔ´Ï´Ù. hFocusWindow [in] ÀÌ Microsoft Direct3D µð¹ÙÀ̽º·Î Æ÷Ä¿½º¸¦ ¼³Á¤ÇÏ´Â À©µµ¿ì ÇÚµé. ÁöÁ¤ÇÏ´Â À©µµ¿ì´Â, Ç® ½ºÅ©¸°ÀÇ ÃÖ»óÁ¤µµ À©µµ¿ì°¡ ¾Æ´Ï¸é ¾ÈµÈ´Ù. ÀÛ¼ºÇÏ´Â µð¹ÙÀ̽ºÀÇ Æ÷Ä¿½º-(¿µ) focus (n)¡¡1, ÃÊÁ¡¡¡2, Á᫐ £º´ÙÀ̽´Ä­ ¡¸GENIUS¡¹º¸´Ù-Áï, ÀÛ¼ºÇÏ´Â µð¹ÙÀ̽ºÀÇ Áß½ÉÀÌ µÇ´Â À©µµ¿ì¶ó°í ÇÏ´Â °ÍÀΰ¡. ÀÌ°ÍÀ¸·Î, Direct3DÀÇ ÃʱâÈ­´Â ¿Ï·áÀÔ´Ï´Ù. ÈÄ´Â, ¹¦È­ ¸Þ¼¼Áö¿¡ ÀÀÇØ ¹é ¹öÆÛÀÇ ³»¿ëÀ» Ä«ÇÇÇϸé OKÀÔ´Ï´Ù. ¹¦È­ ¸Þ¼¼Áö¿¡ ´ëÀÀÇÑ´ÙCxxxView::OnDraw ÇÔ¼ö´Â ÀÌÇÏ¿Í °°ÀÌ ±âºÐÀÌ µì´Ï´Ù. void CxxxView::OnDraw(CDC* pDC) { CxxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(m_bReady) { m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0, 1.0f, 0); if(SUCCEEDED(m_pd3dDevice->BeginScene())) { // ¿©±â¿¡ Àå¸éÀ» ¹¦È­ ÇÕ´Ï´Ù m_pd3dDevice->EndScene(); } m_pd3dDevice->Present(NULL, NULL, NULL, NULL); } } ÀÌ°ÍÀ¸·Î, ºôµå ÇØ ½ÇÇàÇØ º¸¼¼¿ä. Àß ½ÇÇàÇÒ ¼ö ÀÖÀ»±î¿ä. ¿©±â¿¡´Â ¾²°í ÀÖÁö ¾Ê½À´Ï´Ù¸¸, CxxxView°¡ ÆıâµÉ ¶§¿¡¼­µµ, Direct3DÀÇ Á¾·á ó¸®-Direct3DDevice8, Direct3D8 ¿ÀºêÁ§Æ®ÀÇ Çعæ-¸¦ ÀØÁö ¾Ê°í °¡ ÁÖ¼¼¿ä. Á¦´ë·Î µ¿ÀÛÇÒ °ÍÀÔ´Ï´Ù. ±×·¯³ª, À¯°¨½º·´Áö¸¸ ÀÌ »óÅ¿¡¼­´Â Å͹«´Ï¾ø°Ô µ¿ÀÛÀÌ ´Ê¾îÁý´Ï´Ù. ±× ¿øÀÎÀº ¹«¾ùÀΰ¡? ÀÚ¼¼ÇÑ ³»ºÎ »çÁ¤Àº ¸ð¸¨´Ï´Ù¸¸, ¾Æ¸¶, ÀÛ¼ºÇÏ´Â ¹é ¹öÆÛ¿Í À©µµ¿ìÀÇ Å¬¶óÀ̾ðÆ® ¿µ¿ªÀÇ »çÀÌÁî¿¡ Â÷ÀÌ°¡ ÀÖ´Â °Í °°½À´Ï´Ù. ÀÌ·¯ÇÑ »çÀÌÁî°¡ ´Ù¸£¸é(ÀÚ), Direct3D´Â, Present ÇÔ¼ö¸¦ ½ÇÇàÇϸé(ÀÚ) ¸¶À½´ë·Î È®´ë Ãà¼Ò 󸮸¦ ÇØ À©µµ¿ì¿¡ Ä«ÇÇÇÕ´Ï´Ù. ÀÌ Ã³¸®°¡ Å͹«´Ï¾ø°í ´Ê±â ¶§¹®¿¡, ÀüüÀÇ µ¿ÀÛÀÌ ´Ê¾îÁý´Ï´Ù. GDI ¹¦È­ ¶§¿¡, DIB È­»óÀÇ ÆøÀ» DWORD °æ°è¿¡ °®Ãß°í ÀÖ¾ú½À´Ï´Ù¸¸, ±×°Í°ú ´àÀº °Í °°Àº °ÍÀϱî¿ä? ±×·¸´Ù Ä¡´õ¶óµµ ÀÌ ´ÊÀ½Àº, °ßµô ¼ö ÀÖ´Â °ÍÀÌ ¾Æ´Õ´Ï´Ù. DirectXSDK »ùÇÃÀ» ½ÇÇàÇØ, À©µµ¿ì¸¦ Àû´çÇÑ Å©±â¿¡ º¯°æÇصµ µ¿ÀÛ¿¡ ÁöÀåÀ» ÃÊ·¡ÇÏ´Â ÀÏÀº ¾ø±â ¶§¹®¿¡, ´õÁÁÀº ¹æ¹ýÀº ÀÖÀ» °ÍÀÔ´Ï´Ù. °ü·Ã Âü°í»çÀÌÆ® http://www.gamedev.net/reference/articles/article1778.asp http://www.devx.com/premier/mgznarch/vcdj/2000/07jul00/mf0007/mf0007.asp http://codeguru.earthweb.com/directx/index.shtml http://www.hackorama.com/d3dview/ ---------------------------------------------------------------- MFC À©µµ¿ì ÇÁ·Î±×·¥ ÀÛ¼º¹ý¹× ±¸Á¶ 1. ¸ÕÀú Visual C++ 5.0 ºÎÅÍ 6.0±îÁöÀÇ ºñÁÖ¾ó ÄÄÆÄÀÏ·¯¸¦ °¡Áö°í ¼³¸íÀ» ¿«¾î³ª°¡·Á°í ÇÑ´Ù. Visual C++ÀÇ ÃֽŠ¹öÀüÀ» ÀÌ¿ëÇÔÀº º¸´Ù Æí¸®ÇÏ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ƯÈ÷ 5.0°ú 6.0Àº Â÷ÀÌ°¡ ¸¹ÀÌ ³­´Ù. ºñÁÖ¾ó 6.0Àº ºñÁÖ¾ó º£ÀÌÁ÷°ú °°Àº ÇÔ¼öÀÇ Çü½ÄÀ» ¹Ì¸® º¸¿©ÁÖ´Â ±â´ÉÀÌ À־ »ç¿ëÀÌ Æí¸®ÇÏ´Ù. ¹°·Ð ÄÄÆÄÀÏ·¯ÀÇ ¼º´Éµµ ÁÁ¾Æ Á³´Ù. ±×·¯³ª ¿ë·®ÀÌ Àå³­ÀÌ ¾Æ´Ï´Ù. MSN±îÁö ±ò¸é ´ë·« 600MÁ¤µµ°¡ µÈ´Ù. MFC³ª API·Î Â¥³ª º°»ó°üÀº ¾ø´Ù. °ÔÀÓ¿¡¼­ ÇÁ·Î±×·¡¹ÖÇÏ´Â ºÎºÐÀº °ñ°ÝÀ̶ó´Â °ÍÀÌ Á¸ÀçÇϱ⠿¡ .. ´ÜÁö ¸¹Àº Visual C++·Î ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â »ç¶÷µéÀÇ °í¹ÎÀÌ ÀÌ ¸¹Àº À©µµ¿ì ÇÔ¼öÁß¿¡¼­ µð´Ù ¹«½¼ ÇÔ¼ö¸¦ ½á¼­ ±¸ÇöÀ» ÇؾßÇÏ´ÂÁö°¡ ¸Á¸ÁÇϱ⠶§¹®¿¡ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ù°¡ Æ÷±â¸¦ ÇÏ´Â °æ¿ì°¡ Çã´ÙÇÏ´Ù°í »ý°¢ÀÌ µÈ´Ù. óÀ½¿¡´Â ¾Æ¸¶ Visual C++ ¿Ïº®°¡À̵å¿Í °°Àº Ã¥À» º¼ °ÍÀÌ´Ù. °¨À» Àâ±â À§Çؼ­... ±× ´ÙÀ½¿¡ Á¶±Ý ¼÷·ÃµÇ¸é ·¹ÆÛ·±½º¸¦ º¸°Ô µÉ °ÍÀÌ´Ù. ±×¸®°í ÇÔ¼ö ã´Â µ¥¿¡ ½Ã°£À» º¸³»°ÔµÉ °ÍÀÌ ´Ù. ÇÁ·Î±×·¡¸Ó°¡ º¸´Â Ã¥Áß¿¡¼­ Á¦ÀÏ ÁÁÀº Ã¥Àº ¸¶ÀÌÅ©·Î ¼ÒÇÁÆ®¿¡¼­ ³ª¿Â 3±ÇÂ¥¸® ·¹ÆÛ·±½º ÀÏ °ÍÀÌ´Ù. 3±ÇÂ¥¸®°¡ ¾à 15¸¸¿øÁ¤µµ ÇÏ´Â °Í °°´Ù. ¹°·Ð ¿ø¼­ÀÌ´Ù. À̰͸¸Å­ ÁÁÀº Âü°í¼­´Â ¾øÀ» °ÍÀ̸ç, ÀÌ °­Á¸¦ µè´Â ¿©·¯ºÐµéµµ ÀÌ ·¹ÆÛ·±½º¸¸À» °®°í ÇÁ·Î±×·¥ À» Â¥´Â ³¯ÀÌ »¡¸® ¿À±â ¹Ù¶õ´Ù. 2. °ÔÀÓÇÁ·Î±×·¡¹ÖÀ» °£´ÜÈ÷ ¸»ÇÏÀÚ¸é ¹«ÇÑ ·çÇÁ¼Ó¿¡¼­ °¢Á¾ÀÇ À̺¥Æ®¸¦ ó¸®ÇÑ´Ù°í ¸»ÇÒ ¼ö ÀÖ´Ù. °ÔÀÓÀ» ÇÏ´Ù°¡ °©ÀÚ±â EscapeÅ°°¡ µé¾î¿À¸é 󸮸¦ ÇØ¾ß ÇÏ´Â µ¥ ¾îµð¼­ 󸮸¦ ....... ±×·³ Visual C++¿¡¼­ÀÇ ¹«ÇÑ ·çÇÁ´Â ¾îµðÀϱî? DOS¿¡¼­ÀÇ ÇÁ·Î±×·¥ÀÇ ¹«ÇÑ·çÇÁÀÇ ½ÃÀÛÀº main() ÀÏ °ÍÀÌ´Ù. ±×·³ À©µµ¿ì ÇÁ·Î±×·¥Àº ¾îµðÀϱî? ÀÌ·± °ÍµéÀ» ÇϳªÇϳª ÀÌÇØÇÏ°í ±×¿ø¸®¸¦ ã¾Æ ³ª °¡¸é µÈ´Ù. ÇÑ°¡Áö ±â¾ïÇÒ °ÍÀº µµ½º¿Í À©µµ¿ì ÇÁ·Î±×·¡¹ÖÀÌ Æ²¸° °ÍÀÌ ÀÖ´Ù. Á¦ ³ª¸§´ë·Î Á¤ÀǸ¦ ÇÑ´Ù¸é µµ½º´Â »ç¿ëÀÚÀÇ ÀÎÅÍÆäÀ̽º Áï ÀÔ·ÂÀ» ¹Þ¾ÆµéÀÌ´Â Çü½ÄÀ» ÇÁ·Î±× ·¡¸Ó°¡ Á¤ÀǸ¦ ÇÏ¿´´Ù. ±×·¯³ª À©µµ¿ì·Î ³Ñ¾î¿À¸é¼­ ÀÌ·± °ÍµéÀÌ ÅëÀÏ µÇ¾ú´Ù. Áï »ç¿ëÀÚ·Î ÇÏ¿©±Ý Çϳª¿¡¸¸ Àͼ÷Çϵµ·Ï À¯µµ¸¦ ÇÑ °ÍÀÌ´Ù. ±×°ÍÀÌ ¹Ù·Î ´ÙÀ̾ó·Î±× ¹Ú½º¿Í °°Àº °ÍµéÀÌ´Ù. Áï »ç¿ëÀÚ´Â ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ ÅëÇÏ¿©¼­ ¼±Åø¸ ÇÏ¸é ½ÇÇàµÇµµ·Ï ÇÏ¿© »ç¿ëÀÚÀÇ »ç¿ë¹æ¹ýÀ» ÅëÀÏ ½ÃÄ×´Ù. ÀÌ¿Í °°Àº °ÍÀ» ÇÁ·Î±×·¡¸Ó ÀÔÀå¿¡¼­ º¸¸é ºÒ¸¸ÀÏ ¼öµµ ÀÖ´Ù. ¾î¼·ª~~~ ±×·³ ÀÌ¿Í °°Àº °ÍÀº ¾î¶»°Ô ÇؾßÇÒ±î? °ÆÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ¸ðµç °ÍµéÀÌ Å¬·¡½º·Î ¸¸µé¾îÁ® ÀÖ´Ù. ¿ì¸®´Â Ŭ·¡½º¸¦ Á¤ÀÇÇÏ°í »ç¿ëÇÏ°í ReturnµÇ¾î¼­ ¿À´Â °ªÀ» °¡Áö°í ÀÌ·± Àú·± 󸮸¦ ÇØÁÖ¸é µÈ´Ù. Class´Â ¸ðµç °ÍÀ» °£ÆíÈ­ ½ÃÄ×´Ù. ¶ÇÇÑ Àü¿ªÇÔ¼öÀÇ »ç¿ëÀ» ¹èÁ¦Çϵµ·Ï ÇÏ¿©¼­ ÇÁ·Î±×·¥À» ´Ü¼ø È­ ½ÃÄ×°í, ÇÁ·Î±×·¥À» Àд »ç¶÷µéµµ Á¶±ÝÀº ÆíÇÏ´Ù. ±×·¯³ª ³Ê¹« ¸¹Àº »ó¼ÓÀº ÀбⰡ Èûµé´Ù. ³»°¡ °æÇèÇÑ ¹Ù·Î´Â ±×·¸´Ù. 3~4°³Á¤µµ°¡ »ó¼ÓÀÌ µÇ¸é µµ¹«Áö ¹¹°¡ ¹ºÁö........ ¾î¶»°Ô º¸¸é Ŭ·¡½º¸¦ ºÐ¼®ÇÏ´Â °Íµµ OOPÀÇ °³³ä¿¡´Â À§¹è°¡ µÈ´Ù. ºÐ¼® ½Ã°£°ú ÄÚµù ½Ã°£À» ÁÙÀ̱â À§ÇÑ °ÍÀÌ ¹Ù·Î Ŭ·¡½ºÀ̴ϱñ ¸»ÀÌ´Ù. ±×³É Á¤ÀÇÇÏ°í »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ´ëÇÐ ´Ù´Ò ¶§ ¸ð ±³¼ö´Ô²²¼­ ¾ÕÀ¸·Î´Â Ŭ·¡½º¸¦ ´Ù¾çÇÏ°Ô °¡Áö°í ÀÖ´Â ÇÁ·Î±×·¡¸Ó°¡ Àß³ª°¡°Ô µÉ °ÍÀ̶ó°í ÇϽŠ¸»¾¸ÀÌ ±â¾ïÀÌ ³­´Ù. ÁÁÀº Ŭ·¡½º´Â ÄÚµåÀÇ Àç»ç¿ë½Ã¿¡ °³¹ß ±â°£À» ´ÜÃàÇØÁØ´Ù. ¿Ö? ±×³É ¾²¸é µÇ´Ï±ñ? ±×·¯¸é °ÔÀÓÀÇ ±âº» °ñ°ÝÀ» ¸¸µé°í °Å±â´Ù°¡ »ìÀ» ºÙ¿© º¸ÀÚ. 3. ¸ÕÀú °ÔÀÓ °ñ°ÝÀ» ¸¸µé¾î º¸ÀÚ. MFC¸¦ ÀÌ¿ëÇϱ⿡ ClassWizard¸¦ ÀÌ¿ëÇϱ⿡ º¸´Ù °£ÆíÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù. °ÔÀÓÀ» ¸¸µé °æ¿ì¿¡´Â MFC¿¡¼­´Â App Class¿Í MainFrame Class¸¸ ÀÖÀ¸¸é µÈ´Ù. ÀÌ°ÍÀº MFCÀÇ »ó¼Óµµ¸¦ Á¶±Ý º¸±â ¹Ù¶õ´Ù. µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ¸ÕÀú ¿ì¸®´Â App Class¿Í MainFrame Class¸¸À» ³²±â°í ¸ðµÎ Áö¿ìÀÚ. Çϳª Çϳª Áö¿ì±â°¡ Èûµé °ÍÀÌ´Ù. °£´ÜÇÑ ¹æ¹ýÀÌ ÀÖ´Ù. ¿ì¼± App¿Í MainFrame Ŭ·¡½º¿Í Çì´õ¸¸ ³²±â°í ³ª¸ÓÁö´Â ÇÁ·ÎÁ§Æ®¿¡¼­ Áö¿î´Ù. ÀÌÁ¦ Build¸¦ ½ÃÄѼ­ ÄÄÆÄÀÏÀ» ½ÃÅ°¸é ¿¡·¯°¡ ¶á´Ù. ÇÁ·ÎÁ§Æ®¿¡¼­ ºüÁ³±â ¶§¹®¿¡ ÀÌÁ¦ ±×ºÎºÐÀ» Áö¿ö³ª°¡¸é µÈ´Ù. ±×¸®°í ÀÌÁ¦ ÄÄÆÄÀÏÀ» ´Ù½Ã ½ÃÅ°¸é error 0 waring 0ÀÌ ³ª¿À¸é Á¦°Å°¡ ¿Ïº®ÇÏ°Ô µÈ °ÍÀÌ´Ù. ¿©±â¼­´Â API¿Í MFC¸¦ ºñ±³Çϸ鼭 ¼³¸íÀ» ÇÒ °ÍÀÌ´Ù. MFC´Â °á±¹¿¡´Â API¸¦ ÇÑ ´ë ¹­Àº °ÍÀ̱⠶§¹®ÀÌ´Ù. MFCÀÇ ±âº»Àº °á±¹ APIÀ̱⠶§¹®¿¡ API·Î ÇÁ·Î±×·¥À» ÇÏ´ø»ç¶÷Àº MFC¸¦ º¸¸é ±Ý¹æ ´«Ä¡¸¦ ç ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¸´Ù°í Çؼ­ API¸¦ Ç϶ó´Â °ÍÀº ¾Æ´Ï´Ù. ¾î´À ȨÆäÀÌÁö¿¡¼­´Â API·Î ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °ÍÀ» ¾î¼ÀÇø®¸¦ ÇÏ´Â °Í¿¡ ºñÀ¯ÇÑ »ç¶÷µµ ÀÖ´Ù. ¸ðµÎ Àå´ÜÁ¡ÀÌ ÀÖ´Ù. ³ªµµ ÀÌ ºÎºÐ¿¡ ´ëÇؼ­ °í¹ÎÀ» ¸¹ÀÌ ÇÑ »ç¶÷Áß¿¡ ÇÑ»ç¶÷ÀÌ´Ù. ±Ùµ¥ ±× ¿ø¸®¸¦ µé¿©´Ù º¸°Ô µÇ´Ï, API³ª MFC³ª ¶È°°´õ¶ó´Â °ÍÀ» ±Ý¹æ ¾Ë ¼ö ÀÖ°Ô µÇ¾ú´Ù. °á±¹ ·ÎÁ÷ÀÌ°í, °á±¹ CÀÇ ÁÖÀ§¸¦ ¸Éµµ´Â Á¤µµ¶ó´Â °ÍÀ» ...... ÀÚ ±×·¯¸é ½ÃÀÛÇØ º¸ÀÚ. APIÀÇ ±¸Á¶¸¦ º¸¸é WinMain()¿Í WndProc()·Î ÀÌ·ç¾î Á® ÀÖ´Ù. WinMain()´Â À©µµ¿ìÀÇ µî·ÏÀ»ÇÏ´Â ºÎºÐÀÌ´Ù. ÀÌ ºÎºÐÀº App class¿Í °°´Ù. App ClassÀÇ InitInstance()°¡ ±×¿Í °°Àº ¿ªÇÒÀ» ÇÑ´Ù. ±×·³ WndProc()¸¦ º¸ÀÚ . À̺κÐÀº °¢Á¾ Å°º¸µåÀÇ ÀÔ·ÂÀ» ó¸®ÇÏ°í ±×¸®°í ¸Þ½ÃÁö¸¦ ó¸®ÇÑ´Ù. Áö±Ý ´çÀå ClassWizard¸¦ ½ÇÇà½ÃÅ°°í MainFrmaeÀ» ¼±ÅÃÇÏ°í, ±×ÂÊÀ¸·Î¿À´Â °¢Á¾ À©µµ¿ì ¸Þ½ÃÁö ¸¦ º¸¶ó. ¾î¶ó! WndProc()¿¡¼­ Ç¥Çö ÇÒ ¼ö ÀÖ´Â ¸ðµç ¸Þ½ÃÁö°¡ MainFrame class·Î ´Ù µé¾î¿ÈÀ» ¾Ë ¼ö ÀÖ´Ù. °á±¹ App¿Í MainFrame()¸¸À¸·Îµµ ¸ðµç ÇÁ·Î±×·¥ÀÌ °¡´ÉÇϳª. ¿ªÇÒÀÇ ºÐ¸®¸¦ ÅëÇÏ¿©¼­ ±¸Á¶È­ ÇÏ·Á°í ÇÑ °ÍÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌÁ¦ È®½ÅÀÌ µé °ÍÀÌ´Ù. MFC¿Í À©µµ¿ì ÇÁ·Î±×·¥Àº ¸Þ½ÃÁö ¹æ½Ä À̾ ¾î´À ºÎºÐ¿¡ ¾î¶»°Ô ÄÚµùÀ» ÇØ¾ß ÇÏ´Â °ÍÀÌ Áß¿äÇÏ°í, ±× ºÎºÐÀ» À߾˰í ÀÖÀ¸¸é ½±°Ô ÇÒ ¼ö ÀÖ´Ù. API·Î © ¶§¿¡ ¿ì¸®´Â ÀÌ·± ºÎºÐÀÌ ÀÖ¾ú´Ù. Main message loop: while (1) { if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { if( msg.message == WM_QUIT ) break; TranslateMessage(&msg); DispatchMessage(&msg); } Game_Main(); // ÀÌ ºÎºÐÀº ¾Æ´Ô ¼³¸íÀ» À§ÇÑ ºÎºÐ ÀÓ } À§¿¡¼­ ¹«ÇÑ ·çÇÁ¸¦µ¹¸± ¼ö ÀÖ´Â ºÎºÐÀº ¹Ù·Î if ÀýÀÌ ³¡³ª´Â Game_Main()ºÎºÐÀÌ´Ù. if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { if( msg.message == WM_QUIT ................ ÀÌ ºÎºÐÀº À©µµ¿ìÀÇ ¸Þ½ÃÁö¸¦Ã³¸®¸¦ ÇÏ´Â ºÎºÐÀÌ´Ù. ¸Þ½ÃÁö¸¸ 󸮸¦ ÇÑ´Ù. °©ÀÚ±â Å°º¸µå°¡ ´­·Á Áö¸é ÀÌ ºÐ¿¡¼­ ¸Þ½ÃÁö¸¦ ó¸®Çϱâ À§Çؼ­ WndProc()¸¦ ºÎ¸¦ °ÍÀÌ´Ù. ¿ì¸®ÀÇ °ÔÀÓÇÁ·Î±×·¥Àº À©µµ¿ì ¸Þ½ÃÁö¶§ ¸¶´Ù ó¸®ÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù. ±×·³ ¹«ÇÑ ·çÇÁ°¡ µÉ ¼ö ÀÖ´Â ºÎºÐÀº À§ÀÇ Game_Main() ºÎºÐ¹Û¿¡ ¾ø´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¹°·Ð ´Ù¸¥ ¹æ¹ýµµ ÀÖÀ» °ÍÀÌÁö¸¸ ¸»ÀÌ´Ù. ¾Õ¿¡¼­µµ ¾ê±â¸¦ ÇßÁö¸¸ ÀÌ ºÎºÐÀº »ó´çÈ÷ Áß¿äÇÏ´Ù. ¿Ö³ÄÇÏ¸é °ÔÀÓÀ̶õ ¾î¶»°Ô º¸¸é °è¼ÓÀûÀÎ ·çÇÁ¸¦ µ¹¸é¼­ ¾î¶² ¼ø°£¿¡ ÀϾ ÀÏÀ» ó¸®Çϱ⠶§¹®ÀÌ´Ù. ¶ÇÇÑ À©µµ¿ìµµ while()À» ÁÁ¾ÆÇÑ´Ù. ¸Å¼ø°£ ¸¶´Ù Ʋ·ÁÁö´Â À©µµ¿ì ¸Þ½ÃÁö¸¦ ¹ÞÀ»·Á¸é while()À» ÁÁ¾Æ ÇÒ ¼ö¹Û¿¡ ¾ø´Ù. ±×·³ ÀÌ ºÎºÐÀÌ °ú¿¬ MFC¿¡¼­´Â ¾îµô±î?? À§ÀÇ ºÎºÐÀº ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ºÎºÐÀÌ ¾Æ´Ï´Ï±ñ, ¹Ù·Î APP Class¶ó´Â °ÍÀ» Á÷°üÀûÀ¸·Î ¾Ë ¼ö ÀÖ´Ù. ÀÌ ºÎºÐÀº APP ClassÀÇ Run()ÇÔ¼ö ¿Í °°´Ù. App ClassÀÇ Run()ÇÔ¼ö¸¦ ¸¶±¸ ÇغÎÇØ º¸¸é ¾Æ·¡¿Í°°´Ù. CWinApp:: Run() { MSG msg; if( m_pMainWnd == NULL ) ::PostQuitMessage(0); while(1) { if( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) { if( !GetMessage(&msg, NULL, 0, 0)) return msg.wParm; TranslasteMessage(&msg); DispatchMessage(&msg); } else { OnIdle(); } } return 0; } À§¿Í ¶È °°Áö´Â ¾ÊÁö¸¸ À§¿Í °°Àº ·ÎÁ÷À» °¡Áö°í ÀÖ´Ù. ½ÇÁ¦ Run()ÀÇ ³»ºÎ ÄÚµå´Â ¾Ë ¼ö ¾ø°ÚÁÒ. ¸¶ÀÌÅ©·Î ¼ÒÇÁÆ®¿¡¼­ Ŭ·¡½ºÈ­ÇÏ¿´±â ¶§¹®ÀÌÁÒ. ´ÜÁö ¾Æ¸¶ Àú·± ·ÎÁ÷À» °¡Áö°í 󸮸¦ ÇÒ °ÍÀ̶ó´Â °ÍÀÔ´Ï´Ù. Áï Run()ÀÇ ¿ªÇÒÀ» ±×·Á³õÀº °ÍÀÌÁÒ. ±×·³ APIÀÇ WinMain()À» °³³äÀûÀ¸·Î MFC·Î ºø´ë¾î º¸¸é ¾Æ·¡¿Í °°´Ù°í ÇÒ ¼ö ÀÖ´Ù. WinMain() { CWinApp *pApp = AfxGetApp(); pApp->InitAppication(); pApp->initInstance(); pApp->Run(); pApp->ExitInstance(): } ÀÌÁ¦ ÀÌÇØ°¡ ¿ÏÀüÈ÷ °¥ °ÍÀÌ´Ù. 4. À§ÀÇ »çÇ×À» ÀÌÁ¦ °ñ°Ý¿¡ ¸ÂÃß¾î º¸ÀÚ. if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { if( msg.message == WM_QUIT ) break; TranslateMessage(&msg); DispatchMessage(&msg); } À̺κÐÀº MainFrame()¿¡¼­ ÇØ°áÀ» ÇÑ´Ù. À§ÀÇ ºÎºÐÀº ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ºÎºÐÀ̴ϱñ. ±×·³ GameMain()ºÎºÐÀº ¾îµð¿¡...... ¹Ù·Î ¿©±â¿¡ ¼û¾î ÀÖ´Ù. OnIdle()ÇÔ¼ö°¡ ÀÌ¿Í °°Àº ¿ªÇÒÀ» ÇÑ´Ù. OnIdle()ÇÔ¼ö´Â ¸Þ½ÃÁöÀÇ Ã³¸®°¡ ¾øÀ¸¸é ½ÇÇàµÇ´Â ÇÔ¼öÀÌ´Ù. Áï ÇÁ·Î¼¼¼­°¡ ¾Æ¹« 󸮵µ ÇÏÁö ¾Ê°í ½¯ ¶§¿¡ ½ÇÇàµÇ´Â ÇÔ¼öÀÌ´Ù. ¿ì¸®´Â ÀÌ ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵ù ÇÏ¿©¼­ À§¿Í °°Àº ·ÎÁ÷À» ¸¸µé ¼ö °¡ ÀÖ´Ù. ¸Þ½ÃÁö°¡ ³¯¶ó¿Ã ¶§´Â ¸Þ½ÃÁö 󸮸¦ ÇÏ·¯°¡¾ßÇÏ°í ¾Æ´Ò¶§´Â OnIdle()Äڵ带 ó¸®ÇؾßÇÔÀÌ ´ç¿¬ÇÏ´Ù. Àß ºñ±³Çغ¸¶ó. ´Ù½Ã º¸¶ó. À§ÀÇ Äڵ带 Àо¸é µü ¸Â´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. GameMain()µµ ¸Þ½ÃÁöÀÇ Ã³¸®°¡ ¾ø À» ½Ã¿¡ ½ÇÇàµÇ´Â °ÍÀ̱⿡ OnIdle()°¡ ÀÌ¿¡ ÇØ´çÇÑ´Ù´Â °ÍÀÌ....... ÀÌÁ¦ ¸íÄèÈ÷ ÇØ°áÀÌ µÇ¾úÀ» °ÍÀÌ´Ù. ±×·³ OnIdle()ÇÔ¼ö¿¡ GameMain()À» ³Ö¾î ÁÖ¸é µÇ°Ú±¸³ª.......OnIdle()´Â ¹«ÇÑ·çÇÁ¸¦ µ·´Ù. 5. OnIdle()À» ±×´ë·Î ¾²¸é MFC¿¡ ÀÇÇÑ ÀÛµ¿À» ÇÑ´Ù. OnIdle()·ÎºÎÅÍ return µÇ´Â °ªÀ» 1·Î °íÃÄ ÁÖ¶ó. Áï return 1;·Î ÇØÁÖ¶ó. ±×·¡¾ß¸¸ MFC¿¡¼­ÀÇ OnIdle()À» ½ÇÇàÇÏÁö ¾Ê°í, ¿ì¸®°¡ Á¤ÀÇÇÑ ·çÇÁ·Î ÇÒ ¼ö ÀÖ´Ù. ±Ùµ¥ ÀÌ ºÎºÐÀ» ³ª´Â ÀÌ·¸°Ô ÇÏ°í ½Í´Ù. App ClassÀÇ ¿ªÇÒ°ú MainFrame()ÀÇ ¿ªÇÒÀ» ³ª´©°í ½Í´Ù ±×·¸°Ô ÇÏ¸é ¿ªÇÒÀÌ ºÐ¸íÇÏ°í Çê°¥¸®Áö ¾Ê´Â ´Ù. App Class´Â MainFrame()ÀÇ ½ÇÇà°ú ¸Þ½ÃÁö 󸮸¦ App Class´Â À©µµ¿ìÀÇ µî·Ï°ú MainFrame À» ½ÇÇà ½ÃÄÑÁÖ´Â °ÍÀ» ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ­´Â App Class¿¡¼­ MainFrmae()À» ÂüÁ¶ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ºÎºÐÀ» ÀÌ·¸°Ô °íÄ¡¸é µÈ´Ù . App ClassÀÇ InitInstance()ÇÔ¼ö¿¡¼­ MainFrame()À» ÂüÁ¶Çϱâ À§Çؼ­ CMainFrame* pFrame = new CMainFrame; ºÎºÐÀ» pFrame = new CmainFrame;·Î °íÄ¡°í CMainFrmae* pFrmaeÀÇ ClassÀÇ publicÀ¸·Î º¯¼ö ¼±¾ðÀ» ÇØÁÖ¶ó. ±×·¯¸é App ClassÀÇ ¾î´À °÷¿¡¼­µµ MainFrameÀ» Á¢±ÙÇÒ ¼ö ÀÖ´Ù. À§ÀÇ ÄÚµå´Â ÀÌÇØ°¡ °¥ °ÍÀÌ´Ù. ÀÌ ºÎºÐÀÌ ÀÌÇØ°¡ ¾ÈµÈ ´Ù¸é C++À» ´Ù½Ã °øºÎ¸¦ Çϱ⠹ٶõ´Ù. class CRPG1App : public CWinApp { public: CRPG1App(); CMainFrame* pFrame ; ±×¸®°í OnIdle()ÇÔ¼ö¿¡¼­ pFrame->GameMain()À» ¼±¾ðÇØÁÖ¸é CMainFrame¿¡ ÀÖ´Â Game½ÉÀå À» ¹«ÇÑ·çÇÁ·Î µ¹¸± ¼ö ÀÖ´Ù. 5. ÀÌÁ¦ App Class¿¡¼­ ÇØÁÙ °ÍÀº ¸ðµÎ ÇØÁÖ¾ú´Ù. ±×·³ ´ÙÀ½Àº CMainFrame Class¿¡¼­ ÇØÁÖ¸é µÈ´Ù ÀÌÁ¦ App Class¿¡ ´ëÇÑ °í¹ÎÀº Á¢¾îµÎ°í CMainFrmaeÀÇ ÄÚµù¸¸ ½Å°æÀ» ¾²¸é µÈ´Ù. CMainFrame¿¡ DirectDrawµµ ÃʱâÈ­ ÇÏ°í ÇÏ¸é µÈ´Ù. ±× ºÎºÐÀº ³ª¿Í Ŭ·¡½º¸¦ ¸¸µé¾î °¡¸é µÈ´Ù ¸íÄèÈ÷ Ç®¸®±æ ¹Ù¶õ´Ù. ÀÏ´Ü API·Î § °Í°ú MFC°¡ º°·Î Ʋ¸®Áö ¾Ê´Ù´Â °ÍÀ» ¾Ë °ÍÀÌ´Ù. ´ÜÁö ¾îµð´Ù ÄÚµùÀ» ÇؾßÇÒÁö¸¸ ¾È´Ù¸é ¸»ÀÌ´Ù. ´ÙÀ½Àº ´õ¿í ½±°Ô Ç®·Á ³ª°£´Ù. ---------------------------------------------------------------- MFC¸¦ ÀÌ¿ëÇؼ­ °ñ°Ý ¸¸µé±â 1. MFC¸¦ ÀÌ¿ëÇÏ¿©¼­ ¸¸µé °æ¿ì¿¡ ¸¹Àº ºÎºÐµéÀÌ ¸¹µé¾î Áø´Ù. ƯÈ÷ Frame Class, View Class, App, Document·Î 4ºÎºÐÀ¸·Î °ñ°ÝÀÌ ¸¸µé¾î Áø´Ù. ÀÌ ºÎºÐ¿¡¼­ ¸ÕÀú ÇÊ¿ä ¾ø´Â ºÎºÐÀÌ ÀÖ´Ù. Document¿Í ViewÀÌ´Ù. ¿Ö ÇÊ¿ä°¡ ¾øÀ» ±î? ¸ÕÀú ViewÀÇ ¿ªÇÒÀ» DirectX°¡ ´ë½ÅÇÑ´Ù. Áï DirectDraw°¡ ´ë½ÅÈ­¸éÀÇ ¸ðµç °ÍÀ» ó¸®ÇÏ°í °ü¸®Çϱ⿡ View¿¡ °üÇÑ °ÍÀÌ ÇÊ¿ä°¡ ¾ø´Ù. ¶ÇÇÑ CWindÇÔ¼ö¸¦ »ó¼Ó¹Þ´Â À§Àúµå°¡ Frame À§ÀúµåÀ̱⿡ DirectDraw+Frame¸¸ÀÖÀ¸¸é ÀÌ ViewÀÇ ¸ðµç °ÍÀ» ó¸® ÇÒ ¼ö ÀÖ´Ù. Document µµ ÇÊ¿ä°¡ ¾ø´Ù . ±× ÀÌÀ¯´Â ¾ÆÁ÷ °ÔÀÓ¿¡¼­ µµÅ¥¸ÕÆ®¸¦ ½áº¸Áö ¸øÇ߱⿡... 2. Project¸¦ ÀÌ¿ëÇÏ¿©¼­ ¸¸µé °æ¿ì¿¡´Â VC6.0¿¡¼­´Â ÀÌ ¿É¼Ç¸¸ ÇØÁÖ¸é »ý¼º½Ã¿¡ View¿Í Document Class´Â »ý¼ºÀ» ÇÏÁö ¾Ê´Â ´Ù. °á±¹ App Class ¿¡ ÀÌ µÎ Ŭ·¡½º´Â µî·ÏÀÌ ¾ÈµÈ´Ù. ±Ùµ¥ ChildView Class°¡ µî·Ï ÀÌ µÇ¾î ÀÖÀ» °ÍÀÌ´Ù. ÀÌ°Í¿¡ °ü°èµÈ »çÇ×Àº ¸ðµÎ Áö¿ö Áֱ⠹ٶõ´Ù. 3. library¸¦ VCÀÇ project ¸Þ´º¿¡ Setting¿¡ µî·ÏÀ» ÇØÁÖ¾î¾ß ÇÑ´Ù. Project setting¿¡¼­ LinkÅÇÀ» ´©¸£°í Link Object /Module¿¡¼­ ÀÌ ºÎºÐÀ» ³Ö¾î Áֱ⠹ٶõ´Ù. dxguid.lib ddraw.lib ÷°¡ÇØÁֱ⠹ٶó 4. ¿©±âÀÇ ÄÚµå´Â IDirectDraw4ÀÇ ÀÎÅÍ ÆäÀ̽º¸¦ »ç¿ëÇÑ´Ù. ÇÑ°¡Áö ¾Ë¾Æ µÑ °ÍÀº À§¿¡ ¼­µµ º¸µíÀÌ dxguid.lib°¡ µé¾î°¡ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ¶óÀ̺귯¸®¸¦ »©°í ÄÄÆÄÀÏÀ» Çϸé pDD->QueryInterface( IID_IDirectDraw4, (LPVOID *) & g_pDD);¿¡¼­ IID_IDirectDraw4°¡ ¸µÅ© ¿¡·¯°¡ ³¯ °ÍÀÌ´Ù. »õ·Î¿î ÀÎÅÍÆäÀ̽º´Â dxguid.lib¿¡ Ãß°¡ µÊÀ¸·Î ²À dxguid.lib¸¦ ³Ö¾î¼­ ¸µÅ©¸¦ Çϱ⠹ٶõ´Ù. 5. ÀÌÁ¦ App¿Í FrameÀ» ÀÌ¿ëÇÏ¿©¼­ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸ÀÚ.. AppÀÇ ¼Ò½º // War1.cpp : Defines the class behaviors for the application. // #include "stdafx.h" #include "War1.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CWar1App BEGIN_MESSAGE_MAP(CWar1App, CWinApp) //{{AFX_MSG_MAP(CWar1App) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWar1App construction CWar1App::CWar1App() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CWar1App object CWar1App theApp; ///////////////////////////////////////////////////////////////////////////// // CWar1App initialization BOOL CWar1App::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey(_T("Local AppWizard-Generated Applications")); // To create the main window, this code creates a new frame window // object and then sets it as the application's main window object. CMainFrame* pFrame = new CMainFrame; m_pMainWnd = pFrame; // create and load the frame with its resources pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); // The one and only window has been initialized, so show and update it. pFrame->ShowWindow(SW_SHOWMAXIMIZED); pFrame->UpdateWindow(); return TRUE; } À§¿¡¼­ º¸µíÀÌ Child View¿¡ ´ëÇÑ »çÇ×Àº ¸ðµÎ Áö¿ü´Ù. ÀÌÁ¦ ÇÁ·¹ÀÓÀ» º¸µµ·Ï ÇÏÀÚ. // MainFrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include "War1.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define TIMER_ID 1 #define TIMER_RATE 500 ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_WM_DESTROY() ON_WM_KEYDOWN() ON_WM_SETCURSOR() ON_WM_TIMER() ON_WM_ACTIVATEAPP() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { szMsg = "Page Flipping Test: Press F12 to exit"; szFrontMsg = "Front buffer (F12 to quit)"; szBackMsg = "Back buffer (F12 to quit)"; g_pDD = NULL; // DirectDraw object g_pDDSPrimary = NULL;// DirectDraw primary surface g_pDDSBack = NULL; // DirectDraw back surface g_bActive = FALSE; } CMainFrame::~CMainFrame() { } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE | WS_MAXIMIZE; cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.lpszClass = AfxRegisterWndClass(0); return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { DDSURFACEDESC2 ddsd; DDSCAPS2 ddscaps; HRESULT hRet; LPDIRECTDRAW pDD; if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; hRet = DirectDrawCreate(NULL, &pDD, NULL); if (hRet != DD_OK) InitFail(hRet, "DirectDrawCreate FAILED"); // Fetch DirectDraw4 interface hRet = pDD->QueryInterface( IID_IDirectDraw4, (LPVOID *) & g_pDD); if (hRet != DD_OK) InitFail(hRet, "QueryInterface FAILED"); // Get exclusive mode hRet = g_pDD->SetCooperativeLevel( GetSafeHwnd(), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); if (hRet != DD_OK) InitFail(hRet, "SetCooperativeLevel FAILED"); // Set the video mode to 640x480x8 hRet = g_pDD->SetDisplayMode(640, 480, 8, 0, 0); if (hRet != DD_OK) InitFail(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) InitFail(hRet, "CreateSurface FAILED"); // Get a pointer to the back buffer ddscaps.dwCaps = DDSCAPS_BACKBUFFER; hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack); if (hRet != DD_OK) InitFail(hRet, "GetAttachedSurface FAILED"); // Create a timer to flip the pages if ( TIMER_ID != SetTimer(TIMER_ID, TIMER_RATE, NULL)) InitFail(hRet, "SetTimer FAILED"); return 0; } void CMainFrame::InitFail(HRESULT hRet, LPCTSTR szError) { //ReleaseAllObjects(); AfxMessageBox(szError, MB_OK|MB_ICONSTOP); SendMessage(WM_DESTROY); } void CMainFrame::OnDestroy() { ReleaseAllObjects(); //PostQuitMessage(0); CFrameWnd::OnDestroy(); } void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default switch( nChar ) { case VK_ESCAPE : case VK_F12: PostMessage(WM_CLOSE); break; } CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags); } //--------------------------------------------------------- // page 428 //--------------------------------------------------------- BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { SetCursor(NULL); return TRUE; } //--------------------------------------------------------- // page 248 //--------------------------------------------------------- void CMainFrame::OnTimer(UINT nIDEvent) { HRESULT hRet; if(g_bActive && TIMER_ID == nIDEvent ) { UpdateFrame(); while (TRUE) { hRet = g_pDDSPrimary->Flip(NULL, 0); if (hRet == DD_OK) break; if (hRet == DDERR_SURFACELOST) { hRet = g_pDDSPrimary->Restore(); if (hRet != DD_OK) break; } if (hRet != DDERR_WASSTILLDRAWING) break; } } CFrameWnd::OnTimer(nIDEvent); } void CMainFrame::OnActivateApp(BOOL bActive, HTASK hTask) { CFrameWnd::OnActivateApp(bActive, hTask); g_bActive = bActive; } void CMainFrame::UpdateFrame() { 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; 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(&rc); GetTextExtentPoint(hdc, szMsg, lstrlen(szMsg), &size); TextOut(hdc, (rc.right - size.cx) / 2, (rc.bottom - size.cy) / 2, szMsg , szMsg.GetLength()); TextOut(hdc, 0, 0, szFrontMsg, szFrontMsg.GetLength()); phase = 0; } else { TextOut(hdc, 0, 0, szBackMsg, szBackMsg.GetLength()); phase = 1; } g_pDDSBack->ReleaseDC(hdc); } } void CMainFrame::ReleaseAllObjects() { if (g_pDD != NULL) { if (g_pDDSPrimary != NULL) { g_pDDSPrimary->Release(); g_pDDSPrimary = NULL; } g_pDD->Release(); g_pDD = NULL; } } À§ÀÇ ÄÚµå´Â DDEx1ÀÇ ¿¹Á¦ ÀÌ´Ù. ±×°ÍÀ» ±×´ë·Î MFC·Î ¿Å±ä °ÍÀÌ´Ù. ------------------------------------------------------------------ Dialog Box¿¡ DirectX8.0 Ãâ·ÂÇϱâ DDEx2 Sample 1. DDEx2¿¡¼­´Â ƯÀÌÇÏ°Ô ºñÆ®¸ÊÀ» ·ÎµùÇØÁÖ´Â ddutil.cpp¿Í ddutil.h°¡ Æ÷ÇԵȴÙ. ÀÌ ÆÄÀÏ ¿ª½Ã ¿ÜºÎÇÔ¿¡¼­ Ŭ·¡½º·Î include ½ÃÄѼ­ »ç¿ëÇÑ´Ù. Ç㳪 ³»°¡ Çغ¸´Ï ÄÄÆÄÀÏ ¿¡·¯µµ ³ª°í µð¹ö±ëÇÏ´Â µ¥ ¸¹Àº ½Ã°£ÀÌ °É·È´Ù. ±×·¡¼­ ¾Æ¿¹ Ŭ·¡½ºÀÇ ÇÔ¼ö·Î Æ÷ÇÔ ½ÃÄ×´Ù. ¾îÂ¥ÇÇ ÀÌ ÇÔ¼ö´Â DirectDraw¿Í´Â ¶³¾îÁú ¼ö ¾ø´Â ÇÔ¼öµéÀ̱⠶§¹®ÀÌ´Ù. À̰͸¸ ¾È´Ù¸é MFC·Î ÇÁ·Î±×·¥Â¥´Â °ÍÀº ½ÄÀºÁ× ¸Ô±â´Ù. 2. MFC·Î ÇÁ·Î±×·¡¹ÖÀ» Çϸ鼭 ¾Ë°ÔµÈ °ÍÀº API´Â Àϸé CÀÇ ±¸Á¶ÀÌ°í MFC´Â Ŭ·¡½ºÀ̱⿡ ÀÌ¿¡ µû¸¥ °¢ ÀåÁ¡µéÀ» »ì·Á ÁÖ¾î¾ß ÇÑ´Ù. MFC´Â Ŭ·¡½ºÀÇ °³³äÀ» µµÀÔÇÏ¿©¼­ ÀÌ°ÍÀÌ ³¡³ª¸é °ÔÀÓ ¿£Áø µîÀ» Ŭ·¡½º·Î ¸¸µé¾î¼­ MainFrame À§Àúµå¿¡ Á¦°øÀ» ÇØ¾ß ÇÒ °Í °°´Ù. 3. MFC´Â Ŭ·¡½ºÀÇ »ó¼ÓÀÌ´Ù. ±×·¯±â¿¡ ÀÌ »ó¼Ó¸¸ ÀßÀÌ¿ëÇÑ´Ù¸é ±²ÀåÈ÷ ÆíÇÏ´Ù. MFC°¡ APIº¸´Ù´Â Â¥±â°¡ È»¾À ¼ö¿ùÇÏ´Ù. ¾Ë±â¸¸ ÇÑ´Ù¸é ¸»ÀÌ´Ù. 4. MFC·Î ÇÁ·Î±×·¥À» Â¥´Â ¹æ¹ýÀº ¿©·¯ °¡Áö ÀÌ´Ù. . ´ÙÀ̾ó·Î±×¸¸À¸·Î °ñ°ÝÀ» ¼¼¿ì°í Â¥´Â ¹æ¹ý . APP¿Í Frame¸¸À¸·Î °ñ°ÝÀ» ¼¼¿ì°í Â¥´Â ¹æ¹ý . À©µµ¿ìÁî ¸ðµå¿¡¼­ Â¥´Â ¹æ¹ý µîµîÀÌ ÀÖ½À´Ï´Ù. 5. ProjectÀÇ Setting¿¡ ddraw.lib¿Í dxguid.lib¸¦ ²À ¸µÅ© ½ÃÄÑ Áֱ⠹ٶõ´Ù. 6. ¼Ò½º´Â ¾ÕÀ¸·Î ¾ÕÃàÀ» ÇÏ¿©¼­ ¿Ã·Á ³õ°Ú´Ù. ----------------------------------------------------------------- È­¸é¿¡ Ä¿¼­ ¾Èº¸ÀÌ°Ô Çϱâ 1. ¸¶¿ì½º·Î ÁÖÀΰøÀÇ ¿òÁ÷ÀÓÀ» ÇÏ´Â °ÍÀ̾ƴ϶ó. Å°º¸µå·Î ¿òÁ÷ÀÏ °æ¿ì¿¡´Â Ä¿¼­°¡ È­¸é¿¡ ³ª¿À¸é ¾ÈµÈ´Ù. ÀÌ ºÎºÐÀº °£´ÜÇÏ´Ù. MainFrame ¿¡¼­ ClassWizard¸¦ ÀÌ¿ëÇÏ¿©¼­ À©µµ¿ì ¸Þ½ÃÁö¸¦ ¸ð¸é ON_WM_SETCURSORÀ̶õ ¸Þ½ÃÁö¸¦ ¹Þ´Â ÇÔ¼ö°¡ ÀÖ´Ù. ±×·¯¸é À§Àúµå¿¡¼± ±×¿¡ÇØ´çÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î ÁÙ °ÍÀÌ´Ù. ÀÌ ÇÔ¼ö´Â MainFrmeÀÌ ActiveµÇ¾úÀ» °æ¿ì¿¡ ¸¶¿ì½ºÀÇ ¼ÂÆÃÀ» ÇÏ´Â ºÎºÐ ÀÌ´Ù. ¿©±â¼­ ¿ì¸®´Â APIÇÔ¼öÀÎ SetCursor()ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. SetCursor(NULL);·Î ¼ÂÆÃÀ» ÇØÁÖ¾î¶ó. ±×·¯¸é Ä¿¼­°¡ ¾Êº¸ÀÏ °ÍÀÌ´Ù. ±×¸®°í ÇÑ°¡Áö ÁÖÀÇ ÇÒÁ¡Àº MFC¿¡¼­´Â OnSetCursor()¸¦ ¸¸µé¸é¼­ ±âº»ÀûÀ¸·Î ¸¸µå´Â MFC½Ä ÇÔ¼ö ºÎºÐÀÌ ÄÚµùÀÌ µÈ´Ù. ÀÚµ¿À¸·Î¸¸µé¾î Áø´Ù. BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: Add your message handler code here and/or call default return CFrameWnd::OnSetCursor(pWnd, nHitTest, message); } ±âº»ÀûÀ¸·Î ÀÌ¿Í °°ÀÌ ¸¸µé¾îÁú °Í ÀÌ´Ù. ÀÌ ºÎºÐ¿¡¼­ CFrameWnd()ÀÇ OnSetCursor ÇÔ¼ö¸¦ ½ÇÇàÇÏ°Ô µÇ±â¿¡ SetCursor()À» Çصµ ¼Ò¿ëÀÌ ¾ø´Ù. ÀÌ ºÎºÐÀ» ¾Æ·¡¿Í °°ÀÌ ¹Ù²Ù¾î¶ó. ±×·¯¸é Ä¿¼­°¡ »ç¶ó Áú °ÍÀÌ´Ù. ¿ì¸®´Â CFrameWnd()ÀÇ ÇÔ¼ö¸¦ ¹«½ÃÇϱâ À§ÇÔÀÌ´Ù. BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { SetCursor(NULL); return 1; } À§¿Í °°ÀÌ Çϸé Ä¿¼­´Â »ç¶ó Áø´Ù.