±â¹Ý Ŭ·¡½º Áغñ

ÇÁ·ÎÁ§Æ® »ý¼º

¿¹Á¦ ¼öÁØÀ» ³Ñ¾î¼­´Â Áß´ëÇü ÇÁ·ÎÁ§Æ®¸¦ ÀÛ¼ºÇÒ ¶§´Â ±â¹Ý Ŭ·¡½º¸¦ Àß ¸¸µé¾î µÎ¾î¾ß ÇÑ´Ù. °´Ã¼¸¦ Á¶¸³ÇÏ¿© ÇÁ·Î±×·¥À» ¿Ï¼ºÇØ ³ª°¡´Â ¹ÙÅÒ¾÷(Bottom Up) ¹æ½Ä¿¡¼­´Â °´Ã¼°¡ ¾ÈÁ¤ÀûÀÌ°í Æ°Æ°ÇØ¾ß ±× À§ÀÇ ÇÁ·Î±×·¥µµ Á¦ ±â´ÉÀ» ½ÊºÐ ¹ßÈÖÇÒ ¼ö ÀÖ´Ù. ±â´ÉÀû ¿Ï¼ºµµ »Ó¸¸ ¾Æ´Ï¶ó ÀÌÈÄÀÇ È®ÀåÀ̳ª À¯Áö, º¸¼ö¸¦ À§Çؼ­µµ ±âÃʸ¦ Àß ´ÙÁ® µÎ¾î¾ß ÇÑ´Ù.

óÀ½ ½ÃÀÛÀÌ Áß¿äÇѸ¸Å­ ÇÁ·ÎÁ§Æ®¸¦ ¸Ç¹Ù´Ú¿¡¼­ºÎÅÍ ¸¸µé¾î º¸±â·Î ÇÑ´Ù. ÀÌ °­Á°¡ ÀǵµÇÏ´Â ¹Ù´Â ±¸Çö ±â¼ú»Ó¸¸ ¾Æ´Ï¶ó ÇÁ·ÎÁ§Æ®¸¦ ½ÃÀÛÇÏ°í °ü¸®ÇÏ´Â °Í±îÁö Æ÷°ýÇϹǷΠóÀ½ºÎÅÍ ½Ç½ÀÀ» µû¶óÇغ¼ ÇÊ¿ä°¡ ÀÖÀ¸¸ç Á÷Á¢ ½Ç½ÀÇÏ´Â °úÁ¤À» °¡Á¤ÇÏ°í ÀÛ¼ºÇß´Ù. ¹°·Ð ÁøÂ¥ ´Ù ÇØ º¼ ÇÊ¿ä´Â ¾ø°í ´Ù ±×·² °Í °°Áöµµ ¾ÊÁö¸¸ Á¦ÀÛ °úÁ¤À» ºÐ¸íÈ÷ ¼³¸íÇϱâ À§Çؼ­¶óµµ µû¶óÇϱâ½ÄÀ¸·Î ÁøÇàÇÑ´Ù.

¸ÕÀú ½Ç½À ÁغñºÎÅÍ ÇÏÀÚ. ½Ç½À °úÁ¤¿¡¼­ »ý¼ºÇÒ ¼ö¸¹Àº ¿¹Á¦¸¦ ÇÑ µð·ºÅ丮¿¡ ¸ðÀ» ÇÊ¿ä°¡ ÀÖ´Ù. °¢ÀÚ »çÁ¤¿¡ µû¶ó ÀÓÀÇÀÇ µð·ºÅ丮¸¦ »ç¿ëÇصµ ¹«¹æÇÏÁö¸¸ ¿©±â¼­´Â C:\SoEntyStudy µð·ºÅ丮¿¡¼­ ½Ç½ÀÀ» ÁøÇàÇϱâ·Î ÇÑ´Ù. ÄÄÆÄÀÏ·¯´Â ºñÁÖ¾ó ½ºÆ©µð¿À 2019 ¿µ¹® ¹öÀüÀ» »ç¿ëÇÑ´Ù. ÃÖ±Ù ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®´Â C#¿¡ ½Å°æ¾²´À¶ó Win32´Â Ȧ´ëÇÏ°í Àִµ¥ ´õ±¸³ª ±¹Á¦È­¿¡´Â ´õ ¹«½Å°æÇØ ÇÑ±Û ¹öÀü¿¡¼­´Â ¹ö±×°¡ ¸¹´Ù.

MS °ø½Ä »çÀÌÆ®¿¡¼­ ºñÁÖ¾ó ½ºÆ©µð¿À¸¦ °Ë»öÇØ ¼³Ä¡ÇÏ¸é ±âº»ÀûÀ¸·Î ÇÑ±Û ¹öÀüÀ» ¼³Ä¡ÇØ Áִµ¥ ¼³Ä¡ ¿É¼Ç¿¡¼­ ¿µ¹®µµ °°ÀÌ ¼±ÅÃÇÏ¸é µÈ´Ù. ¼³»ç Çѱ۸¸ ¼±ÅÃÇß´õ¶óµµ Â÷ÈÄ¿¡ ¿µ¹® ¾ð¾îÆÑÀ» Ãß°¡·Î ¹Þ¾Æ ¼³Ä¡ÇÒ ¼öµµ ÀÖ´Ù. ²À ÇÑ±Û ¹öÀüÀ» »ç¿ëÇÏ°Ú´Ù¸é »ó°üÀº ¾øÁö¸¸ ¸®¼Ò½º ÆíÁý±â¿¡ ¹ö±×°¡ ÀÖ¾î ±ÍÂú¾ÆÁø´Ù. ÀÌ µÎ°¡Áö¸¸ ÁغñÇÏ¸é ¹Ù·Î ½Ç½ÀÀ» µû¶óÇÒ ¼ö ÀÖ´Ù.

ºñÁÖ¾ó ½ºÆ©µð¿À 2019¸¦ ½ÇÇàÇÏ°í ÇÁ·ÎÁ§Æ®ºÎÅÍ »ý¼ºÇÑ´Ù. File/New/Project Ç׸ñ ¼±Åà ÈÄ Windows Desktop Wizard ÅÛÇø´À» ¼±ÅÃÇÑ´Ù. Windows Deskop Application ÅÛÇø´Àº Áú¹®¾øÀÌ Áö¸¾´ë·Î ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇØ ¹ö¸®¹Ç·Î ÀûÇÕÇÏÁö ¾ÊÀ¸¸ç ¹Ýµå½Ã ¸¶¹ý»ç·Î ½ÃÀÛÇØ¾ß ÇÑ´Ù.

ÇÁ·ÎÁ§Æ® À̸§Àº SoEnty·Î ÀÔ·ÂÇÏ°í À§Ä¡´Â ¹Ì¸® ÁغñÇصР½Ç½À µð·ºÅ丮·Î ÁöÁ¤ÇÑ´Ù. ¾Æ·¡ÂÊÀÇ Ã¼Å© ¹Ú½º¸¦ Ŭ¸¯ÇÏ¿© ¼Ö·ç¼Ç°ú µð·ºÅ丮¸¦ °°Àº Æú´õ¿¡ »ý¼ºÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é µð·ºÅ丮 ±¸Á¶°¡ º¹ÀâÇØÁ® ½Ç½ÀÀÌ ºÒÆíÇØÁø´Ù.  Create ¹öÆ°À» Ŭ¸¯Çϸé ÇÁ·ÎÁ§Æ®ÀÇ Çü½ÄÀ» ¹¯´Â ´ëÈ­»óÀÚ°¡ ³ªÅ¸³­´Ù. µðÆúÆ®´Â ÄַܼΠµÇ¾î Àִµ¥ Destktop Application(.exe)¸¦ ¼±ÅÃÇÏ°í Empty project ¿É¼Ç¸¸ ¼±ÅÃÇÑ´Ù.

¸¶¹ý»ç¸¦ »ç¿ëÇÏ¸é ¸®¼Ò½ºµµ »ý¼ºÇØ ÁÖ°í pch ¼³Á¤±îÁö ´Ù ÇØ ÁÖ¾î Æí¸®ÇÏÁö¸¸ ¼Ò½º°¡ ÀåȲÇÏ°í ºÒÇÊ¿äÇÑ ±â´É±îÁö ¸¶±¸ Áý¾î ³Ö¾î ¹ö¸°´Ù. °Ô´Ù°¡ ¸¶¹ý»ç°¡ ¸¸µé¾îÁÖ´Â ¸®¼Ò½º¿¡´Â ¹ö±×±îÁö ÀÖ´Ù. ¾Æ¿¹ ºó ÇÁ·ÎÁ§Æ®·Î ½ÃÀÛÇÑ ÈÄ ÇÊ¿äÇÑ ¿ä¼Ò¸¦ Çϳª¾¿ Ãß°¡ÇØ ³ª°¡´Â°Ô ¼ÓÆíÇÏ´Ù.

OK ¹öÆ°À» ´©¸£¸é ÇÁ·ÎÁ§Æ®¸¸ µ¢±×·¯´Ï »ý¼ºµÇ¸ç °ñÁ¶¸¸ ¸¸µé¾îÁø´Ù. ºó ÇÁ·ÎÁ§Æ®¿¡ ÇÊ¿äÇÑ ¼Ò½º ÆÄÀÏÀ» Çϳª¾¿ Ãß°¡ÇÏ¿© ±â´ÉÀ» È®ÀåÇØ º¸ÀÚ. Á¦ÀÏ Ã³À½ Ãß°¡ÇÒ ¸ðµâÀº °øÅë ÇÔ¼ö ±â´ÉÀ» Á¦°øÇÏ´Â À¯Æ¿¸®Æ¼ÀÌ´Ù. ¼Ö·ç¼Ç Ž»ö±âÀÇ Header Files ³ëµå¿¡¼­ Æ˾÷ ¸Þ´º¸¦ ºÒ·¯³½ ÈÄ Add/New Item Ç׸ñÀ» ¼±ÅÃÇÑ´Ù.

»õ Ç׸ñ ´ëÈ­»óÀÚ°¡ ³ªÅ¸³ª´Âµ¥ Header File(.h)¸¦ ¼±ÅÃÇÏ°í ÆÄÀϸíÀº Util.h·Î ÀÔ·ÂÇÑ´Ù.  ÀÌÈÄ¿¡µµ ÆÄÀÏ Ãß°¡½Ã Header Çϳª Source Çϳª¾¿ °¢°¢ Ãß°¡ÇÏ¸é µÈ´Ù.

»õ·Î ¸¸µé¾îÁø ÆÄÀÏ¿¡ #pragma once ±¸¹®ÀÌ ¹Ì¸® ÀÛ¼ºµÇ¾î Àִµ¥ Çì´õ ÆÄÀÏ Áߺ¹ Æ÷ÇÔÀ» ¹æÁöÇÑ´Ù. ±×·¯³ª ¹Ì¸® ÄÄÆÄÀÏµÈ Çì´õ ±â´ÉÀ» ¾²¸é ±»ÀÌ ÇÊ¿ä ¾ø´Ù. Áö¿ö ¹ö¸®°í ¸î °¡Áö ¸ÅÅ©·Î¿Í ÇÔ¼öÀÇ ¿øÇüÀ» ÀÛ¼ºÇÑ´Ù. Á÷Á¢ ŸÀÌÇÁ ÃÄ ³Ö±â´Â ¹ø°Å·Î¿ì¹Ç·Î ¹èÆ÷ ¼Ò½º¿¡¼­ º¹»çÇØ ºÙ¿© ³ÖµÇ ÆÄÀÏÀ» ¹Ýµå½Ã Çϳª¾¿ Á÷Á¢ ¸¸µé¾î º¸°í Äڵ嵵 ´ëÃæ Äf¾î º¸ÀÚ.

 

// ¸ÅÅ©·Î ÇÔ¼ö

#define Count(a) (sizeof(a)/sizeof(a[0]))

#define TextOutSz(h,x,y,t) TextOut(h,x,y,t,lstrlen(t));

#define ABS(a) ((a) >= 0 ? (a):-(a))

#define random(n) (rand()%(n))

 

// À¯Æ¿¸®Æ¼ ÇÔ¼ö ¿øÇü

void Trace(LPCTSTR format, ...);

void WriteLog(LPCTSTR strLog, ...);

void DrawBitmap(HDC hdc, int x, int y, HBITMAP hBit);

 

ÀϹÝÀûÀ¸·Î ¸¹ÀÌ »ç¿ëÇÏ´Â ¸ÅÅ©·Î ÇÔ¼ö ¸î °³ ¼±¾ðÇß´Ù. µð¹ö±ë È®ÀÎÀ» À§ÇÑ Trace, WriteLog ÇÔ¼ö¿Í ºñÆ®¸ÊÀ» Ãâ·ÂÀ» À§ÇÑ DrawBitmap ÇÔ¼ö µÎ °³¸¸ ÀÏ´Ü Æ÷ÇÔ½ÃÄ״µ¥ ÀÌÈÄ °è¼Ó ´Ã¾î³¯ °ÍÀÌ´Ù. ÇÁ·ÎÁ§Æ®ÀÇ ´Ù¸¥ ºÎºÐ¿¡¼­ Á¾Á¾ Âü°íÇÏ´Â Àü¿ª ÇÔ¼ö¸¦ Util ¸ðµâ¿¡ ÀÛ¼ºÇØ µÎ¸é Æí¸®ÇÏ´Ù.

µÎ ÇÔ¼öÀÇ ±¸Çö ÄÚµå´Â Util.cpp¿¡ ÀÛ¼ºÇÑ´Ù. ¼Ö·ç¼Ç Ž»ö±âÀÇ Source Files ³ëµå¿¡¼­ Æ˾÷ ¸Þ´º¸¦ ¿­°í Add/New Items Ç׸ñÀ» ¼±ÅÃÇÑ ÈÄ ÆÄÀϸíÀ» Util.cpp·Î ÀÔ·ÂÇÑ´Ù.

»õ ÆíÁýâÀÌ ¿­¸®´Âµ¥ ¿©±â¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.  C++ ÄÚµù ±ÔÄ¢¿¡ ¸Â°Ô ¿øÇüÀº Çì´õ ÆÄÀÏ¿¡, ÄÚµå´Â ±¸Çö ÆÄÀÏ¿¡ ÀÛ¼ºÇÑ´Ù.  C °³¹ßÀÚ¿¡°Ô´Â Àͼ÷ÇÑ ÀϹÝÀûÀÎ ¹æ¹ýÀÌÁö¸¸ ¼±¾ð°ú Á¤ÀÇ°ú ºÐ¸®µÇ¾î ÀÖÁö ¾ÊÀº C#À̳ª ÀÚ¹Ù¿¡ ºñÇؼ­´Â ´Ù¼Ò ºÒÆíÇÑ ¹æ¹ýÀÌ´Ù.

 

#include <windows.h>

#include <tchar.h>

#include "Util.h"

 

#ifdef _DEBUG

void Trace(LPCTSTR format, ...)

{

        TCHAR buf[1024];

        va_list marker;

 

        va_start(marker, format);

        _vstprintf_s(buf, Count(buf), format, marker);

        lstrcat(buf, L"\r\n");

        OutputDebugString(buf);

}

 

void WriteLog(LPCTSTR strLog, ...)

{

        static int count = 0;

        static LPCTSTR LogPath = TEXT("c:\\Temp\\SoEnty_Debug.txt");

        HANDLE hLog;

        DWORD dwWritten;

        TCHAR szLog[1024];

        TCHAR strLog2[1024];

        va_list marker;

        SYSTEMTIME st;

 

        va_start(marker, strLog);

        _vstprintf_s(szLog, Count(szLog), strLog, marker);

 

        if (count == 0) {

                   hLog = CreateFile(LogPath, GENERIC_WRITE, 0, NULL,

                              CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

        } else {

                   hLog = CreateFile(LogPath, GENERIC_WRITE, 0, NULL,

                              OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

        }

 

        GetLocalTime(&st);

        _stprintf_s(strLog2, Count(strLog2), TEXT("Ä«¿îÅÍ=%06d(%d:%d:%d:%d) %s\r\n"), count++,

                   st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, szLog);

        SetFilePointer(hLog, 0, NULL, FILE_END);

        WriteFile(hLog, strLog2, lstrlen(strLog2), &dwWritten, NULL);

        CloseHandle(hLog);

}

#else

void Trace(LPCTSTR format, ...) { ; }

void WriteLog(LPCTSTR strLog, ...) { ; }

#endif

 

void DrawBitmap(HDC hdc, int x, int y, HBITMAP hBit)

{

    HDC MemDC;

    HBITMAP oldBitmap;

    int bx, by;

    BITMAP bit;

 

    MemDC = CreateCompatibleDC(hdc);

    oldBitmap = (HBITMAP)SelectObject(MemDC, hBit);

 

    GetObject(hBit, sizeof(BITMAP), &bit);

    bx = bit.bmWidth;

    by = bit.bmHeight;

 

    BitBlt(hdc, x, y, bx, by, MemDC, 0, 0, SRCCOPY);

 

    SelectObject(MemDC, oldBitmap);

    DeleteDC(MemDC);

}

 

Trace´Â µð¹ö±ë ¹®ÀÚ¿­À» ÄַܼΠÃâ·ÂÇÏ¿© ÇÁ·Î±×·¥À» ¸ØÃßÁö ¾Ê°íµµ µ¿ÀÛ »óŸ¦ °üÂûÇÏ´Â µµ¿ì¹Ì ÇÔ¼öÀÌ´Ù. printf ó·³ ¼­½Ä Á¶¸³À» Áö¿øÇÏ¿© ÇÑÁÙ·Î º¯¼ö°ªÀ̳ª ÇÁ·Î±×·¥ÀÇ »óŸ¦ Ãâ·ÂÇØ º¼ ¼ö ÀÖ¾î Æí¸®ÇÏ´Ù. ¼­½Ä Á¶¸³À» À§ÇØ _vstprintf_s ÇÔ¼ö¸¦ »ç¿ëÇϴµ¥ ¹öÆÛ ±æÀ̸¦ Àμö·Î Àü´ÞÇÏ¿© ¾ÈÁ¤¼ºÀÌ ³ô´Ù. ¿¹Àü¿¡´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇß¾ú´Ù.

 

_vstprintf(buf, format, marker);

 

»ç½Ç, ÀÌ ÇÔ¼öµµ ¿ø·¡ÀÇ C ÇÔ¼ö´Â ¾Æ´Ï°í ¿øº»Àº sprintfÀÌµÇ À¯´ÏÄÚµå±îÁö Áö¿øÇÏ´Â ¸ÅÅ©·Î ÇÔ¼öÀÌ´Ù. ÀÌ ÇÔ¼ö¸¸ Çصµ ±×·° Àú·° ¾µ¸¸ ÇÏÁö¸¸ ¹öÆÛ ±æÀ̸¦ ÁöÁ¤ÇÒ ¼ö ¾øÀ¸¸ç ¹öÆÛ°¡ Ç×»ó ³Ë³ËÇÏ´Ù°í °¡Á¤ÇÏ°í ¹®ÀÚ¿­À» Á¶¸³Çϱ⠶§¹®¿¡ À§ÇèÇÑ ¸éÀÌ ÀÖ´Ù.

C++Àº ¾ÈÁ¤¼ºÀ» Á¡Á¡ È®º¸ÇÏ´Â ¹æÇâÀ¸·Î ¹ßÀüÇÏ°í ÀÖ¾î ÀÌ·± À§ÇèÇÑ ÇÔ¼ö´Â ¿¡·¯·Î ó¸®ÇÑ´Ù. ±×·¯³ª °ú°Å¿ÍÀÇ È£È¯¼ºÀ» À§ÇØ ¿ÏÀüÈ÷ ±ÝÁöÇÒ ¼ö´Â ¾ø¾î SDL checks ¿É¼ÇÀ» ²ô¸é ¿©ÀüÈ÷ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¾ÕÀ¸·Î´Â ¾²Áö ¸»¶ó´Â ¶æÀ¸·Î ÇÁ·ÎÁ§Æ® »ý¼º½Ã µðÆúÆ®·Î SDL ¿É¼ÇÀÌ ÄÑÁ® ÀÖ´Ù.

¾ÈÀüÇÔÀ» À§ÇØ ±¸Çü ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¸»¶ó´Â ¶æÀº ÀÌÇØÇÏ°ÚÁö¸¸ ¾î¶² °æ¿ì´Â ÄÄÆÄÀÏ·¯ÀÇ ÀܼҸ®°¡ ³Ê¹« ½ÉÇÑ ÆíÀÌ´Ù. ¸ÖÂÄÈ÷ Àß µÇ´ø ÄÚµå±îÁöµµ ¿¡·¯·Î ó¸®ÇØ ¹ö¸®´Â °ú°ÝÇÔ ¶§¹®¿¡ ±âÁ¸ °³¹ßÀÚ°¡ ÀûÀÀÇϱ⠾î·Æ´Ù. ÀÌ ÇÔ¼ö ¾Æ´Ï¶óµµ lstrcpy, wsprintf µî ¾ÆÁ÷µµ À§ÇèÇÑ ÇÔ¼ö´Â ¾ó¸¶µçÁö ÀÖÀ¸¸ç ¿©ÀüÈ÷ »ç¿ë °¡´ÉÇÏ´Ù.

À§ÇèÇÔÀ» °¨¼öÇÏ°í¶óµµ ÀÌ·± ÇÔ¼ö°¡ ¾ÆÁ÷ ³²¾Æ ÀÖ´Â ±Ùº»ÀûÀÎ ÀÌÀ¯´Â C´Â ¿ø·¡ºÎÅÍ ¹è¿­ ³¡À» Á¡°ËÇÏÁö ¾Ê±â ¶§¹®ÀÌ¸ç ±× ÈÄ°èÀÚÀÎ C++µµ ¸¶Âù°¡Áö ÇѰ踦 °¡Áö°í ÀÖ´Ù. Áö±Ý±îÁö ÀÌ·± Ư¼ºÀÌ Å« ¹®Á¦°¡ µÇÁö ¾Ê¾Ò´ø °ÍÀº C °³¹ßÀÚ´Â Ç×»ó ¹öÆÛ¸¦ ³Ë³ËÈ÷ ÁغñÇÏ°í Á¤ ÇÊ¿äÇÏ¸é »çÀü¿¡ ¹öÆÛ ±æÀ̸¦ Á¡°ËÇÏ´Â ½ÄÀ¸·Î ´ëºñÇ߱⠶§¹®ÀÌ´Ù.

ÀÌ·± Ư¼ºÀÇ ¹Ý´ë ±ÞºÎ·Î °á°ú ÇÁ·Î±×·¥ÀÌ ÀÛ°í ºü¸£¸ç ±× Ư¼ºÀ¸·Î ÀÎÇØ C/C++ÀÌ ¿©Å±îÁö »ì¾Æ ³²¾ÒÀ¸¸ç °íÀ¯ÀÇ È°¿ë ¿µ¿ªÀÌ ÀÖ´Â °ÍÀÌ´Ù. È°¿ë ºÐ¾ß°¡ ´Ù¸£´Ï Áß±Þ ¾ð¾î°¡ ¼º´ÉÀ» Æ÷±âÇØ °¡¸ç °í±Þ ¾ð¾î¸¦ µû¶ó °¡´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù´Â °ÍÀÌ °³ÀÎÀûÀÎ »ý°¢ÀÌ´Ù. ¾²±â ½±°í ¾ÈÀüÇÑ ¾ð¾î´Â ¾ó¸¶µçÁö ¸¹°í C´Â ±× ³ª¸§´ë·ÎÀÇ ¿ªÇÒÀÌ ÀÖÀ¸´Ï C´Â C´Ù¿ö¾ß ÇÑ´Ù.

±×·¯³ª ÀÌ°Ç ³ªÀÇ °³ÀÎÀûÀÎ ÃëÇâÀÏ »ÓÀÌ¸ç ¿äÁòÀÇ Àü¹ÝÀûÀÎ È帧Àº ¿ø·ÐÀûÀÎ ¾ÈÁ¤¼ºÀ» È®º¸ÇÏÀÚ´Â ÂÊÀÌ´Ù. ÀÌ °­Á´ ǥÁØÀÇ ÀÌ·± ÃëÁö¿¡ ¸Â°Ô °¡±ÞÀûÀÌ¸é ±ÇÀåµÇ´Â ¹æ½ÄÀ¸·Î ¿¹Á¦ Äڵ带 ÀÛ¼ºÇ쵂 ³Ê¹« ½ÉÇÏ´Ù ½ÍÀº ºÎºÐÀº °æ°í¸¦ ¹«½ÃÇϱâ·Î ÇÑ´Ù. ³ªÁß¿¡ µû·Î »ìÆì º¸°ÚÁö¸¸ ºñÁÖ¾ó ½ºÆ©µð¿ÀÀÇ °æ°í´Â ³Ê¹« °úÇÑ ¸éÀÌ ÀÖ´Ù.

WriteLog ÇÔ¼ö´Â ·Î±× ±â·ÏÀ» ÆÄÀÏ·Î ³²±ä´Ù. ¸ÖƼ ½º·¹µå µð¹ö±ëÀº ·Î±×¸¦ ³²±ä ÈÄ »ìÆì º¸´Â °ÍÀÌ È¿À²ÀûÀÌ´Ù. ÀÌ ÇÁ·ÎÁ§Æ®¿¡¼­´Â ´çÀåÀº »ç¿ëÇÏÁö ¾ÊÁö¸¸ Àå·¡¸¦ À§ÇØ ¹Ì¸® Æ÷ÇÔ½ÃÄÑ µÎ¾ú´Ù. µð¹ö±ë ÇÔ¼ö´Â µð¹ö±ë ¹öÀü¿¡¼­¸¸ º»Ã¼¸¦ Á¤ÀÇÇÑ´Ù. ¸±¸®Áî ¹öÀü¿¡¼­´Â ±¦È÷ ½ÇÇà ½Ã°£À» ±î¸ÔÀ» ÇÊ¿ä°¡ ¾ø´Ù.

CWindow

SoEnty ÇÁ·ÎÁ§Æ®´Â C++ ¾ð¾î¿Í Win32 API¸¦ »ç¿ëÇÏ¿© °³¹ßÇÑ´Ù. ÀÌ Á¶ÇÕÀ¸·Î ¿î¿µÃ¼Á¦ÀÇ ¸ðµç ±â´ÉÀ» ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ°í ÀÛ°í ºü¸¥ ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ´Ù. ±×·¯³ª Àú¼öÁØ °³¹ß ¹æ¹ýÀÌ´Ù º¸´Ï ÆíÀǼºÀÌ ¶³¾îÁö°í »ý»ê¼ºµµ ³·¾Æ ½Ã°£µµ ¸¹ÀÌ °É¸°´Ù. ÀÌ Á¶ÇÕÀÇ ´ÜÁ¡Àº ´ÙÀ½°ú °°´Ù.

 

- À©µµ¿ì Çϳª¸¦ »ý¼ºÇÏ·Á¸é À©µµ¿ì Ŭ·¡½º¸¦ Á¤ÀÇÇÏ°í À©µµ¿ì ÇÁ·Î½ÃÀú¿Í °¢ ¸Þ½ÃÁöÀÇ Çڵ鷯±îÁö ¸¸µé¾î¾ß ÇÏ´Ï °úÁ¤ÀÌ ±æ°í ¹øÀâÇÏ´Ù.

- ¸Þ½ÃÁö¸¦ Á÷Á¢ ¹Þ¾Æ wParam, lParamÀ» Çؼ®ÇÏ¿© Àǹ̸¦ ÆľÇÇÏ°í ¹ÝÀÀÀ» º¸¿© ÇÑ´Ù. ¸Å¹ø ·¹ÆÛ·±½º¸¦ Âü°íÇØ¾ß Çϸç ij½ºÆõµ ÀÚÁÖ ÇØ ½Ç¼öÇÒ °¡´É¼ºÀÌ ¸¹´Ù.

- °¢ ÇÔ¼ö·Î Àü´ÞÇÒ Àμö°¡ ³Ê¹« ±¸Ã¼ÀûÀÌ°í ½Ã½ÃÄÝÄÝÇÑ °Í±îÁö ´Ù ¹àÇô¾ß ÇÑ´Ù. ±â¹Ý ¾ð¾î°¡ CÀÌ´Ù º¸´Ï Àμö°¡ ¸¹°í ÀμöÀÇ Àṉ̀îÁöµµ º¹ÀâÇØ Á÷°üÀûÀ¸·Î ¿Ü¿ì±â ¾î·Æ´Ù.

- ÀÛ¾÷ ÈÄ Á¤¸®°¡ ¸ðµÎ ¼öµ¿À̾ ÀÏÀÏÀÌ ½Å°æ½á¾ß Çϸç Çϳª¶óµµ »© ¸ÔÀ¸¸é ¸®¼Ò½º°¡ ´©ÃâµÇ´Â À§ÇèÀÌ ÀÖ´Ù.

 

ÀÌ·± ºÒÆíÇÔ ¶§¹®¿¡ Win32¸¦ ¹Ù·Î ¾²´Â °æ¿ì´Â º°·Î ¾ø°í ´õ °í¼öÁØÀÇ ¾ð¾î·Î ·¡ÇÎÇؼ­ »ç¿ëÇÑ´Ù.  ´ëÇ¥ÀûÀÎ ¿¹°¡ MFCÀÌ´Ù. ¸ðµç °ÍÀ» °´Ã¼È­ÇÏ°í »ý¼ºÀÚ, Æı«ÀÚ¸¦ ÅëÇØ ÀÚµ¿È­ÇØ µÎ¾î ´Ü ¸î ÁÙ¸¸ÀÇ ÄÚµå·Îµµ ¿øÇÏ´Â °ÍÀ» ÇÒ ¼ö ÀÖ´Ù. °³¹ßÅøÀÇ Áö¿øµµ dzºÎÇØ ¸®¼Ò½º ÆíÁýÀ̳ª Çڵ鷯 ¿¬°áÀÌ ½±´Ù. ±×·¯³ª MFC ¶ÇÇÑ ´ÜÁ¡ÀÌ ¸¸¸¸Ä¡ ¾Ê´Ù.

 

- ·±Å¸ÀÓÀÌ ³Ê¹« °Å´ëÇØ ¹èÆ÷°¡ ¾î·Æ°í ´Üµ¶ ½ÇÇà ÆÄÀÏÇÏÁö ¸øÇÑ´Ù. °Ô´Ù°¡ MFCµµ ¿©·¯ ¹öÀüÀÌ ÀÖ¾î ·±Å¸ÀÓ ¹öÀüÀ» Àß ¸ÂÃß¾î¾ß ÇÏ´Â ºÎ´ãÀÌ ÀÖ´Ù.

- Äڵ带 Ãà¾àÇϱâ À§ÇÑ ¸ÅÅ©·Î°¡ º¹ÀâÇÏ°í ÁßøÀÌ ½ÉÇØ ºñÁ÷°üÀûÀÌ´Ù. ¸ÅÅ©·Î Çï¿¡ ºüÁö¸é Çì¾î ³ª¿À±â ¾î·Æ°í ¿¹»óÄ¡ ¸øÇÑ ¹®Á¦¿¡ ºÀÂøÇÑ´Ù. Çѹø Àͼ÷ÇØÁö¸é ¾²±â ÆíÇÏÁö¸¸ Á¦´ë·Î Àͼ÷ÇØÁö±â Âü ¾î·Æ´Ù.

- Ãß»óÈ­ ¼öÁØÀÌ ÃæºÐÇÏÁö ¾ÊÀ¸¸ç Win32¸¦ ´Ü¼øÈ÷ ·¡ÇÎÇØ ³õÀº °ÍÀ̾ °í±ÞÀ¸·Î ¿Ã¶ó°¥ ¼ö·Ï ¿¹»óÄ¡ ¸øÇÑ ÇÔÁ¤ÀÌ ¸¹´Ù. ¹°·Ð ÇØ°á ¹æ¹ýÀÌ ´Ù ÀÖÁö¸¸ ³­À̵µ°¡ ³ô´Ù.

 

MFC´Â ÃæºÐÈ÷ ÁÁÀº ¶óÀ̺귯¸®ÀÌÁö¸¸ À¯Æ¿¸®Æ¼¸¦ ¸¸µé±â¿¡´Â ºÎ´ã½º·¯¿î ¸éÀÌ ÀÖ´Ù. SoEnty´Â MFC¸¦ Á÷Á¢ÀûÀ¸·Î ¾²Áö´Â ¾ÊÁö¸¸ ±âº» °³³äÀ» ºô·Á ¿Í °´Ã¼È­ÀÇ ÀÌÁ¡¸¸ ÃëÇϱâ·Î ÇÑ´Ù. ´Ù¸¥°Ç Win32¸¦ ±×´ë·Î »ç¿ëÇÏ´õ¶óµµ À©µµ¿ì¸¸ °´Ã¼·Î ¸¸µé¾î µÎ¸é ÆíÀǼºÀÌ ¾öû³ª°Ô Áõ°¡ÇÑ´Ù.

Âü°í·Î À©µµ¿ì¸¦ °´Ã¼È­ÇÏ´Â »ó¼¼ÇÑ ¹®¹ý¿¡ ´ëÇؼ­´Â ´ç±Ù ÅؽºÆ® ÆíÁý±â ÇÁ·ÎÁ§Æ®¿¡¼­ ÀÌ¹Ì ´Ù·é ¹Ù ÀÖ´Ù. ´ç±Ù ÇÁ·ÎÁ§Æ® °­ÁÂÀÇ ´ÙÀ½ ÅäÇÈÀ» Âü°íÇÏ¿© ¾î¶² ¹®Á¦°¡ ÀÖ°í ¾î¶»°Ô ÇØ°áÇÏ´ÂÁö ¹Ì¸® ¿¹½ÀÀ» ÇØ µÎ¸é ÀÌ ÇÁ·ÎÁ§Æ®¸¦ ÀÌÇØÇϴµ¥ ¸¹Àº µµ¿òÀÌ µÈ´Ù. SoEnty´Â ÀÌ º¸´Ù´Â ´õ Á¤±³ÇÑ ÄÚµå·Î ¾÷±×·¹À̵åÇÏ¿´´Ù.

 

´ç±Ù 1.0 °­ÁÂ 9-1Àý, 9-2Àý

´ç±Ù 1.2 °­Á 21-1-´ÙÇ×, 21-1-»çÇ×

 

SoEnty ¾È¿¡ À©µµ¿ì¸¦ °´Ã¼¿Í ¸ÊÇÎÇÏ´Â °£ÀÌ ±â´ÉÀ» ÀÛ¼ºÇØ ³ÖÀ» °ÍÀÌ´Ù. MFC¸¦ µû¶óÇÑ °ÍÀε¥ À̸§À» ²À ºÙÀÌÀÚ¸é KFC Á¤µµ µÈ´Ù. ÀÌ·ÐÀº º¹ÀâÇÏÁö¸¸ Ãß»óÈ­ ¼öÁØÀÌ ³·¾Æ ¿¹»ó¿Ü·Î ÄÚµå¾çÀÌ ¸¹Áö´Â ¾Ê´Ù. À©µµ¿ì °´Ã¼¿Í °´Ã¼¸ÊÀº CWindow Ŭ·¡½º·Î ±¸ÇöÇÑ´Ù. Window.h Çì´õ ÆÄÀÏÀ» »ý¼ºÇÏ°í CWindow Ŭ·¡½º¸¦ ¼±¾ðÇÑ´Ù.

 

// ·çÆ® À©µµ¿ì Ŭ·¡½º. À©µµ¿ì °´Ã¼ °ü¸®µµ ´ã´çÇÑ´Ù.

class CWindow

{

public:

        HWND win_hWnd;                                                  // À©µµ¿ì ÇÚµé

        COLORREF win_backColor;                            // ¹è°æ»ö

        HBRUSH win_backBrush;                               // ¹è°æ ºê·¯½Ã

        HBITMAP win_dblBuffer;                               // ´õºí¹öÆÛ¸µ¿ë ºñÆ®¸Ê

 

        CWindow();

        ~CWindow() { Dispose(); }

        void Dispose();

 

        // ÆòÀÌÇÑ Â÷Àϵå À©µµ¿ì·Î »ý¼ºÇ쵂 ¸¶Áö¸· Àμö·Î this¸¦ Àü´ÞÇÏ¿© °´Ã¼¸Ê¿¡ µî·ÏÇÑ´Ù.

        // ÀÌ ÇüÅÂ¿Í ´Ù¸¥ À©µµ¿ì(È®Àå ½ºÅ¸ÀÏ, ÁÂÇ¥ ÁöÁ¤)´Â Create¸¦ ÀçÁ¤ÀÇÇÏ¿© Á÷Á¢ Á¤ÀÇÇÑ´Ù.

        virtual void Create(HWND hParent, DWORD style = WS_CHILD | WS_VISIBLE,

                   int child_id = 0, LPCTSTR title = L"");

        // ¹è°æ»ö»ó ÁöÁ¤ ¶Ç´Â º¯°æ

        void SetBackColor(COLORREF color);

 

        virtual LRESULT OnMessage(UINT iMessage, WPARAM wParam, LPARAM lParam);

        virtual LRESULT OnCreate(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnDestroy(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnPaint(WPARAM wParam, LPARAM lParam);

        virtual void OnDraw(HDC hdc, int width, int height) { }

        virtual LRESULT OnTimer(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnSize(WPARAM wParam, LPARAM lParam);

        virtual LRESULT OnCommand(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnContextMenu(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnKeyDown(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnMouseMove(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnLButtonUp(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnLButtonDblClk(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnMouseWheel(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnUser1(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnUser2(WPARAM wParam, LPARAM lParam) { return 0; }

        virtual LRESULT OnDropFiles(WPARAM wParam, LPARAM lParam) { return 0; }

 

        // °´Ã¼ ¸Ê

        static map<HWND, CWindow*>* pWinMap;

        static void DeleteMap();

        static LRESULT CALLBACK CWindowProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);

};

 

CWindow´Â ÀϹÝÀûÀÎ À©µµ¿ì Çϳª¸¦ Ç¥ÇöÇϴ Ŭ·¡½ºÀÌ´Ù. À©µµ¿ì ÇÚµéÀº ´ç¿¬È÷ °¡Á®¾ß ÇÏ¸ç ´õºí¹öÆÛ¸µ ±â´ÉÀ» ±âº»ÀûÀ¸·Î Á¦°øÇÑ´Ù. ´ëºÎºÐÀÇ ÄÁÆ®·ÑÀÌ ±ô¹ÚÀÓ °¨¼Ò¸¦ À§ÇØ ´õºí¹öÆÛ¸µÀ» ±¸ÇöÇϹǷΠ¾Æ¿¹ ·çÆ® À©µµ¿ì ÀÚü¿¡ ÀÌ ±â´ÉÀ» ³Ö¾ú´Ù. À̸¦ À§ÇØ ¹è°æ»ö°ú ¹è°æ ºê·¯½Ã°¡ ÇÊ¿äÇØ ¸â¹ö·Î Æ÷ÇÔÇÑ´Ù.

CWindowÀÇ ¸â¹ö´Â ¸ðµÎ win_ Á¢µÎ·Î ½ÃÀÛÇÏ¿© À©µµ¿ì ¼Ò¼ÓÀÓÀ» ºÐ¸íÈ÷ Çß´Ù. ¸íĪÀ» ºÐ¸íÈ÷ ¹àÈ÷Áö ¾ÊÀ¸¸é Áö¿ª º¯¼ö¿Í Çò°¥·Á ¾û¶×ÇÑ ½Ç¼ö¸¦ ÇÒ À§ÇèÀÌ ³ô´Ù. ÀÌ·² ¶§ º¸Åë m_ Á¢µÎ¸¦ ºÙÀ̴µ¥ KFC´Â ¾Æ¿¹ ¼Ò¼Ó Ŭ·¡½º¸íÀ» Á¢µÎ·Î ºÙ¿© Á¤ÀÇµÈ À§Ä¡¸¦ ºÐ¸íÈ÷ ¹àÈ÷µµ·Ï Çß´Ù.

»ý¼ºÀÚ, Æı«ÀÚ°¡ Á¤ÀǵǾî ÀÖµÇ Æı«ÀÚ¸¦ ¿ÜºÎ¿¡¼­ Á÷Á¢ È£ÃâÇÒ ¼ö ÀÖµµ·Ï Dispose ¸Þ¼­µå·Î ºÐ¸®ÇØ µÎ¾ú´Ù. À©µµ¿ì¸¦ »ý¼ºÇÏ´Â Create¿Í ¹è°æ»öÀ» ÁöÁ¤ ¶Ç´Â º¯°æÇÏ´Â SetBackColor¸¦ Á¤ÀÇÇß´Ù. ¸Þ½ÃÁö Çڵ鷯´Â ¸ðµÎ °¡»óÀ¸·Î ¼±¾ðÇØ µÎ¾î ÆÄ»ý Ŭ·¡½º¿¡¼­ ¾ðÁ¦µçÁö ÀçÁ¤ÀÇÇÒ ¼ö ÀÖµµ·Ï ÇØ µÎ¾ú´Ù.

CWindow´Â À©µµ¿ìÀ̸鼭 À©µµ¿ì¸¦ °ü¸®ÇÏ´Â °´Ã¼ ¸Êµµ Æ÷ÇÔÇÑ´Ù. ½º½º·Î °ü¸® °´Ã¼¸¦ ³»ºÎ¿¡ µÎ´Â °ÍÀÌ Á» ¾î»öÇÏÁö¸¸ Á¤Àû ¸â¹ö·Î µÎ¸é º°µµÀÇ »óÀ§ Ŭ·¡½º°¡ ÇÊ¿ä ¾ø¾î ÇüÅ°¡ ´Ü¼øÇØÁö´Â ÀÌÁ¡ÀÌ ÀÖ´Ù. pWinMapÀº À©µµ¿ì ÇÚµé°ú À©µµ¿ì °´Ã¼ÀÇ ½ÖÀ» ÀúÀåÇÏ´Â ¸ÊÀÌ´Ù. ÀÌ ¸ÊÀ» ÅëÇØ À©µµ¿ì ÇÚµé·ÎºÎÅÍ °´Ã¼¸¦ ã¾Æ ÀûÀýÇÑ ¸Þ½ÃÁö Çڵ鷯¸¦ È£ÃâÇÑ´Ù.

Á¤Àû ¸â¹ö ÇÔ¼öÀÎ CWindowProcÀº ¸ðµç À©µµ¿ìÀÇ ¸Þ½ÃÁö¸¦ ¸ÕÀú ¹Þ´Â ¸Þ½ÃÁö ÇÁ·Î½ÃÀúÀÌ´Ù. °´Ã¼ ¸ÊÀ» ÅëÇØ ¾îµð·Î Àü´ÞÇÒ ¸Þ½ÃÁöÀÎÁö ÆǺ°ÇÏ¿© ¸Þ½ÃÁö¸¦ ºÐ¹èÇÏ´Â ¿ªÇÒÀ» ÇÏ¸ç »õ·Î »ý¼ºµÈ À©µµ¿ì¸¦ ¸Ê¿¡ µî·ÏÇϱ⵵ ÇÑ´Ù. ±¸Çö ÆÄÀϱîÁö ÀÛ¼ºÇÑ ÈÄ ºÐ¼®ÇØ º¸ÀÚ. Window.cpp ÆÄÀÏÀ» Ãß°¡ÇÏ°í ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

#include <windows.h>

#include <map>

using namespace std;

#include "Window.h"

#include "Util.h"

 

extern HINSTANCE g_hInst;

 

// °´Ã¼ ¸Ê Á¤Àû ¸â¹ö ¼±¾ð

map<HWND, CWindow*> * CWindow::pWinMap;

 

CWindow::CWindow() {

        Trace(L"CWindow »ý¼ºÀÚ È£Ãâ");

        SetBackColor(RGB(255, 255, 255));

        win_dblBuffer = nullptr;

 

        // ÃÖÃÊ Çѹø¸¸ À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇÏ°í °´Ã¼ ¸ÊÀ» ÃʱâÈ­ÇÑ´Ù.

        if (pWinMap == nullptr) {

                   Trace(L"À©µµ¿ì Ŭ·¡½º µî·Ï, À©µµ¿ì ¸Ê ÃʱâÈ­");

                   pWinMap = new map<HWND, CWindow*>();

                   WNDCLASS WndClass;

 

                   WndClass.cbClsExtra = 0;

                   WndClass.cbWndExtra = 0;

                   // ´õºí¹öÆÛ¸µÀÌ ±âº» Á¦°øµÇ¾î ¹è°æ ºê·¯½Ã´Â ¾ø´Ù.

                   WndClass.hbrBackground = NULL;

                   WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

                   WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

                   WndClass.hInstance = GetModuleHandle(NULL);

                   // À©µµ¿ì ÇÁ·Î½ÃÀú¿Í À©µµ¿ì Ŭ·¡½º¸íÀÌ °íÁ¤µÇ¾î ÀÖ´Ù.

                   WndClass.lpfnWndProc = (WNDPROC)CWindow::CWindowProc;

                   WndClass.lpszClassName = L"CWindow";

                   WndClass.lpszMenuName = NULL;

                   // ´õºíŬ¸¯À» ±âº» Áö¿øÇÑ´Ù.

                   WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

                   RegisterClass(&WndClass);

        }

}

 

void CWindow::Dispose() {

        Trace(L"CWindow Dispose È£Ãâ");

        if (win_backBrush != nullptr) DeleteObject(win_backBrush);

        if (win_dblBuffer != nullptr) DeleteObject(win_dblBuffer);

 

        // ¸Ê¿¡¼­ À©µµ¿ì Á¦°Å. ¸Ê ÀÚü°¡ ÀÌ¹Ì Æı«µÇ¾úÀ¸¸é(ÇÁ·Î±×·¥ Á¾·á½Ã) Á¤¸®ÇÒ ÇÊ¿ä ¾ø´Ù.

        if (pWinMap != nullptr) {

                   pWinMap->erase(win_hWnd);

                   Trace(L"%x À©µµ¿ì Á¦°Å", win_hWnd);

        }

}

 

void CWindow::Create(HWND hParent, DWORD style, int child_id, LPCTSTR title) {

        CreateWindow(TEXT("CWindow"), title, style,

                   0, 0, 0, 0, hParent, (HMENU)(ULONG_PTR)child_id, g_hInst, this);

}

 

void CWindow::SetBackColor(COLORREF color) {

        win_backColor = color;

        if (win_backBrush != nullptr) DeleteObject(win_backBrush);

        win_backBrush = CreateSolidBrush(color);

}

 

void CWindow::DeleteMap() {

        delete pWinMap;

        pWinMap = nullptr;

}

 

// ±âº» ¸Þ½ÃÁö¸¦ ó¸®ÇØ ÁÖ¸ç Â÷Àϵå´Â ¸Þ½ÃÁö Çڵ鷯·Î ¹Þ´Â´Ù. ±× ¿ÜÀÇ ¸Þ½ÃÁö´Â Â÷Àϵ尡 Á÷Á¢ ó¸®ÇØ¾ß ÇÑ´Ù.

LRESULT CWindow::OnMessage(UINT iMessage, WPARAM wParam, LPARAM lParam) {

        switch (iMessage)

        {

        case WM_CREATE:

                   return OnCreate(wParam, lParam);

        case WM_DESTROY:

                   return OnDestroy(wParam, lParam);

        case WM_SIZE:

                   return OnSize(wParam, lParam);

        case WM_PAINT:

                   return OnPaint(wParam, lParam);

        case WM_TIMER:

                   return OnTimer(wParam, lParam);

        case WM_COMMAND:

                   return OnCommand(wParam, lParam);

        case WM_CONTEXTMENU:

                   return OnContextMenu(wParam, lParam);

        case WM_KEYDOWN:

                   return OnKeyDown(wParam, lParam);

        case WM_LBUTTONDOWN:

                   return OnLButtonDown(wParam, lParam);

        case WM_MOUSEMOVE:

                   return OnMouseMove(wParam, lParam);

        case WM_LBUTTONUP:

                   return OnLButtonUp(wParam, lParam);

        case WM_LBUTTONDBLCLK:

                   return OnLButtonDblClk(wParam, lParam);

        case WM_MOUSEWHEEL:

                   return OnMouseWheel(wParam, lParam);

        case WM_USER + 1:

                   return OnUser1(wParam, lParam);

        case WM_USER + 2:

                   return OnUser2(wParam, lParam);

        case WM_DROPFILES:

                   return OnDropFiles(wParam, lParam);

        }

        return(DefWindowProc(win_hWnd, iMessage, wParam, lParam));

}

 

// OnPaint´Â ÀÏ´Ü ·çÆ®°¡ ¹ÞÀº ÈÄ ´õºí¹öÆÛ¸µ Áغñ¸¦ Çؼ­ OnDraw °¡»ó ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

// ´õºí¹öÆÛ¸µÀ» ¿øÇÏÁö ¾ÊÀ» °æ¿ì Á÷Á¢ ÀçÁ¤ÀÇÇÑ´Ù.

LRESULT CWindow::OnPaint(WPARAM wParam, LPARAM lParam)

{

        HDC hdc;

        PAINTSTRUCT ps;

        HDC hMemDC;

        HBITMAP oldBit;

 

        RECT crt;

        GetClientRect(win_hWnd, &crt);

        hdc = BeginPaint(win_hWnd, &ps);

        if (win_dblBuffer == nullptr) {

                   win_dblBuffer = CreateCompatibleBitmap(hdc, crt.right, crt.bottom);

        }

        hMemDC = CreateCompatibleDC(hdc);

        oldBit = (HBITMAP)SelectObject(hMemDC, win_dblBuffer);

        FillRect(hMemDC, &crt, win_backBrush);

 

        // Â÷Àϵ忡°Ô ¸Þ¸ð¸® DC¸¦ »ý¼ºÇÏ¿© Àü´ÞÇÑ´Ù.

        OnDraw(hMemDC, crt.right, crt.bottom);

 

        SelectObject(hMemDC, oldBit);

        DeleteDC(hMemDC);

        DrawBitmap(hdc, 0, 0, win_dblBuffer);

        EndPaint(win_hWnd, &ps);

        return 0;

}

 

// Å©±â°¡ ¹Ù²î¸é ´õºí¹öÆÛ¸µ ºñÆ®¸ÊÀ» »õ·Î ¸¸µç´Ù.

// ÆÄ»ý Ŭ·¡½º´Â WM_SIZE¸¦ ¹Þ¾ÒÀ» ¶§ CWindow::OnSizeºÎÅÍ ¸ÕÀú È£ÃâÇØ¾ß ÇÑ´Ù.

LRESULT CWindow::OnSize(WPARAM wParam, LPARAM lParam)

{

        if (win_dblBuffer != nullptr) {

                   DeleteObject(win_dblBuffer);

                   win_dblBuffer = nullptr;

        }

        return 0;

}

 

// ¸ðµç À©µµ¿ìÀÇ ¸Þ½ÃÁö ÇÁ·Î½ÃÀú´Â ÀÌ ÇÔ¼ö Çϳª »ÓÀÌ´Ù. 

LRESULT CALLBACK CWindow::CWindowProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

        CWindow* pWin = nullptr;

 

        // ¸Ê¿¡ µî·ÏµÇ¾î ÀÖ´Â À©µµ¿ìÀÎÁö ã´Â´Ù.

        if (pWinMap->find(hWnd) != pWinMap->end()) {

                   pWin = (*pWinMap)[hWnd];

        }

 

        // ¾øÀ¸¸é ¸Ê¿¡ Ãß°¡ÇÑ´Ù.

        if (pWin == nullptr) {

                   // WS_THICKFRAME ½ºÅ¸ÀÏÀÌ ÀÖÀ» ¶§ °¡Àå ¸ÕÀú ¿À¸ç À̶§ lParamÀº MINMAXINFO¿©¼­ °´Ã¼¸¦ ãÀ» ¼ö ¾ø´Ù.

                   if (iMessage == WM_GETMINMAXINFO) {

                              return DefWindowProc(hWnd, iMessage, wParam, lParam);

                   }

                   pWin = (CWindow*)((LPCREATESTRUCT)lParam)->lpCreateParams;

 

                   // °´Ã¼ Ãß°¡ÇÏ°í °´Ã¼ÀÇ ¸â¹ö¿¡ À©µµ¿ì ÇÚµé ´ëÀÔ

                   (*pWinMap)[hWnd] = pWin;

                   pWin->win_hWnd = hWnd;

                   Trace(L"»õ À©µµ¿ì Ãß°¡. °´Ã¼ : %x - À©µµ¿ì %x", pWin, hWnd);

        }

 

        // À©µµ¿ì °´Ã¼·Î ¸Þ½ÃÁö¸¦ Àü´ÞÇÑ´Ù.

        return pWin->OnMessage(iMessage, wParam, lParam);

}

 

»ý¼ºÀÚ´Â ¹è°æ»öÀ» Èò»öÀ¸·Î ÃʱâÈ­ÇÏ°í ´õºí¹öÆÛ¸µ ºñÆ®¸Êµµ nullptr·Î ÃʱâÈ­ÇÑ´Ù. ºñÆ®¸ÊÀº óÀ½ WM_PAINT ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ÀÛ¾÷¿µ¿ª Å©±â¿¡ ¸Â°Ô »ý¼ºÇÏ¸ç ¹è°æ»öÀº ¿øÇÒ °æ¿ì ¾ðÁ¦µçÁö ´Ù¸¥ »öÀ¸·Î º¯°æÇÒ ¼ö ÀÖ´Ù.

ÀÌÈÄÀÇ ¸ðµç À©µµ¿ì¸¦ »ý¼ºÇϱâ À§ÇÑ À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇ쵂 ÀÌ ÀÛ¾÷Àº pWinMapÀÌ ¾ÆÁ÷ »ý¼ºµÇÁö ¾ÊÀº ÃÖÃÊ µü Çѹø¸¸ ¼öÇàÇÑ´Ù. ¿ø·¡´Â WinMain¿¡¼­ ÇØ¾ß ÇÏ´Â ÀÛ¾÷À̳ª Ŭ¶óÀ̾ðÆ®ÀÇ ºÎ´ãÀ» ÁÙÀ̱â À§ÇØ ¾î¶² À©µµ¿ìµçÁö óÀ½ »ý¼ºµÇ´Â À©µµ¿ì°¡ µî·ÏÇϵµ·Ï Çß´Ù.

CWindow°¡ µî·ÏÇÏ´Â À©µµ¿ì Ŭ·¡½ºÀÇ ¸Þ½ÃÁö ÇÁ·Î½ÃÀú´Â CWindowProcÀ¸·Î °íÁ¤µÇ¾î ÀÖÀ¸¸ç À©µµ¿ì Ŭ·¡½º¸íµµ °íÁ¤ÀÌ´Ù. Áï, ¸ðµç À©µµ¿ì´Â ¿î¿µÃ¼Á¦ ÀÔÀå¿¡¼­´Â ¶È°°Àº À©µµ¿ìÀÌµÇ °´Ã¼°¡ ¸Þ½ÃÁö ó¸® ÇÔ¼ö¸¦ ¾î¶»°Ô Á¤ÀÇÇϴ°¡¿¡ µû¶ó µ¿ÀÛÀÌ ´Þ¶óÁø´Ù. Çൿ ¹æ½ÄÀÌ À©µµ¿ì Ŭ·¡½º°¡ ¾Æ´Ñ C++ class¿¡ ÀÇÇØ °áÁ¤µÈ´Ù.

À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇÒ ¶§ °´Ã¼ ¸Êµµ »ý¼ºÇÑ´Ù. pWinMap Á¤Àû º¯¼ö´Â ÃÖÃÊ nullptrÀÌ´Ù°¡ ù »ý¼ºÀÚ È£Ãâ½Ã »ý¼ºÇÑ´Ù. pWinMapÀÌ »ý¼ºµÇ¸é ÀÌÈĺÎÅÍ »ý¼ºµÇ´Â À©µµ¿ì´Â ÀڽŸ¸ ÃʱâÈ­ÇÒ »Ó À©µµ¿ì Ŭ·¡½º³ª °´Ã¼ ¸ÊÀº ½Å°æ¾²Áö ¾Ê´Â´Ù. ÃʱâÈ­ Àü°ú Èĸ¦ ±¸ºÐÇϱâ À§ÇØ ¸ÊÀ» Á¤Àû º¯¼ö°¡ ¾Æ´Ñ Æ÷ÀÎÅÍ·Î ¼±¾ðÇß´Ù.

Dispose ¸Þ¼­µå´Â Æı«ÀÚ°¡ È£ÃâÇÏ´Â Á¤¸® ÇÔ¼öÀÌ´Ù. Äڵ忡¼­ Æı«ÀÚ¸¦ Á÷Á¢ È£ÃâÇÒ ¼ö ¾ø±â ¶§¹®¿¡ º°µµÀÇ ¸Þ¼­µå·Î »© µÎ¾ú´Ù. ºê·¯½Ã¿Í ´õºí¹öÆÛ¸µ ºñÆ®¸ÊÀ» Æı«ÇÏ´Â °ÍÀº ±âº» Á¤¸® ÀýÂ÷ÀÌ¸ç °´Ã¼ ¸Ê¿¡¼­µµ À©µµ¿ì¸¦ Á¦°ÅÇ쵂 ÀÌ Á¶°ÇÀº Á» º¹ÀâÇÏ´Ù. ÀÌÈÄ ¸ÞÀÎ À©µµ¿ì±îÁö ¸¸µç ÈÄ ´Ù½Ã ¿¬±¸ÇØ º¸ÀÚ.

Create´Â À©µµ¿ì¸¦ »ý¼ºÇÑ´Ù. °´Ã¼¸¦ »ý¼ºÇÏ´Â °Í°ú À©µµ¿ì¸¦ »ý¼ºÇÏ´Â °ÍÀº ´Ù¸£´Ù. °´Ã¼´Â ¾îµð±îÁö³ª ¸Þ¸ð¸® ³»ÀÇ Á¤º¸ ÁýÇÕÀÏ »ÓÀ̸ç È­¸é»ó¿¡ ¿òÁ÷ÀÌ´Â ½Çü°¡ ¾Æ´Ï´Ù. CreateWindow¸¦ È£ÃâÇØ¾ß È­¸é¿¡ Ç¥½ÃÇÏ´Â À©µµ¿ì°¡ µÈ´Ù. À©µµ¿ì Ŭ·¡½º´Â °íÁ¤µÇ¾î ÀÖ°í ½ºÅ¸ÀÏ, ID, Á¦¸ñÀº Àμö·Î ÁöÀúÇÒ ¼ö ÀÖ´Ù.

OnMessage´Â ¸Þ½ÃÁö¿Í °¡»ó ÇÔ¼ö¸¦ ¿¬°áÇÑ´Ù. ´ëºÎºÐÀÇ À©µµ¿ì°¡ ±âº»ÀûÀ¸·Î ó¸®ÇÏ´Â ¸Þ½ÃÁö¸¦ ¸ðµÎ µî·ÏÇØ µÎ¾úÀ¸¸ç »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁö¿¡ ´ëÇÑ Çڵ鷯µµ 2°³³ª µî·ÏÇØ µÎ¾ú´Ù. ¹Ì¸® ¿¬°áÇØ ³õÁö ¾ÊÀº ³ª¸ÓÁö ¸Þ½ÃÁö´Â ¸ðµÎ DefWindowProcÀ¸·Î Àü´ÞÇÏ¿© µðÆúÆ® ó¸®ÇÑ´Ù. OnMessage¸¦ ÅëÇØ °¢ À©µµ¿ì´Â ÀÚ½ÅÀÌ Á¤ÀÇÇÑ °¡»ó ÇÔ¼ö·Î ¸Þ½ÃÁö¸¦ ¹Þ°Ô µÈ´Ù.

ÀÌ°ÍÀÌ °¡´ÉÇϵµ·Ï Çϱâ À§ÇØ °´Ã¼ ¸ÊÀ» °ü¸®ÇÏ°í ÇÚµé·ÎºÎÅÍ °´Ã¼¸¦ ã¾Æ °¡»ó ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï ü°è¸¦ ¸¸µé¾î °¡´Â °ÍÀÌ´Ù. °¢ ¸Þ½ÃÁö¸¦ ¾î¶»°Ô ó¸®ÇÒ °ÍÀΰ¡´Â °³º° À©µµ¿ì°¡ ¸¶À½´ë·Î °áÁ¤ÇÒ ¼ö ÀÖµµ·Ï CWindowÀÇ ±âº» ±¸ÇöÀº ¸ðµÎ 0À» ¸®ÅÏÇÏ´Â °ÍÀ¸·Î µÇ¾î ÀÖ´Ù. ´Ü, OnPaint¿Í OnSize¿¡ ´ëÇؼ­´Â ±âº» ±¸ÇöÀ» Á¦°øÇÑ´Ù.

OnPaint´Â ÀÛ¾÷¿µ¿ª Å©±â¿¡ ¸Â°Ô ´õºí¹öÆÛ¸µ ºñÆ®¸ÊÀ» »ý¼ºÇÏ°í ÀÌ ºñÆ®¸ÊÀ» DC¿¡ ¼±ÅÃÇØ µÐ´Ù. ¹è°æ ºê·¯½Ã·Î ºñÆ®¸ÊÀ» ¸ðµÎ ä¿î ÈÄ OnDraw·Î DC¿Í ÀÛ¾÷¿µ¿ª Å©±â¸¦ Àü´ÞÇÑ´Ù. °´Ã¼°¡ ¹è°æÀ» ä¿ì¹Ç·Î À©µµ¿ì Ŭ·¡½ºÀÇ ¹è°æ ºê·¯½Ã´Â NULLÀÌ´Ù. °á±¹ À©µµ¿ì¿¡ ¹«¾ùÀ» ±×¸± °ÍÀΰ¡´Â ÆÄ»ý Ŭ·¡½ºÀÇ OnDraw¿¡¼­ ¾î¶»°Ô Ãâ·ÂÇϴ°¡¿¡ µû¶ó °áÁ¤µÈ´Ù.  OnDraw°¡ ºñÆ®¸ÊÀ» ¿Ï¼ºÇÏ¿© ¸®ÅÏÇϸé ÀÌ ºñÆ®¸ÊÀ» È­¸éÀ¸·Î °í¼Ó Àü¼ÛÇÑ´Ù.

OnSize´Â À©µµ¿ì Å©±â°¡ ¹Ù²ð ¶§ ´õºí¹öÆÛ¸µ ºñÆ®¸ÊÀ» ¹«È¿È­ÇÑ´Ù. ºñÆ®¸ÊÀ» Áö¿ö ³õ±â¸¸ Çϸé OnPaint¿¡¼­ º¯°æµÈ ÀÛ¾÷¿µ¿ª Å©±â¿¡ ¸ÂÃß¾î »õ·Î »ý¼ºÇϵµ·Ï µÇ¾î ÀÖ´Ù. µÎ Çڵ鷯°¡ ´õºí¹öÆÛ¸µÀ» Àß Áö¿øÇÏ°í ÀÖÀ¸¹Ç·Î Â÷Àϵå´Â OnDraw¿¡¼­ Çã°¡µÈ ¿µ¿ª¿¡ ±×¸®°í ½ÍÀº °Í¸¸ ±×¸®¸é µÈ´Ù.

´ëºÎºÐÀÇ À©µµ¿ì´Â ±ô¹ÚÀÓ ¹æÁö¸¦ À§ÇØ ´õºí¹öÆÛ¸µÀÌ ÇÊ¿äÇÏ´Ù. ´õºí¹öÆÛ¸µÀ» ÇÏÁö ¾Ê°Å³ª ºÒÇÊ¿äÇÏ´Ù¸é OnPaint¸¦ ÀçÁ¤ÀÇÇÏ¿© Á÷Á¢ ±×¸®¸é µÈ´Ù. ÀÌ °æ¿ì´Â OnSizeÀÇ Äڵ嵵 µüÈ÷ ÇÊ¿äÄ¡ ¾ÊÁö¸¸ ºñÆ®¸ÊÀÌ Ç×»ó nullptrÀ̹ǷΠ±×´ë·Î µÎ¾îµµ º°´Ù¸¥ ºÎÀÛ¿ëÀº ¾ø´Ù.

CWindowProcÀº CWindow ÆÄ»ý Ŭ·¡½ºÀÇ ¸Þ½ÃÁö¸¦ ¹Þ´Â À©µµ¿ì ÇÁ·Î½ÃÀúÀÌ´Ù. ¿î¿µÃ¼Á¦°¡ ¿ä±¸ÇÏ´Â ¿øÇü¿¡ ¸ÂÃß±â À§ÇØ Á¤Àû ¸Þ¼­µå·Î ¼±¾ðÇß´Ù. ¿î¿µÃ¼Á¦´Â À©µµ¿ì Çڵ鿡 ´ëÇØ ¸Þ½ÃÁö¸¦ º¸³»´Âµ¥ ¿ì¸®´Â À©µµ¿ì¸¦ °´Ã¼·Î Á¤ÀÇÇß´Ù. µû¶ó¼­ ÇÚµé°ú °´Ã¼¸¦ ´ëÀÀ½Ãų ÇÊ¿ä°¡ Àִµ¥ ÀÌ Á¤º¸¸¦ arWinMapÀÌ °¡Áö¸ç ÇÚµé°ú °´Ã¼ÀÇ º¯È¯À» CWindowProcÀÌ Ã³¸®ÇÑ´Ù.

CWindowProcÀÇ ÁÖ¾÷¹«´Â À©µµ¿ì ÇÚµé°ú °´Ã¼ÀÇ ´ëÀÀÇ¥¸¦ º¸°í °´Ã¼¸¦ ã¾Æ °¡»ó ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¿Ü¿¡µµ »õ·Î µé¾î¿Â ¸Þ½ÃÁöÀÇ ÁÖÀÎÀÌ ¾ÆÁ÷ µî·ÏµÇ¾î ÀÖÁö ¾ÊÀ¸¸é °´Ã¼ ¸Ê¿¡ µî·ÏÇÏ¿© ÀÌÈĺÎÅÍ °´Ã¼¸¦ ÅëÇØ ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¼ö ÀÖµµ·Ï Á¶Ä¡ÇÑ´Ù.

À©µµ¿ì ¿î¿µÃ¼Á¦´Â °´Á¦ ÁöÇâÀûÀÌÁö ¾ÊÁö¸¸ CWindowProc¿¡ ÀÇÇØ À©µµ¿ì´Â °´Ã¼°¡ µÇ°í °¡»ó ÇÔ¼ö¿¡ ÀÇÇØ ´ÙÇüÀûÀ¸·Î µ¿ÀÛÇÑ´Ù. ÀÌ Ã¼°è¸¦ Àß ±¸ÃàÇØ ³õÀ¸¸é ÀÌÈĺÎÅÍ À©µµ¿ì¸¦ »ý¼ºÇÏ°í µ¿ÀÛÀ» Á¤ÀÇÇϱâ Æí¸®Çϸç C++ÀÇ ¸ðµç ÀÌÁ¡À» ´©¸± ¼ö ÀÖ´Ù.

¸ÞÀÎ ¸ðµâ

¿©±â±îÁö´Â À©µµ¿ì¸¦ »ý¼ºÇÏ°í ¿î¿ëÇÒ Áغñ¸¸ Çß´Ù. ÀÌÁ¦ ½ÇÁ¦ À©µµ¿ì¸¦ ¸¸µé¾î º¸ÀÚ. SoEnty.h Çì´õ ÆÄÀÏÀ» Ãß°¡ÇÏ°í ¸ÞÀÎ À©µµ¿ì¿Í °£´ÜÇÑ ½Ã°è À©µµ¿ì¸¦ ¼±¾ðÇÑ´Ù. °üÇà»ó Ŭ·¡½º À̸§Àº ¸ðµÎ ´ë¹®ÀÚ C·Î ½ÃÀÛÇÑ´Ù.

 

// ¸ÞÀÎ À©µµ¿ì Ŭ·¡½º ¼±¾ð

class CMainWindow : public CWindow

{

public:

        // CWindowÀÇ Create¿Í ´Ù¸¦ °æ¿ì º°µµÀÇ ÇÔ¼ö¸¦ ¸¸µç´Ù.

        // ´ëºÎºÐÀÇ Â÷Àϵå´Â ÀçÁ¤ÀÇ ºÒÇÊ¿äÇÏ´Ù.

        void Create();

 

        // °ü½ÉÀÖ´Â ¸Þ½ÃÁöÀÇ Çڵ鷯¸¸ ÀçÁ¤ÀÇÇÑ´Ù.

        LRESULT OnMessage(UINT iMessage, WPARAM wParam, LPARAM lParam);

        LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

        LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

        LRESULT OnKeyDown(WPARAM wParam, LPARAM lParam);

};

 

class CClock : public CWindow

{

public:

        // ÇÊ¿äÇÑ ¸â¹ö¸¦ Á¤ÀÇÇÑ´Ù.

        TCHAR sTime[128];

 

        LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

        LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

        LRESULT OnTimer(WPARAM wParam, LPARAM lParam);

        void OnDraw(HDC hdc,int width, int height);

};

 

µÑ ´Ù CWindow·ÎºÎÅÍ ÆÄ»ýµÇ¸ç ±âº» ¼Ó¼º°ú µ¿ÀÛÀ» ¹°·Á ¹ÞÀº ÈÄ ¿øÇÏ´Â ±â´É¸¸ ÀçÁ¤ÀÇÇÏ¸é µÈ´Ù. ¸ðµç ÆÄ»ý Ŭ·¡½º´Â ¹è°æ»öÀ» °¡Áö°í ´õºí¹öÆÛ¸µÀ» Áö¿øÇϸç OnMessage¸¦ ÅëÇØ ¸Þ½ÃÁö¸¦ ºÐ¹èÇÏ´Â ´É·ÂÀ» °¡Áø´Ù. ´ë°³ÀÇ °æ¿ì ¸Þ½ÃÁö Çڵ鷯¸¸ ÀçÁ¤ÀÇÇصµ ¿øÇÏ´Â ±â´ÉÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. Ŭ·¡½º ¼±¾ð¹®¿¡ ÀçÁ¤ÀÇÇÒ ¸Þ¼­µå ¸ñ·ÏÀ» ³ª¿­ÇÑ´Ù.

¸ÞÀÎ À©µµ¿ì´Â ´ëÀåÀ̶ó´Â Á¡¿¡¼­ ¼Ó¼º°ú ¸Þ½ÃÁö 󸮰¡ ƯÀÌÇØ Create¿Í OnMessage¸¦ ÀçÁ¤ÀÇÇÑ´Ù. »ç½Ç Create ÇÔ¼ö´Â ¿øÇüÀÌ ´Þ¶ó ÀçÁ¤ÀÇ°¡ ¾Æ´Ï¶ó ¾Æ¿¹ ´Ù¸¥ ÇÔ¼ö¸¦ Çϳª ´õ ¸¸µç °ÍÀÌ´Ù. ¸ÞÀÎ À©µµ¿ìÀ̴ϸ¸Å­ Â÷Àϵå¿Í´Â »ý¼º ¹æ¹ýÀÌ µ¶Æ¯ÇÏ´Ù.

CClockÀº ¸Þ½ÃÁö Çڵ鷯 ¿Ü¿¡ ÇöÀç ½Ã°£À» ÀúÀåÇÒ sTime ¹öÆÛ¸¦ ¸â¹ö·Î ¼±¾ðÇÑ´Ù. Ŭ·¡½ºÀ̹ǷΠ´ç¿¬È÷ ¸â¹ö¸¦ ÀÚÀ¯·Ó°Ô Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ÇÊ¿äÇÑ ¸ðµç °ÍÀ» Ŭ·¡½º ³»ºÎ¿¡ ĸ½¶È­ÇÏ¿© ´Ù¸¥ Ŭ·¡½º¿Í ¸íĪ Ãæµ¹À» °ÆÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ÇÁ·ÎÁ§Æ®°¡ ¾Æ¹«¸® Ä¿Á®µµ Ŭ·¡½º ¾È¿¡¼­ ¸â¹ö¸¦ ÀÚÀ¯·Ó°Ô ¼±¾ðÇÒ ¼ö ÀÖ´Ù.

CWindow´Â ¹°·ÐÀÌ°í CMainWindow, CClockÀÇ ¸ðµç ¸â¹ö´Â ´Ù publicÀÌ¸ç ¸ðµÎ °ø°³µÇ¾î ÀÖ´Ù. °´Ã¼´Â ³»ºÎ ±¸ÇöÀ» ÀûÀýÈ÷ ¼û°Ü¾ß ÇÏÁö¸¸ ÀÌ ÇÁ·ÎÁ§Æ®ÀÇ °´Ã¼´Â ÀÛ¼ºÀÚ°¡ °ð »ç¿ëÀÚÀ̹ǷΠ±»ÀÌ ±×·² ÇÊ¿ä ¾ø´Ù. °³¹ßÁß¿¡ ¸ðµç ¸â¹ö´Â °ø°³ÀÌµÇ ³ªÁß¿¡ ²À ÇÊ¿äÇÑ ¸â¹ö¸¸ ¼±º°ÀûÀ¸·Î ¼û±â¸é µÈ´Ù.  ±¸Çö ÆÄÀÏÀº SoEnty.cpp ÆÄÀÏ¿¡ ÀÛ¼ºÇÑ´Ù.

 

#include <windows.h>

#include <tchar.h>

#include <map>

using namespace std;

#include "Window.h"

#include "SoEnty.h"

#include "Util.h"

 

// ÀνºÅϽº ÇÚµé °´Ã¼

HINSTANCE g_hInst;

// ¸ÞÀÎ À©µµ¿ì

CMainWindow mainWindow;

// mainWindow ¾È¿¡ Æ÷ÇÔ½ÃÄѵµ »ó°ü ¾øÀ½.

CClock childClock;

CClock* pClock;

 

void CMainWindow::Create()

{

        // À©µµ¿ì Ŭ·¡½º´Â ¹«Á¶°Ç CWindow·Î ÁöÁ¤ÇÑ´Ù. ¸ÞÀÎÀº CHILD°¡ ¾Æ´Ï¾î¼­ ÀçÁ¤ÀÇÇß´Ù.

        CreateWindow(L"CWindow", L"main", WS_OVERLAPPEDWINDOW,

                   10, 10, 640, 480, nullptr, (HMENU)0, g_hInst, this);

}

 

LRESULT CMainWindow::OnMessage(UINT iMessage, WPARAM wParam, LPARAM lParam) {

        // Çڵ鷯°¡ Á¤ÀǵÇÁö ¾ÊÀº ¸Þ½ÃÁö¸¦ Á÷Á¢ ó¸®ÇÑ´Ù.

        switch (iMessage)

        {

        case WM_RBUTTONDOWN:

                   MessageBox(win_hWnd, L"¸¶¿ì½º ¿À¸¥ÂÊ ¹öÆ°À» ´­·¶½À´Ï´Ù.", L"¾Ë¸²", MB_OK);

                   return 0;

        }

 

        // Çڵ鷯°¡ Á¤ÀǵǾî ÀÖ´Â ¸Þ½ÃÁö´Â Çڵ鷯¸¦ ã¾Æ È£ÃâÇÑ´Ù.

        return CWindow::OnMessage(iMessage, wParam, lParam);

}

 

LRESULT CMainWindow::OnCreate(WPARAM wParam, LPARAM lParam)

{

        Trace(L"MainWindow OnCreate. hWnd = %x", win_hWnd);

        childClock.Create(win_hWnd);

        MoveWindow(childClock.win_hWnd, 10, 10, 300, 100, TRUE);

        childClock.SetBackColor(RGB(255, 255, 0));

        return 0;

}

 

LRESULT CMainWindow::OnDestroy(WPARAM wParam, LPARAM lParam)

{

        PostQuitMessage(0);

        return 0;

}

 

LRESULT CMainWindow::OnKeyDown(WPARAM wParam, LPARAM lParam)

{

        switch (wParam) {

        case '1':

                   // Â÷Àϵå À©µµ¿ì¸¦ ´Ù½Ã ¸¸µç´Ù.

                   if (IsWindow(childClock.win_hWnd) == FALSE) {

                              childClock.Create(win_hWnd);

                              MoveWindow(childClock.win_hWnd, 10, 10, 300, 100, TRUE);

                              childClock.SetBackColor(RGB(255, 255, 0));

                   }

                   break;

        case '2':

                   if (IsWindow(childClock.win_hWnd)) {

                              // ½ÇÇàÁß¿¡ Á¤Àû Â÷Àϵå À©µµ¿ì¸¦ Æı«ÇÒ ¶§ÀÇ Ã³¸®.

                              DestroyWindow(childClock.win_hWnd);

                              // ¿©±â¼­ °´Ã¼¸¦ Á¦°ÅÇÑ´Ù. Æı«ÁßÀÇ ¸Þ½ÃÁö´Â ¸ðµÎ SendMessage·Î º¸³»±â ¶§¹®¿¡ ´õ ó¸®ÇÒ ¸Þ½ÃÁö°¡ ¾ø´Ù.

                              childClock.Dispose();

                              // Á¤ÀûÀ¸·Î ¼±¾ðÇÑ °´Ã¼¸¦ Æı«ÇÒ ÇÊ¿ä´Â ¾ø´Ù.

                   }

                   break;

        case '3':

                   // ½ÇÇàÁß¿¡ Â÷ÀÏµå °´Ã¼¸¦ »ý¼ºÇÑ´Ù.

                   if (pClock == nullptr) {

                              pClock = new CClock();

                              pClock->Create(win_hWnd);

                              pClock->SetBackColor(RGB(0, 255, 0));

                              MoveWindow(pClock->win_hWnd, 10, 150, 300, 100, TRUE);

                   }

                   break;

        case '4':

                   // Â÷ÀÏµå °´Ã¼¸¦ Æı«ÇÑ´Ù.

                   if (pClock != nullptr) {

                              DestroyWindow(pClock->win_hWnd);

                              delete pClock;

                              pClock = nullptr;

                   }

                   break;

 

        }

        return 0;

}

 

LRESULT CClock::OnCreate(WPARAM wParam, LPARAM lParam)

{

        Trace(L"Clock OnCreate. hWnd = %x", win_hWnd);

        SetTimer(win_hWnd, 1, 1000, NULL);

        SendMessage(win_hWnd, WM_TIMER, 1, NULL);

        return 0;

}

LRESULT CClock::OnDestroy(WPARAM wParam, LPARAM lParam)

{

        Trace(L"Clock OnDestroy. hWnd = %x", win_hWnd);

        KillTimer(win_hWnd, 1);

        return 0;

}

 

LRESULT CClock::OnTimer(WPARAM wParam, LPARAM lParam)

{

        SYSTEMTIME st;

 

        switch (wParam) {

        case 1:

                   GetLocalTime(&st);

                   wsprintf(sTime, TEXT("Áö±Ý ½Ã°£Àº %d:%d:%dÀÔ´Ï´Ù"),

                              st.wHour, st.wMinute, st.wSecond);

                   InvalidateRect(win_hWnd, NULL, TRUE);

                   break;

        }

        return 0;

}

 

void CClock::OnDraw(HDC hdc, int width, int height)

{

        SetTextAlign(hdc, TA_CENTER);

        SetBkMode(hdc, TRANSPARENT);

        TextOutSz(hdc, width / 2, 20, sTime);

}

 

// ¸ÞÀÎ À©µµ¿ì »ý¼ºÇÏ°í ¸Þ½ÃÁö ·çÇÁ¸¸ µ¹¸®¸é µÈ´Ù.

int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance

        , _In_ LPSTR lpszCmdParam, _In_ int nCmdShow)

{

        MSG Message;

        g_hInst = hInstance;

 

        mainWindow.Create();

        ShowWindow(mainWindow.win_hWnd, nCmdShow);

 

        while (GetMessage(&Message, NULL, 0, 0)) {

                   TranslateMessage(&Message);

                   DispatchMessage(&Message);

        }

 

        // Á¾·á Á÷Àü¿¡ °´Ã¼ ¸ÊÀ» ÇØÁ¦ÇÑ´Ù.

        CWindow::DeleteMap();

        return (int)Message.wParam;

}

 

 

mainWindow¿Í childClock °´Ã¼°¡ Àü¿ªÀ¸·Î ¼±¾ðµÇ¾î ÀÖ°í µÎ Å¬·¡½ºÀÇ ¸â¹ö ÇÔ¼ö°¡ Á¤ÀǵǾî ÀÖ´Ù. ¸ÞÀÎ À©µµ¿ì´Â Â÷Àϵ尡 ¾Æ´Ñ OVERLAPPEDWINDOW ¼Ó¼ºÀ» °¡Áö¸ç »ý¼ºÇÒ ¶§ºÎÅÍ Ä¸¼Ç°ú À§Ä¡¸¦ ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ¾î Create ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇß´Ù. CWindowÀÇ Create ¸Þ¼­µåµµ ĸ¼Ç°ú ½ºÅ¸ÀÏÀº ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¹Ç·Î WinMain¿¡¼­ ´ÙÀ½°ú °°ÀÌ ¸ÞÀÎ À©µµ¿ì¸¦ »ý¼ºÇصµ »ó°ü ¾ø´Ù.

 

mainWindow.Create(NULL, WS_OVERLAPPEDWINDOW, 0, L"main");

MoveWindow(mainWindow.win_hWnd, 10, 10, 640, 480, TRUE);

 

±×·¯³ª ¸ÞÀÎ À©µµ¿ì´Â ±× Ư¼º»ó ÀÌÈÄ¿¡µµ ¿©·¯ °¡Áö È®Àå ½ºÅ¸ÀÏÀÌ ÇÊ¿äÇÏ°í À§Ä¡³ª Å©±â¸¦ ÀúÀå ¹× º¹±¸Çϴ ó¸®µµ ÇÊ¿äÇØ Create¸¦ ¹Ì¸® ÀçÁ¤ÀÇÇØ µÎ¾ú´Ù. »ý¼º ¸Þ¼­µå¸¦ Àß Á¤ÀÇÇØ µÎ¸é WinMain¿¡¼­´Â mainWindow.Create() È£Ã⸸À¸·Î ¸ÞÀÎ À©µµ¿ì¸¦ ½±°Ô »ý¼ºÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ µÎ ¹®ÀåÀ» Àß ±¸ºÐÇÏÀÚ.

 

CMainWindow mainWindow;                // À©µµ¿ì°¡ µÉ °´Ã¼¸¦ ¼±¾ðÇÑ´Ù.

mainWindow.Create();                        // °´Ã¼¸¦ ½ÇÁ¦ À©µµ¿ì·Î »ý¼ºÇÑ´Ù.

 

CWindow ÆÄ»ý Ŭ·¡½º°¡ À©µµ¿ì¸¦ Ç¥ÇöÇÏÁö¸¸ °´Ã¼ ÀÚü°¡ À©µµ¿ì´Â ¾Æ´Ï´Ù. °´Ã¼´Â ¾îµð±îÁö³ª ¸Þ¸ð¸®¿¡ »ý¼ºµÈ ¸â¹öÀÇ ÁýÇÕÀÏ »ÓÀ̸ç ÀÌ °´Ã¼°¡ ¿î¿µÃ¼Á¦°¡ ÀÎÁ¤ÇÏ´Â À©µµ¿ì°¡ µÇ·Á¸é °á±¹ CreateWindow ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ÀÌ ÀÛ¾÷À» Create ¸Þ¼­µå°¡ ´ã´çÇÑ´Ù.

Áï, ¸ðµç À©µµ¿ì °´Ã¼´Â ¾î´À ½ÃÁ¡À̵簣¿¡ Create¸¦ È£ÃâÇؾ߸¸ À©µµ¿ì·Î µ¿ÀÛÇÑ´Ù. ¶ÇÇÑ Create´Â À©µµ¿ì Ŭ·¡½º¸¦ Ç×»ó CWindow·Î ÁöÁ¤ÇÏ¿© CWindowProcÀ¸·Î ¸Þ½ÃÁö¸¦ º¸³½´Ù. À̶§ CreateWindowÀÇ ¸¶Áö¸· Àμö·Î this¸¦ Àü´ÞÇÏ¿© »ý¼ºÇÒ À©µµ¿ì¿Í °´Ã¼ ÀÚ½ÅÀÇ °ü°è¸¦ Çü¼ºÇÏ´Â Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù. »ý¼ºÇÒ ¶§ °´Ã¼ ¸Ê¿¡ µî·ÏÇØ¾ß ÀÌÈĺÎÅÍ OnMessage¸¦ ÅëÇØ ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¼ö ÀÖ´Ù.

OnMessage´Â ÀÚÁÖ »ç¿ëÇÏ´Â ´ëºÎºÐÀÇ ¸Þ½ÃÁö¸¦ ó¸®Çϸç À©µµ¿ìÀÇ ¸ðµç ¸Þ½ÃÁö¸¦ ´Ù ó¸®ÇÏÁö´Â ¾Ê´Â´Ù. ¸¸¾à CWindow°¡ Çڵ鷯¸¦ Á¦°øÇÏÁö ¾Ê´Â ¸Þ½ÃÁö¸¦ Á÷Á¢ ó¸®ÇÏ·Á¸é OnMessage¸¦ ÀçÁ¤ÀÇÇÏ¿© ¿øÇÏ´Â ¸Þ½ÃÁö¸¦ ó¸®ÇÏ¸é µÈ´Ù. ¸ÞÀÎ À©µµ¿ì´Â WM_RBUTTONDOWN ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ ¸Þ½ÃÁö ¹Ú½º¸¦ ¿­¸ç ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÑ ÈÄ ¹Ù·Î ¸®ÅÏÇÑ´Ù.

±× ¿ÜÀÇ ¸Þ½ÃÁö´Â ¸ðµÎ CWindow::OnMessage·Î º¸³» ¹Ì¸® Á¤ÀÇÇÑ °¡»ó ¸Þ½ÃÁö Çڵ鷯¸¦ È£ÃâÇÑ´Ù. ¸¸¾à CWindow°¡ Á¤ÀÇÇÑ ¸Þ½ÃÁö ¿Ü¿¡ ´Ù¸¥ ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ÀÏÀÌ ¾ø´Ù¸é OnMessage¸¦ ±»ÀÌ ÀçÁ¤ÀÇÇÒ ÇÊ¿ä´Â ¾ø´Ù. CClockÀÌ ±×·¸°Ô µÇ¾î ÀÖÀ¸¸ç ´ëºÎºÐÀÇ À§Á¬Àº CWindowÀÇ Çڵ鷯¸¸À¸·Îµµ ÃæºÐÇÏ´Ù.

¸ÞÀÎ À©µµ¿ìÀÇ OnCreate¿¡¼­ childClock À©µµ¿ì¸¦ »ý¼ºÇÑ´Ù. Â÷Àϵå´Â º¸Åë ºÎ¸ðÀÇ OnCreate¿¡¼­ »ý¼ºÇÑ´Ù. À§Ä¡¸¦ Àû´çÈ÷ Àâ°í ¹è°æ»öÀº ³ë¶õ»öÀ¸·Î ÁöÁ¤Çß´Ù. OnDestroy´Â À©µµ¿ì Æı«½ÃÀÇ µÞÁ¤¸®¸¦ Ç쵂 ¸ÞÀÎ À©µµ¿ì´Â PostQuitMessage¸¦ È£ÃâÇÏ¿© ¸Þ½ÃÁö ·çÇÁ¸¦ ¹þ¾î³ªµµ·Ï ÇØ¾ß ÇÑ´Ù. OnKeyDownÀº ´ÙÀ½ Ç׿¡¼­ ¿¬±¸ÇØ º¼ Å×½ºÆ® ÄÚµåÀÌ´Ù.

CClock À©µµ¿ì´Â È­¸é¿¡ ½Ã°è¸¦ Ãâ·ÂÇÏ°í ÁÖ±âÀûÀ¸·Î °»½ÅÇÑ´Ù. OnCreate¿¡¼­ 1ÃÊ ÁÖ±âÀÇ Å¸À̸Ӹ¦ ¼³Ä¡ÇÏ°í OnDestroy¿¡¼­ ŸÀ̸Ӹ¦ Æı«ÇÑ´Ù. OnTimer¿¡¼­ ÇöÀç ½Ã°£À» Á¶»çÇÏ¿© sTime ¹öÆÛ¿¡ ±â·ÏÇϸç OnDraw´Â Á¶»çÇØ ³õÀº ½Ã°£À» È­¸é¿¡ Ãâ·ÂÇÑ´Ù. ´õºí¹öÆÛ¸µ 󸮴 CWindow::OnPaint°¡ ¾Ë¾Æ¼­ ÇÏ°í ÀÖÀ¸¹Ç·Î ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. 4°³ÀÇ ¸Þ½ÃÁö¸¦ ó¸®ÇÏ¿© ¸ÚÁø ½Ã°è¸¦ ¸¸µé¾ú´Ù.

¿©±â±îÁö ¸ÞÀÎ À©µµ¿ì¿Í ½Ã°è À©µµ¿ì¸¦ Á¤ÀÇÇß´Ù. ÀÌÁ¦ µÎ À©µµ¿ì¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ¸¸µç´Ù. Ŭ·¡½º°¡ ´ëºÎºÐÀÇ Ã³¸®¸¦ ´Ù ÇÏ°í ÀÖ¾î WinMainÀº º°·Î ÇÒ°Ô ¾ø´Ù. ¸ÞÀÎ À©µµ¿ì¸¦ »ý¼ºÇÏ¿© º¸ÀÌ°í ¸Þ½ÃÁö ·çÇÁ¸¸ µ¹¸®¸é ±×¸¸ÀÌ´Ù. ÇÁ·Î±×·¥ Á¾·á½Ã °´Ã¼ ¸ÊÀ» ÇØÁ¦ÇÏ°í ³ª°£´Ù.

¿©±â±îÁöÀÇ °úÁ¤Àº ±æ¾úÁö¸¸ ¾îÂ÷ÇÇ CWindow´Â ´õ ¼Õµ¨°Ô ¾ø´Ù. »õ·Î¿î À©µµ¿ì¸¦ ´õ ¸¸µé·Á¸é CClockÀ» ¸¸µéµíÀÌ ¸î ÁÙÀÇ ¼±¾ð¹®°ú ¸Þ½ÃÁö Çڵ鷯¸¸ ¸¸µé¸é µÈ´Ù. ÀÌ·¡¼­ °´Ã¼ ÁöÇâÀÌ ÁÁÀº °ÍÀ̸ç ÀÏ´Ü Ã¼°è°¡ ±¸ÃàµÇ¸é »ý»ê¼ºÀÌ ¾öû³ª°Ô ³ôÀº °ÍÀÌ´Ù. ½ÇÇàÇØ º¸ÀÚ.

¸ÞÀÎ À©µµ¿ì¿Í ³ë¶õ ½Ã°è À©µµ¿ì°¡ Àß »ý¼ºµÇ¸ç ÈǸ¢ÇÏ°Ô µ¿ÀÛÇÑ´Ù. ÀÌ ½Ç½ÀÀ» ÅëÇØ °´Ã¼ ÁöÇâÀÇ ÆÄ¿ö¸¦ ½Ç°¨ÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ³»ÀÏ Ãâ±ÙÇØ¾ß Çϴµ¥ »õº® 4½Ã±îÁö Àáµµ ¸øÀÚ°í °­Á¸¦ ¾²°í ÀÖÀ½µµ ¾Ë ¼ö ÀÖ´Ù. ȸ»ç¸¦ ´Ù´Ï´Ù º¸¸é ¾î¿ ¼ö ¾ø´Â ÀÏÀÌ´Ù.

À©µµ¿ìÀÇ »ý¼º°ú Æı«

KFC¸¦ ÀÌ¿ëÇÑ Ã¹¹ø° ¿¹Á¦¸¦ ¿Ï¼ºÇßÀ¸¸ç Àß ½ÇÇàµÇ´Â °Íµµ È®ÀÎÇØ º¸¾Ò´Ù. ÀÌÁ¦ À©µµ¿ì°¡ »ý¼º ¹× Æı«µÇ´Â ÀýÂ÷¸¦ Çϳª¾¿ Ž±¸ÇØ º¸ÀÚ. ÀÌ ¿¹Á¦ÀÇ ÄÚµå ÇÑÁÙ ÇÑÁÙÀÌ ´Ù Áß¿äÇÑ Àǹ̰¡ ÀÖ¾î °¢ ÄÚµåÀÇ ¿ªÇÒÀ» ºÐ¸íÈ÷ ÀÌÇØÇØ¾ß ÇÑ´Ù.

ÀÌ ÇÁ·Î±×·¥Àº ½ÇÇàÁß¿¡ ¾î¶² »ç°ÇÀÌ ÀϾ´ÂÁö »ìÆ캸±â À§ÇØ WM_KEYDOWN¿¡ À©µµ¿ì¸¦ »ý¼º ¹× Æı«ÇÏ´Â Å×½ºÆ® Äڵ带 ÀÛ¼ºÇØ µÎ¾ú´Ù. ¶ÇÇÑ À©µµ¿ì »ý¸í Áֱ⸶´Ù µð¹ö±ë ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ¿© ³»ºÎ µ¿ÀÛÀ» È®ÀÎÇÑ´Ù.  µð¹ö±× ¸ðµå·Î ¿¹Á¦¸¦ ½ÇÇàÇÑ ÈÄ Output âÀ¸·Î Ãâ·ÂµÇ´Â ¸Þ½ÃÁö¸¦ º¸°í µð¹ö°Å·Î ´Ü°è ½ÇÇàÇØ °¡¸ç ¾î¶² È帧À» Ÿ´ÂÁö ºÐ¼®ÇØ º¸ÀÚ.

ÀÌ ¿¹Á¦´Â mainWindow¿Í childClockÀ» Á¤ÀûÀ¸·Î ¼±¾ðÇÑ´Ù. Á¤Àû °´Ã¼´Â ½ÇÇà Á÷ÈÄ¿¡ ¹Ù·Î »ý¼ºµÇ´Âµ¥ À̶§ ´ÙÀ½ ÀÏ·ÃÀÇ ¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù.  °¢ ¸Þ½ÃÁö°¡ ¹ß»ýÇÏ´Â ÀÌÀ¯¿¡ ´ëÇØ ¿·¿¡ ÁÖ¼®À» ´Þ¾Æ µÎ¾ú´Ù.

 

CWindow »ý¼ºÀÚ È£Ãâ                                                              // mainWindow °´Ã¼ »ý¼º

À©µµ¿ì Ŭ·¡½º µî·Ï, À©µµ¿ì ¸Ê ÃʱâÈ­                   // À©µµ¿ì ¸Ê ÃʱâÈ­

CWindow »ý¼ºÀÚ È£Ãâ                                                              // childClock °´Ã¼ »ý¼º

 

µÎ º¯¼ö°¡ »ý¼ºµÇ¸é¼­ »ý¼ºÀÚ°¡ µÎ ¹ø È£ÃâµÇ¾ú´Ù. óÀ½ È£ÃâÇÒ ¶§ À©µµ¿ì Ŭ·¡½º¿Í À©µµ¿ì ¸ÊÀ» ÃʱâÈ­ÇÏ°í µÎ ¹ø° »ý¼ºÀÚ È£Ãâ½Ã¿¡´Â À©µµ¿ì ¸ÊÀÌ ÀÌ¹Ì ÃʱâÈ­µÇ¾î ÀÖ¾î ÀçÃʱâÈ­ÇÏÁö ¾Ê´Â´Ù. ¿©±â±îÁö´Â º¯¼ö¸¸ »ý¼ºÇß´Ù. ´ÙÀ½Àº WinMainÀ¸·Î ÁøÀÔÇÏ¿© mainWindow.Create()¸¦ È£ÃâÇÏ¸ç ¿©±â¼­ CreateWindow·Î ¸ÞÀÎ À©µµ¿ì¸¦ »ý¼ºÇÑ´Ù.

 

CreateWindow(L"CWindow", L"main", WS_OVERLAPPEDWINDOW,

       10, 10, 640, 480, nullptr, (HMENU)0, g_hInst, this);

 

À©µµ¿ì Ŭ·¡½º¸íÀÌ CWindow·Î °íÁ¤µÇ¾î ÀÖÀ½À» À¯ÀÇÇÏÀÚ. ÀÌÈÄÀÇ ¸ðµç À©µµ¿ì´Â ¼Ò¼ÓÀÌ °°´Ù. ±×¸®°í ¸¶Áö¸· Àμö this°¡ Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù. À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ ÆĶó¹ÌÅÍ·Î À©µµ¿ì °´Ã¼ ÀÚ½ÅÀÇ Æ÷ÀÎÅ͸¦ Àü´ÞÇÑ´Ù. À©µµ¿ì »ý¼ºÁß¿¡ ´ÙÀ½ µÎ ¸Þ½Ã°¡ Ãâ·ÂµÇ´Âµ¥ ÀÌ È帧À» µû¶ó°¡ º¸ÀÚ.

 

»õ À©µµ¿ì Ãß°¡. °´Ã¼ : b7854c - À©µµ¿ì 390620

MainWindow OnCreate. hWnd = 390620

 

À©µµ¿ì¸¦ »ý¼ºÇßÀ¸´Ï »ý¼º °ü·Ã ¸Þ½ÃÁö°¡ À©µµ¿ì ÇÁ·Î½ÃÀú·Î Àü´ÞµÈ´Ù. ¸ðµç À©µµ¿ì´Â CWindowProcÀ¸·Î ¸Þ½ÃÁö¸¦ º¸³½´Ù. ÃÖÃÊ pWinMapÀº ºñ¾î ÀÖÀ¸¸ç ¾Æ¹« À©µµ¿ìµµ µî·ÏµÇ¾î ÀÖÁö ¾Ê´Ù. À̶§´Â À©µµ¿ì¸¦ ¸Ê¿¡ ¸ÕÀú µî·ÏÇÑ´Ù.

ÃÖÃÊ Àü´ÞµÇ´Â ¸Þ½ÃÁö´Â WM_NCCREATEÀ̸ç À̶§ ŸÀÌƲ¹Ù, °æ°è¼± µîÀ» »ý¼ºÇÑ´Ù. ÀÌ ¸Þ½ÃÁöÀÇ lParamÀ» ÅëÇØ ÆĶó¹ÌÅÍ°¡ Àü´ÞµÇ´Âµ¥ CreateWindow È£Ãâ½Ã Àü´ÞÇÑ this, Áï °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ÀÌ Æ÷ÀÎÅÍ¿Í ÇÚµéÀ» ¸Ê¿¡ ÀúÀåÇÏ¿© ÀÌÈĺÎÅÍ´Â ¸Ê¿¡¼­ °´Ã¼¸¦ ãÀ» ¼ö ÀÖµµ·Ï ÁغñÇÑ´Ù.

À©µµ¿ì ½ºÅ¸ÀÏ¿¡ µû¶ó ¸Þ½ÃÁöÀÇ Á¾·ù°¡ Á¶±Ý ´Þ¶óÁö´Âµ¥ WS_THICKFRAME ½ºÅ¸ÀÏÀÌ ÀÖÀ» ¶§´Â Å©±â¸¦ °áÁ¤Çϱâ À§ÇØ WM_NCCREATEº¸´Ù WM_GETMINMAXINFO ¸Þ½ÃÁö°¡ ¸ÕÀú ¿Â´Ù. ÀÌ ¶§´Â this¸¦ ¾Ë ¼ö ¾øÀ¸¹Ç·Î ÀÌ°Ç DefWindowProcÀ¸·Î Á¶¿ëÇØ º¸³» Áà¾ß ÇÑ´Ù. ÀÏ¹Ý Â÷Àϵå´Â Ç×»ó WM_NCCREATE°¡ ¸ÕÀú ¿À¹Ç·Î this¸¦ ¸Ê¿¡ µî·ÏÇØ ¹ö¸®¸é µÈ´Ù.

 

(*pWinMap)[hWnd] = pWin;

pWin->win_hWnd = hWnd;

 

¸Ê¿¡ À©µµ¿ì¸¦ µî·ÏÇÏ´Â Áï½Ã °´Ã¼ÀÇ win_hWnd¿¡ À©µµ¿ì ÇÚµéÀ» ´ëÀÔÇÑ´Ù. ÀÌÈÄÀÇ ¸Þ½ÃÁö ó¸® ·çƾ¿¡¼­ °´Ã¼´Â win_hWnd¸¦ ÅëÇØ À©µµ¿ì ÇÚµéÀ» ãÀ¸¹Ç·Î ÀÌ Ã³¸®°¡ ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. ÇÚµé·ÎºÎÅÍ °´Ã¼¸¦ ãÀ» ¶§´Â ¸ÊÀ» µÚÁö°í °´Ã¼·ÎºÎÅÍ ÇÚµéÀ» ãÀ» ¶§´Â win_hWnd¸¦ ÀÐ¾î ¾ðÁ¦µçÁö ¼­·Î¸¦ ãÀ» ¼ö ÀÖ´Ù.

´ÙÀ½À¸·Î WM_NCCALCSIZE ¸Þ½ÃÁö°¡ ¿À´Âµ¥ À̶§´Â ¸Ê¿¡ ÀÌ¹Ì À©µµ¿ì°¡ µî·ÏµÇ¾î ÀÖÀ¸¸ç ¸ÊÀ» ÅëÇØ À©µµ¿ì °´Ã¼¸¦ ã´Â´Ù. °´Ã¼¸¦ ãÀº ÈÄ OnMessage °¡»ó ÇÔ¼ö¸¦ È£ÃâÇÏ¿© °´Ã¼ ½º½º·Î ¸Þ½ÃÁö¸¦ ó¸®Çϵµ·Ï ÇÑ´Ù. ´ÙÀ½À¸·Î WM_CREATE°¡ ³¯¶ó¿À¸ç À̶§µµ ¸ÊÀ» ÅëÇØ Çڵ鷯¸¦ ã´Â´Ù.

¸ÞÀÎ À©µµ¿ìÀÇ OnCreate Çڵ鷯°¡ È£ÃâµÇ¾î »ý¼º½Ã ÃʱâÈ­¸¦ ó¸®ÇÑ´Ù. Create¿Í OnCreate¸¦ Çò°¥¸®Áö ¸»ÀÚ. Create´Â À©µµ¿ì¸¦ ¸¸µé¶ó´Â ¸í·ÉÀÌ°í OnCreate´Â Áö±Ý ¸¸µé°í ÀÖÀ¸´Ï ÇÊ¿äÇÑ ÃʱâÈ­¸¦ ÇÏ´Â °÷ÀÌ´Ù. ¸ÞÀÎ À©µµ¿ì´Â OnCreate¿¡¼­ childClockÀ» »ý¼ºÇÑ´Ù. childClockÀº Create¸¦ ÀçÁ¤ÀÇÇÏÁö ¾Ê¾Æ CWindow·ÎºÎÅÍ »ó¼Ó¹ÞÀº Create¸¦ È£ÃâÇÑ´Ù.

 

CreateWindow(TEXT("CWindow"), title, style,

       0, 0, 0, 0, hParent, (HMENU)(ULONG_PTR)child_id, g_hInst, this);

 

À̶§µµ ¸¶Áö¸· Àμö·Î this°¡ Àü´ÞµÊÀ» À¯ÀÇÇÏÀÚ. »ý¼º½Ã °´Ã¼ Æ÷ÀÎÅ͸¦ Àü´ÞÇØ¾ß ¸Ê¿¡ µî·ÏÇÒ ¼ö ÀÖ°í ÀÌÈÄÀÇ ¸Þ½ÃÁö¸¦ °´Ã¼°¡ ¹ÞÀ» ¼ö ÀÖ´Ù. À̶§ ´ÙÀ½ µÎ ¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù.

 

»õ À©µµ¿ì Ãß°¡. °´Ã¼ : b78438 - À©µµ¿ì 120976

Clock OnCreate. hWnd = 120976

 

childClockÀº ÃÖÃÊ WM_NCCREATE  ¸Þ½ÃÁö¸¦ ¹ÞÀ¸¸ç À̶§ ¸Ê¿¡ ÀÚ½ÅÀ» µî·ÏÇÑ´Ù. ¿¬À̾î Àü´ÞµÇ´Â WM_NCCALCSIZE, WM_CREATE´Â °´Ã¼·Î Àü´ÞµÈ´Ù. CClockÀÇ OnCreate¿¡¼­ ŸÀ̸Ӹ¦ µî·ÏÇÏ¿© ÁÖ±âÀûÀ¸·Î ½Ã°£À» Ãâ·ÂÇÑ´Ù.

¿©±â±îÁö ÁøÇàÇϸé ÇÁ·Î±×·¥ ÃʱâÈ­°¡ ¿Ï·áµÈ °ÍÀÌ´Ù. ÀÌÈÄ µÎ À©µµ¿ì´Â WM_SIZE, WM_MOVE, WM_TIMER µîÀÇ ¸Þ½ÃÁö¸¦ °è¼Ó ¹Þ´Â´Ù. À̶§¸¶´Ù CWindowProcÀ¸·Î ¸Þ½ÃÁö°¡ Àü´ÞµÇ¸ç ¸ÊÀ» ÅëÇØ ¸Þ½ÃÁöÀÇ ¼ö½Åó¸¦ ¾Ë¾Æ³»°í °´Ã¼ÀÇ OnMessage¸¦ °ÅÃÄ ¸Þ½ÃÁö Çڵ鷯¸¦ È£ÃâÇÏ¸ç ½ÇÇàµÈ´Ù.

À©µµ¿ì¸¦ »ý¼ºÇÏ´Â °Í¸¸Å­À̳ª Æı«ÇÏ´Â ÀýÂ÷µµ Áß¿äÇÏ´Ù. Æı«½Ã ¸Þ½ÃÁö¸¦ Á¦´ë·Î ó¸®ÇØ¾ß Â±âµµ ³²Áö ¾ÊÀ¸¸ç ¸¶Áö¸· Á¤¸® ÀÛ¾÷À» ¿øÈ°È÷ ¼öÇàÇÒ ¼ö ÀÖ´Ù. OnKeyDown¿¡ À©µµ¿ì¸¦ Æı«ÇÏ´Â Äڵ带 ¹Ì¸® ÀÛ¼ºÇØ µÎ¾ú´Âµ¥ 2¹øÀ» ´­·¯ childClockÀ» Æı«ÇØ º¸ÀÚ. À̶§ ´ÙÀ½ µÎ ÁÙÀ» ½ÇÇàÇÑ´Ù.

 

DestroyWindow(childClock.win_hWnd);

childClock.Dispose();

 

À©µµ¿ì¸¦ Æı«ÇÒ ¶§´Â DestoryWindow¸¦ È£ÃâÇÑ´Ù. À̶§ WM_DESTROY¿Í ÀÏ·ÃÀÇ Æı« ¸Þ½ÃÁö°¡ Àü´ÞµÇ´Âµ¥ OnDestroy¿¡¼­ ŸÀ̸Ӹ¦ ÇØÁ¦ÇÑ´Ù. À©µµ¿ì Æı«ÁßÀÇ ¸ðµç ¸Þ½ÃÁö´Â SendMessage·Î º¸³»Áö¹Ç·Î DestroyWindow ¸®ÅÏ ÈÄ¿¡´Â ¸ðµç Á¤¸®°¡ ³¡³ª°í ´õ ó¸®ÇÒ ¸Þ½ÃÁö°¡ ¾ø´Ù.

À©µµ¿ì¸¦ ¿ÏÀüÈ÷ Æı«ÇÑ ÈÄ Dispose ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© ¸Ê¿¡¼­µµ À©µµ¿ì¸¦ Á¦°ÅÇÑ´Ù. ¹è°æ ºê·¯½Ã¿Í ´õºí¹öÆÛ¸µ ºñÆ®¸ÊÀ» ÇØÁ¦ÇÏ°í ¸Ê¿¡¼­ À©µµ¿ì ÇÚµéÀ» Á¦°ÅÇÑ´Ù.  ÀÌ °úÁ¤¿¡¼­ Ãâ·ÂµÇ´Â µð¹ö°Å ¸Þ½ÃÁö´Â ´ÙÀ½°ú °°´Ù. À©µµ¿ì Æı«, Á¤¸®, ¸Ê Á¦°Å°¡ ¼øÁ¶·Ó°Ô Àß Ã³¸®µÊÀ» ¾Ë ¼ö ÀÖ´Ù.

 

Clock OnDestroy. hWnd = 120976

CWindow Dispose È£Ãâ

120976 À©µµ¿ì Á¦°Å

 

À©µµ¿ì Æı«½Ã ÀÌ ¸ðµç 󸮰¡ Á¤»óÀûÀ¸·Î ´Ù 󸮵Ǿî¾ß ÇÑ´Ù. OnDestroy°¡ ¿ÀÁö ¾ÊÀ¸¸é ŸÀ̸ӳª Â÷Àϵå Á¦°Å, ½ÇÇà Á¤º¸ ÀúÀå µîÀÌ Ã³¸®µÇÁö ¾ÊÀ¸¸ç °´Ã¼ ¸Ê¿¡¼­ Á¦°ÅÇÏÁö ¾ÊÀ¸¸é ºÒÇÊ¿äÇÑ ¾²·¹±â°¡ ³²¾Æ Â÷ÈÄ ¾î¶² ºÎÀÛ¿ëÀ» ÀÏÀ¸Å³Áö ¾Ë ¼ö ¾ø´Ù. À©µµ¿ì Æı«¸¦ ´ÙÀ½°ú °°ÀÌ Çؼ­´Â ¾ÈµÈ´Ù.

 

childClock.Dispose();

DestroyWindow(childClock.win_hWnd);

 

Á» ÀÖ´Ù Æı«ÇÒ À©µµ¿ì¶ó°í Çؼ­ Dispose¸¦ ¸ÕÀú È£ÃâÇØ ¹ö¸®¸é Æı«ÁßÀÇ ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ¼ö ¾ø¾î ´Ù¿îµÈ´Ù. childClockÀº Á¤ÀûÀ¸·Î ¼±¾ðµÈ º¯¼öÀ̹ǷΠÀÌ º¯¼ö¸¦ Á¦°ÅÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÀÌ À©µµ¿ì¸¦ ´Ù½Ã Àç»ý¼ºÇϸé ÃÖÃÊ ½ÇÇà½Ã¿Í ¶È°°Àº ÃʱâÈ­ °úÁ¤À» °ÅÄ£´Ù. Å°º¸µåÀÇ 1Å°¸¦ ´©¸£¸é ´Ù½Ã »ý¼ºÇϴµ¥ Á¤»óÀûÀ¸·Î Àß »ý¼ºµÊÀ» ¾Ë ¼ö ÀÖ´Ù.

´ÙÀ½Àº À©µµ¿ì °´Ã¼¸¦ µ¿ÀûÀ¸·Î »ý¼º ¹× Æı«ÇØ º¸ÀÚ. ½ÇÇàÁß¿¡µµ À©µµ¿ì´Â ¾ó¸¶µçÁö »ý¼º, Æı« °¡´ÉÇØ¾ß ÇÑ´Ù. ÀÌ Ã³¸®¸¦ À§ÇØ CClock * ŸÀÔÀÇ pClock º¯¼ö¸¦ ¼±¾ðÇØ µÎ¾úÀ¸¸ç °ü·Ã ÄÚµå´Â OnKeyDownÀÇ 3¹ø°ú 4¹ø¿¡ ÀÖ´Ù. »ý¼º ÄÚµåºÎÅÍ º¸ÀÚ.

 

pClock = new CClock();

pClock->Create(win_hWnd);

pClock->SetBackColor(RGB(0, 255, 0));

MoveWindow(pClock->win_hWnd, 10, 150, 300, 100, TRUE);

 

new ¿¬»êÀÚ·Î °´Ã¼¸¦ ¸ÕÀú »ý¼ºÇÏ°í Create ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© À©µµ¿ì¸¦ »ý¼ºÇÑ´Ù. °´Ã¼¸¦ ¸ÕÀú »ý¼ºÇÑ ÈÄ À©µµ¿ì¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù. ±×¸®°í ¹è°æ»öÀ̳ª À§Ä¡ ÁöÁ¤ µîÀÇ Ãß°¡ ÀÛ¾÷À» ó¸®ÇÑ´Ù. À̶§ Ãâ·ÂµÇ´Â ¸Þ½ÃÁö´Â ´ÙÀ½°ú °°´Ù.

 

CWindow »ý¼ºÀÚ È£Ãâ

»õ À©µµ¿ì Ãß°¡. °´Ã¼ : e19088 - À©µµ¿ì 505ce

Clock OnCreate. hWnd = 505ce

 

°´Ã¼ »ý¼ºÀÚ°¡ È£ÃâµÇ¸ç Create È£Ãâ½Ã WM_NCCREATE, WM_CREATE ¸Þ½ÃÁö°¡ Àü´ÞµÇ´Â °úÁ¤¿¡¼­ À©µµ¿ì ¸Ê¿¡ µî·ÏÇÏ°í OnCreate¿¡¼­ ŸÀ̸Ӹ¦ »ý¼ºÇÏ¿© ½Ã°£À» Ãâ·ÂÇÑ´Ù.  µÎ °³ÀÇ Â÷Àϵå À©µµ¿ì°¡ ¾Æ·¡, À§·Î ³ª¶õÈ÷ Àß ½ÇÇàµÈ´Ù.

À̹ø¿¡´Â 4Å°¸¦ ´­·¯ Æı«ÇØ º¸ÀÚ. µ¿ÀûÀ¸·Î »ý¼ºÇÑ À©µµ¿ì´Â ´Ù »ç¿ëÇÑ ÈÄ ¾ðÁ¦µçÁö Æı«ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

 

DestroyWindow(pClock->win_hWnd);

delete pClock;

pClock = nullptr;

 

Æı«ÇÒ ¶§´Â À©µµ¿ì ¸ÕÀú Æı«ÇÏ°í °´Ã¼¸¦ Á¦°ÅÇÑ´Ù. Æı«Áß¿¡µµ ¸Þ½ÃÁö´Â ¹Þ¾Æ¾ß Á¦´ë·Î Á¤¸®¸¦ ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ±× µ¿¾È¿¡´Â °´Ã¼°¡ ³²¾Æ ÀÖ¾î¾ß ÇÑ´Ù. µ¿ÀûÀ¸·Î ¸¸µç °´Ã¼ÀÌ´Ï »èÁ¦ÇÒ ¶§´Â ´ç¿¬È÷ deleteÀ̸ç À̶§ Æı«ÀÚ¸¦ °æÀ¯ÇÏ¿© Dispose¸¦ È£ÃâÇÏ¿© °´Ã¼ ¸Ê¿¡¼­ ÀÚ½ÅÀ» Á¦°ÅÇÑ´Ù.  Æ®·¹À̽º ¸Þ½ÃÁö´Â ´ÙÀ½°ú °°´Ù.

 

Clock OnDestroy. hWnd = 505ce

CWindow Dispose È£Ãâ

505ce À©µµ¿ì Á¦°Å

 

ÀÌ ¼ø¼­´ë·Î È£ÃâµÇ¾î À©µµ¿ì, °´Ã¼ ¼øÀ¸·Î Æı«ÇÏ°í ¸Ê¿¡¼­µµ Á¦°ÅÇÑ´Ù. »ý¼ºÇÒ ¶§´Â °´Ã¼, À©µµ¿ì ¼øÀÌ°í Æı«ÇÒ ¶§´Â ¹Ý´ë·Î À©µµ¿ì, °´Ã¼ ¼øÀÌ´Ù. °´Ã¼°¡ À©µµ¿ì¸¦ ·¡ÇÎÇϹǷΠ¸ÕÀú »ý¼ºµÇ¾î¾ß ÇÏ°í ¿ÏÀüÈ÷ Æı«µÉ ¶§±îÁö ³²¾Æ ÀÖ¾î¾ß ÇÑ´Ù.

C++Àº »ý¼ºÀÚ¿¡¼­ ÃʱâÈ­, Æı«ÀÚ¿¡¼­ Á¤¸®¸¦ ÀÚµ¿À¸·Î ¼öÇàÇÒ ¼ö Àִµ¥ ¿Ö »ý¼º, Æı«°¡ ¼öµ¿À¸·Î µÇ¾î ÀÖÀ»±î? »ç½Ç ÀÌ·¸°Ôµµ ÇÒ ¼ö ÀÖÀ¸¸ç MFC´Â °ú¿¬ ±×·¸°Ô µÇ¾î ÀÖ´Ù. ±×·¯³ª ÀÌ·¸°Ô ¸¸µéÀÚ¸é Á¤Àû, µ¿Àû »ý¼º ¹æ¹ý¿¡ ´Þ¶óÁö¸ç Ŭ·¡½º °èÃþ»ó¿¡¼­ »èÁ¦ÇÒ ¶§ÀÇ ¿¹¿Ü 󸮰¡ °úÇÏ°Ô º¹ÀâÇÏ´Ù. Dispose¿¡¼­ À©µµ¿ì¸¦ Æı«ÇÏ´Â Äڵ带 ³Ö¾î º¸ÀÚ.

 

void CWindow::Dispose() {

       Trace(L"CWindow Dispose È£Ãâ");

       if (win_backBrush != nullptr) DeleteObject(win_backBrush);

       if (win_dblBuffer != nullptr) DeleteObject(win_dblBuffer);

 

       if (IsWindow(win_hWnd)) { DestroyWindow(win_hWnd); }

       ....

 

°´Ã¼ Á¦°Å½Ã À©µµ¿ì¸¦ ¾Ë¾Æ¼­ Æı«Çϵµ·Ï ÇØ µÎ¸é Dispose¸¸ È£ÃâÇÏ¸é µÈ´Ù. ±×·¯³ª ÀÌ ÄÚµå´Â À©µµ¿ì°¡ °èÃþÀ» ÀÌ·ê ¶§ ¹®Á¦°¡ ÀÖ´Ù. »ó¼Ó¹ÞÀº °¡»ó Æı«ÀÚ´Â ´ÙÇüÀûÀ¸·Î µ¿ÀÛÇÏÁö ¾Ê¾Æ Æı«ÁßÀÇ WM_DESTROY¸¦ ó¸®ÇÒ OnMessage¸¦ Á¤È®È÷ ãÁö ¸øÇÑ´Ù.  ÀÌ¿¡ ´ëÇÑ ¹®¹ýÀû À̷п¡ ´ëÇؼ­´Â ´ç±Ù 1.2¹öÀü °­Á 21-1-»ç Ç×À» Âü°íÇÑ´Ù.

MFC´Â º°µµÀÇ ³»ºÎ ¸â¹ö º¯¼ö¸¦ µÎ¾î ÀÌ·± ¹®Á¦¿¡µµ Àß ´ëóÇÏÁö¸¸ ¿Ïº®ÇÑ ÀÚµ¿µµ ¾Æ´Ï¾î¼­ ¶§·Î´Â °³¹ßÀÚ°¡ ³»ºÎ ±¸Á¶¸¦ ¾Ë¾Æ¾ß ´ëóÇÒ ¼ö ÀÖ´Â °æ¿ìµµ ÀÖ´Ù. °úÇÏ°Ô ÀÚµ¿È­ÇÏ·Á¸é ¾ðÁ¨°¡´Â ¹Î°¨ÇÑ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. KFC´Â ±× Á¤µµ±îÁöÀÇ Ã¼°è´Â ±¸ÃàÇÏÁö ¾Ê°í »ý¼º, Æı«ÇÒ ¶§ ¼ø¼­¸¸ Àß ÁöÅ°µµ·Ï Çß´Ù. ¾à°£ÀÇ ºÒÆí ´ë½Å ´Ü¼øÇÔÀ» À¯ÁöÇÏÀÚ´Â ÀÛÀüÀÌ´Ù.

´ÙÀ½Àº °´Ã¼ ¸Ê Á¤¸® Äڵ带 º¸ÀÚ. ¸Ê ÃʱâÈ­ÇÏ´Â ÃÖÃÊÀÇ À©µµ¿ì°¡ »ý¼ºµÉ ¶§ »ý¼ºÀÚ¿¡¼­ ó¸®ÇÑ´Ù. ±×·¯³ª Æı«´Â Ŭ·¡½º ¼öÁØ¿¡¼­ Àû´çÇÑ ½ÃÁ¡ÀÌ ¾ø´Ù. ¸¶Áö¸· À©µµ¿ì°¡ Á¦°ÅµÉ ¶§ Æı«ÀÚ¿¡¼­ ó¸®ÇÒ ¼ö ÀÖÀ» °Í °°Áö¸¸ ±× À©µµ¿ì°¡ ¿ÏÀüÈ÷ Á¦°ÅµÉ¶§±îÁö´Â ³²¾Æ ÀÖ¾î¾ß ÇÏ´Ï ¾ÈµÈ´Ù. ±×·¡¼­ ¸Ê Á¤¸®´Â WinMain¿¡¼­ ¸Þ½ÃÁö ·çÇÁ Å»Ãâ Á÷ÈÄ¿¡ Á÷Á¢ ÇÑ´Ù.

 

delete pWinMap;

pWinMap = nullptr;

 

¸ÊÀ» Á¦°ÅÇÏ°í nullptr·Î ¸¸µé¾î ºÒ´ÉÈ­ ½ÃŲ´Ù. ¸ÊÀÌ ¾øÀ¸¸é ´õ ÀÌ»ó °´Ã¼µµ ãÁö ¸øÇÏ°í ¸Þ½ÃÁö¸¦ ó¸®ÇÏÁöµµ ¸øÇÏÁö¸¸ ¸Þ½ÃÁö ·çÇÁ°¡ ³¡³­ ½ÃÁ¡¿¡ ´õ Àü´ÞÇÒ ¸Þ½ÃÁöµµ ¾ø¾î ¹®Á¦µÇÁö ¾Ê´Â´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ´Â ½ÃÁ¡À̶ó »ç½Ç ÀÌ ÄÚµå´Â »ý·«Çصµ ¸Þ¸ð¸® ´©¼ö´Â ¾ø´Ù.

Win32´Â ÁÖ¼Ò °ø°£ÀÌ ºÐ¸®µÇ¾î ÀÖ¾î ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ¸é ¸Þ¸ð¸®´Â ¸ðµÎ ¾Ð¼öµÈ´Ù. ´Ù¸¸ ±â´ÉÀû ¿Ï¼ºµµ¸¦ À§ÇØ ±ò²ûÇÏ°Ô Á¤¸®ÇÏ°í ³ª°¡´Â °ÍÀÌ´Ù. ÀÌ Äڵ尡 µé¾î°¡¸é Dispose¿¡¼­ ¸ÊÀÌ »ì¾Æ ÀÖ´ÂÁö¸¦ Á¡°ËÇÏ´Â Á¶°Ç¹®ÀÌ ÇÊ¿äÇØÁø´Ù.

 

if (pWinMap != nullptr) {

       pWinMap->erase(win_hWnd);

       Trace(L"%x À©µµ¿ì Á¦°Å", win_hWnd);

}

 

mainWindow, childClockÀº Á¤ÀûÀ¸·Î ¼±¾ðµÈ º¯¼ö¿©¼­ WinMain Á¾·á Á÷ÈÄ Æı«ÀÚ°¡ È£ÃâµÇ´Âµ¥ À̶§´Â ¸ÊÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¹Ç·Î ÀÚ½ÅÀ» ¸Ê¿¡¼­ Á¦°ÅÇÒ ÇÊ¿äµµ ¾ø´Ù. ¿ÀÈ÷·Á Á¦°ÅÇÏ·Á°í ÇÏ¸é ±ò²ûÇÏ°Ô Á¤¸®ÇÏ·Á´Ù°¡ ´Ù¿îµÇ¾î ¹ö¸°´Ù. WinMain ³¡ÀÇ DeleteMap È£Ãâ¹®À» Á¦°ÅÇϸé ÀÌ Á¶°Ç¹®µµ ÇÊ¿ä ¾ø´Ù.

ÀÌ»óÀ¸·Î CWindow Ŭ·¡½º¿Í À©µµ¿ì¸Ê °ü·Ã Äڵ带 ÀÛ¼ºÇÏ°í Å×½ºÆ®±îÁö ¸¶ÃÆ´Ù. ±æÁö ¾ÊÀº ¼Ò½ºÀÌÁö¸¸ ³ª¸§ Á¤±³Çϸç ÀÌ·± Äڵ带 È®º¸Çϱ⠽±Áö ¾Ê¾Ò´Ù. ¿©·¯ ¹øÀÇ ½ÃÇàÂø¿À¿Í °³¼±À» °ÅÃÄ ¾à°£ ºÒÆíÇÏÁö¸¸ ¸»½é¾øµµ·Ï ¸¸µé¾ú´Ù. »ý¼º, Æı« ¼ø¼­¸¸ Àß ÁöÅ°¸é µÈ´Ù.