2-2-´Ù. ¸Þ½ÃÁö ·çÇÁ

À©µµ¿ìÁ ¸Þ½ÃÁö ±¸µ¿ ½Ã½ºÅÛ(Message Driven System)À̶ó°í Çϸç ÀÌ Á¡ÀÌ µµ½º¿Í °¡Àå ¶Ñ·ÇÇÑ ´ëºñ¸¦ ÀÌ·ç´Â À©µµ¿ìÁîÀÇ Æ¯Â¡ÀÌ´Ù. µµ½º¿¡¼­´Â ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇØ ¹Ì¸® ÀÔ·ÂµÈ ÀÏ·ÃÀÇ ¸í·ÉµéÀ» ¼ø¼­´ë·Î ½ÇÇàÇÏ´Â ¼øÂ÷Àû ½ÇÇà¹æ¹ýÀ» »ç¿ëÇÑ´Ù. À©µµ¿ìÁî´Â ÀÌ¿Í ´Ù¸£°Ô ÇÁ·Î±×·¥ÀÇ ½ÇÇà ¼ø¼­°¡ ¸íÈ®ÇÏ°Ô Á¤ÇØÁ® ÀÖÁö ¾ÊÀ¸¸ç »óȲ¿¡ µû¶ó ½ÇÇà ¼ø¼­°¡ ´Þ¶óÁö´Â µ¥ ¿©±â¼­ ¸»ÇÏ´Â »óȲÀ̶õ ¹Ù·Î ¾î¶² ¸Þ½ÃÁö°¡ ÁÖ¾îÁ³´Â°¡¸¦ ¸»ÇÑ´Ù.

¸Þ½ÃÁö¶õ »ç¿ëÀÚ³ª ½Ã½ºÅÛ ³»ºÎÀûÀÎ µ¿ÀÛ¿¡ ÀÇÇØ ¹ß»ýµÈ ÀÏüÀÇ º¯È­¿¡ ´ëÇÑ Á¤º¸¸¦ ¸»ÇÑ´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚ°¡ ¸¶¿ì½ºÀÇ ¹öưÀ» ´­·¶´Ù°Å³ª Űº¸µå¸¦ ´­·¶´Ù°Å³ª À©µµ¿ì°¡ ÃÖ¼ÒÈ­µÇ¾ú´Ù°Å³ª ÇÏ´Â º¯È­¿¡ ´ëÇÑ Á¤º¸µéÀÌ ¸Þ½ÃÁöÀÌ´Ù. ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé ÇÁ·Î±×·¥¿¡¼­´Â ¸Þ½ÃÁö°¡ ¾î¶² Á¤º¸¸¦ ´ã°í Àִ°¡¸¦ ºÐ¼®ÇÏ¿© ¾î¶² ·çƾÀ» È£ÃâÇÒ °ÍÀΰ¡¸¦ °áÁ¤ÇÑ´Ù. Áï ¼ø¼­¸¦ µû¸£Áö ¾Ê°í ÁÖ¾îÁø ¸Þ½ÃÁö¿¡ ´ëÇÑ ¹ÝÀÀÀ» Á¤ÀÇÇÏ´Â ¹æ½ÄÀ¸·Î ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÈ´Ù.

À©µµ¿ìÁî ÇÁ·Î±×·¥¿¡¼­ ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ºÎºÐÀ» ¸Þ½ÃÁö ·çÇÁ¶ó°í ÇÏ¸ç º¸Åë WinMain ÇÔ¼öÀÇ ³¡¿¡ ´ÙÀ½°ú °°Àº Çü½ÄÀ¸·Î Á¸ÀçÇÑ´Ù.

while(GetMessage(&Message,0,0,0)) {
	TranslateMessage(&Message);
	DispatchMessage(&Message);
}

¸Þ½ÃÁö ·çÇÁ´Â ¼¼ °³ÀÇ ÇÔ¼ö È£Ãâ·Î ÀÌ·ç¾îÁ® ÀÖÀ¸¸ç Àüü ·çÇÁ´Â while¹®À¸·Î ½Î¿©Á® ÀÖ´Ù. °¢ ÇÔ¼ö°¡ ¾î¶² µ¿ÀÛÀ» ÇÏ´ÂÁö ´ëÃæ ¾Ë¾Æº¸ÀÚ.

BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);

ÀÌ ÇÔ¼ö´Â ½Ã½ºÅÛÀÌ À¯ÁöÇÏ´Â ¸Þ½ÃÁö Å¥¿¡¼­ ¸Þ½ÃÁö¸¦ ÀоîµéÀδÙ. ÀоîµéÀÎ ¸Þ½ÃÁö´Â ù¹øÂ° Àμö°¡ ÁöÁ¤ÇÏ´Â MSG ±¸Á¶Ã¼¿¡ ÀúÀåµÈ´Ù. ÀÌ ÇÔ¼ö´Â ÀоîµéÀÎ ¸Þ½ÃÁö°¡ ÇÁ·Î±×·¥À» Á¾·áÇ϶ó´Â WM_QUITÀÏ °æ¿ì False¸¦ ¸®ÅÏÇÏ¸ç ±× ¿ÜÀÇ ¸Þ½ÃÁöÀ̸é True¸¦ ¸®ÅÏÇÑ´Ù. µû¶ó¼­ WM_QUIT ¸Þ½ÃÁö°¡ ÀÐÇôÁú ¶§±îÁö, Áï ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ ¶§±îÁö Àüü while ·çÇÁ°¡ °è¼Ó ½ÇÇàµÈ´Ù. ³ª¸ÓÁö ¼¼ °³ÀÇ Àμö´Â ÀоîµéÀÏ ¸Þ½ÃÁöÀÇ ¹üÀ§¸¦ ÁöÁ¤Çϴµ¥ Àß »ç¿ëµÇÁö ¾ÊÀ¸¹Ç·Î ÀÏ´Ü ¹«½ÃÇϱâ·Î ÇÑ´Ù.

BOOL TranslateMessage( CONST MSG *lpMsg);

Űº¸µå ÀÔ·Â ¸Þ½ÃÁö¸¦ °¡°øÇÏ¿© ÇÁ·Î±×·¥¿¡¼­ ½±°Ô ¾µ ¼ö ÀÖµµ·Ï ÇØ ÁØ´Ù. À©µµ¿ìÁî´Â Űº¸µåÀÇ ¾î¶² ۰¡ ´­·¯Á³´Ù°Å³ª ¶³¾îÁ³À» ¶§ Űº¸µå ¸Þ½ÃÁö¸¦ ¹ß»ý½Ã۴µ¥ ÀÌ ÇÔ¼ö´Â Űº¸µåÀÇ ´­¸²(WM_KEYDOWN)°ú ¶³¾îÁü(WM_KEYUP)ÀÌ ¿¬¼ÓÀûÀ¸·Î ¹ß»ýÇÒ ¶§ ¹®ÀÚ°¡ ÀԷµǾú´Ù´Â ¸Þ½ÃÁö(WM_CHAR)¸¦ ¸¸µå´Â ¿ªÇÒÀ» ÇÑ´Ù. ¿¹¸¦ µé¾î A۸¦ ´©¸¥ ÈÄ ´Ù½Ã A۸¦ ¶¼¸é A¹®ÀÚ°¡ ÀԷµǾú´Ù´Â ¸Þ½ÃÁö¸¦ ¸¸µé¾î ³½´Ù.

LONG DispatchMessage( CONST MSG *lpmsg);

½Ã½ºÅÛ ¸Þ½ÃÁö Å¥¿¡¼­ ²¨³½ ¸Þ½ÃÁö¸¦ ÇÁ·Î±×·¥ÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö(WndProc)·Î Àü´ÞÇÑ´Ù. ÀÌ ÇÔ¼ö¿¡ ÀÇÇØ ¸Þ½ÃÁö°¡ ÇÁ·Î±×·¥À¸·Î Àü´ÞµÇ¸ç ÇÁ·Î±×·¥¿¡¼­´Â Àü´ÞµÈ ¸Þ½ÃÁö¸¦ Á¡°ËÇÏ¿© ´ÙÀ½ µ¿ÀÛÀ» °áÁ¤ÇÏ°Ô µÈ´Ù.

¸Þ½ÃÁö ·çÇÁ¿¡¼­ ÇÏ´Â ÀÏÀº ¸Þ½ÃÁö¸¦ ²¨³»°í, ÇÊ¿äÇÑ °æ¿ì ¾à°£ ÇüŸ¦ ¹Ù²Û ÈÄ ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î Àü´ÞÇÏ´Â °Í »ÓÀÌ´Ù. ÀÌ °úÁ¤Àº WM_QUIT ¸Þ½ÃÁö°¡ Àü´ÞµÉ ¶§±îÁö, Áï ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ¶§±îÁö ¹Ýº¹µÈ´Ù. °á±¹ ¸Þ½ÃÁö ·çÇÁ°¡ ÇÏ´Â ÀÏÀ̶õ ¸Þ½ÃÁö Å¥¿¡¼­ ¸Þ½ÃÁö¸¦ ²¨³» ¸Þ½ÃÁö ó¸® ÇÔ¼ö·Î º¸³»ÁÖ´Â °Í »ÓÀÌ´Ù.

½ÇÁ¦ ¸Þ½ÃÁö 󸮴 º°µµÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö(WndProc)¿¡¼­ ¼öÇàÇÑ´Ù. ¸Þ½ÃÁö´Â ½Ã½ºÅÛÀÇ º¯È­¿¡ ´ëÇÑ Á¤º¸À̸ç MSG¶ó´Â ±¸Á¶Ã¼¿¡ º¸°üµÈ´Ù. MSG ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

typedef struct tagMSG
{
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;
} MSG;

°¢ ¸â¹öÀÇ Àǹ̴ ´ÙÀ½°ú °°´Ù.

¸â¹ö ÀǹÌ
hwnd ¸Þ½ÃÁö¸¦ ¹ÞÀ» À©µµ¿ì ÇÚµéÀÌ´Ù.
message ¾î¶² Á¾·ùÀÇ ¸Þ½ÃÁöÀΰ¡¸¦ ³ªÅ¸³½´Ù. °¡Àå Áß¿äÇÑ °ªÀÌ´Ù.
wParam Àü´ÞµÈ ¸Þ½ÃÁö¿¡ ´ëÇÑ ºÎ°¡ÀûÀÎ Á¤º¸¸¦ °¡Áø´Ù. ¾î¶² Àǹ̸¦ °¡Áö´Â°¡´Â ¸Þ½ÃÁöº°·Î ´Ù¸£´Ù. 32ºñÆ®°ªÀÌ´Ù.
lParam Àü´ÞµÈ ¸Þ½ÃÁö¿¡ ´ëÇÑ ºÎ°¡ÀûÀÎ Á¤º¸¸¦ °¡Áø´Ù. ¾î¶² Àǹ̸¦ °¡Áö´Â°¡´Â ¸Þ½ÃÁöº°·Î ´Ù¸£´Ù. 32ºñÆ®°ªÀÌ´Ù.
time ¸Þ½ÃÁö°¡ ¹ß»ýÇÑ ½Ã°£ÀÌ´Ù.
pt ¸Þ½ÃÁö°¡ ¹ß»ýÇßÀ» ¶§ÀÇ ¸¶¿ì½º À§Ä¡ÀÌ´Ù.

message ¸â¹ö¸¦ ÀÐÀ½À¸·Î½á ¸Þ½ÃÁöÀÇ Á¾·ù¸¦ ÆÄ¾ÇÇϸç message°ª¿¡ µû¶ó ÇÁ·Î±×·¥ÀÇ ¹ÝÀÀÀÌ ´Þ¶óÁø´Ù. wParam, lParamÀº ¸Þ½ÃÁö¿¡ ´ëÇÑ ºÎ°¡ÀûÀÎ Á¤º¸¸¦ °¡ÁöµÇ ¸Þ½ÃÁöº°·Î Àǹ̰¡ ´Ù¸£´Ù. ¸¶Ä¡ ÀÎÅÍ·´ÅÍ ·çƾ¿¡¼­ °¢ ·¹Áö½ºÅÍÀÇ Àǹ̰¡ ÀÎÅÍ·´Åͺ°·Î ´Ù¸¥ °Í°ú ¸¶Âù°¡ÁöÀÌ´Ù. GetMessage ÇÔ¼ö´Â ÀÐÀº ¸Þ½ÃÁö¸¦ MSGÇüÀÇ ±¸Á¶Ã¼¿¡ ´ëÀÔÇØ ÁÖ¸ç ÀÌ ±¸Á¶Ã¼´Â DispatchMessage ÇÔ¼ö¿¡ ÀÇÇØ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö(WndProc)·Î Àü´ÞµÈ´Ù.

¸Þ½ÃÁö´Â ½ÇÁ¦·Î ÇϳªÀÇ Á¤¼ö°ªÀ¸·Î Ç¥ÇöµÇ´Âµ¥ ¸Þ½ÃÁöÀÇ Á¾·ù°¡ ¹«Ã´ ¸¹¾Æ ¸Þ½ÃÁöÀÇ ¹øÈ£¸¦ ÀÏÀÏÀÌ ¾Ï±âÇÏ¿© »ç¿ëÇÒ ¼ö°¡ ¾øÀ¸¹Ç·Î windows.h¿¡ ¸Þ½ÃÁöº°·Î ¸ÅÅ©·Î »ó¼ö¸¦ Á¤ÀÇÇØ µÎ¾úÀ¸¸ç Á¢µÎ¾î WM_À¸·Î ½ÃÀ۵ȴÙ. °¡Àå ÀÚÁÖ »ç¿ëµÇ´Â ¸Þ½ÃÁöÀÇ Á¾·ù¸¦ ¸î °³¸¸ º¸ÀδÙ.

¸Þ½ÃÁö ÀǹÌ
WM_QUIT ÇÁ·Î±×·¥À» ³¡³¾ ¶§ ¹ß»ýÇÏ´Â ¸Þ½ÃÁöÀÌ´Ù.
WM_LBUTTONDOWN ¸¶¿ì½ºÀÇ ÁÂÃø ¹öưÀ» ´©¸¦ °æ¿ì ¹ß»ýÇÑ´Ù.
WM_CHAR Űº¸µå·ÎºÎÅÍ ¹®ÀÚ°¡ ÀÔ·ÂµÉ ¶§ ¹ß»ýÇÑ´Ù
WM_PAINT È­¸éÀ» ´Ù½Ã ±×·Á¾ß ÇÒ Çʿ䰡 ÀÖÀ» ¶§ ¹ß»ýÇÑ´Ù.
WM_DESTROY À©µµ¿ì°¡ ¸Þ¸ð¸®¿¡¼­ ÆÄ±«µÉ ¶§ ¹ß»ýÇÑ´Ù.
WM_CREATE À©µµ¿ì°¡ óÀ½ ¸¸µé¾îÁú ¶§ ¹ß»ýÇÑ´Ù.

¸Þ½ÃÁö ·çÇÁ°¡ Á¾·áµÇ¸é ÇÁ·Î±×·¥Àº ¸¶Áö¸·À¸·Î Message.wParamÀ» ¸®ÅÏÇϰí Á¾·áÇÑ´Ù. ÀÌ °ªÀº WM_QUIT ¸Þ½ÃÁö·ÎºÎÅÍ Àü´ÞµÈ Å»Ãâ ÄÚµå(exit code)ÀÌ´Ù. µµ½º¿¡¼­ »ç¿ëÇÏ´Â Å»Ãâ ÄÚµå¿Í µ¿ÀÏÇÑ Àǹ̸¦ °¡Áö¸ç »ç¿ëµÇ´Â °æ¿ì°¡ °ÅÀÇ ¾ø´Ù.


¸ñ·Ï º¸±â  ´ÙÀ½ °­Á            written by http://www.winapi.co.kr