|
À©µµ¿ìÁ ¸Þ½ÃÁö ±¸µ¿ ½Ã½ºÅÛ(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;
°¢ ¸â¹öÀÇ Àǹ̴ ´ÙÀ½°ú °°´Ù.
message ¸â¹ö¸¦ ÀÐÀ½À¸·Î½á ¸Þ½ÃÁöÀÇ Á¾·ù¸¦ ÆÄ¾ÇÇϸç message°ª¿¡ µû¶ó ÇÁ·Î±×·¥ÀÇ ¹ÝÀÀÀÌ ´Þ¶óÁø´Ù. wParam, lParamÀº ¸Þ½ÃÁö¿¡ ´ëÇÑ ºÎ°¡ÀûÀÎ Á¤º¸¸¦ °¡ÁöµÇ ¸Þ½ÃÁöº°·Î Àǹ̰¡ ´Ù¸£´Ù. ¸¶Ä¡ ÀÎÅÍ·´ÅÍ ·çƾ¿¡¼ °¢ ·¹Áö½ºÅÍÀÇ Àǹ̰¡ ÀÎÅÍ·´Åͺ°·Î ´Ù¸¥ °Í°ú ¸¶Âù°¡ÁöÀÌ´Ù. GetMessage ÇÔ¼ö´Â ÀÐÀº ¸Þ½ÃÁö¸¦ MSGÇüÀÇ ±¸Á¶Ã¼¿¡ ´ëÀÔÇØ ÁÖ¸ç ÀÌ ±¸Á¶Ã¼´Â DispatchMessage ÇÔ¼ö¿¡ ÀÇÇØ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö(WndProc)·Î Àü´ÞµÈ´Ù. ¸Þ½ÃÁö´Â ½ÇÁ¦·Î ÇϳªÀÇ Á¤¼ö°ªÀ¸·Î Ç¥ÇöµÇ´Âµ¥ ¸Þ½ÃÁöÀÇ Á¾·ù°¡ ¹«Ã´ ¸¹¾Æ ¸Þ½ÃÁöÀÇ ¹øÈ£¸¦ ÀÏÀÏÀÌ ¾Ï±âÇÏ¿© »ç¿ëÇÒ ¼ö°¡ ¾øÀ¸¹Ç·Î windows.h¿¡ ¸Þ½ÃÁöº°·Î ¸ÅÅ©·Î »ó¼ö¸¦ Á¤ÀÇÇØ µÎ¾úÀ¸¸ç Á¢µÎ¾î WM_À¸·Î ½ÃÀ۵ȴÙ. °¡Àå ÀÚÁÖ »ç¿ëµÇ´Â ¸Þ½ÃÁöÀÇ Á¾·ù¸¦ ¸î °³¸¸ º¸ÀδÙ.
¸Þ½ÃÁö ·çÇÁ°¡ Á¾·áµÇ¸é ÇÁ·Î±×·¥Àº ¸¶Áö¸·À¸·Î Message.wParamÀ» ¸®ÅÏÇϰí Á¾·áÇÑ´Ù. ÀÌ °ªÀº WM_QUIT ¸Þ½ÃÁö·ÎºÎÅÍ Àü´ÞµÈ Å»Ãâ ÄÚµå(exit code)ÀÌ´Ù. µµ½º¿¡¼ »ç¿ëÇÏ´Â Å»Ãâ ÄÚµå¿Í µ¿ÀÏÇÑ Àǹ̸¦ °¡Áö¸ç »ç¿ëµÇ´Â °æ¿ì°¡ °ÅÀÇ ¾ø´Ù. |