|
¸Þ½ÃÁö ó¸® ÇÔ¼ö¶õ ¸Þ½ÃÁö°¡ ¹ß»ýÇÒ ¶§ ÇÁ·Î±×·¥ÀÇ ¹ÝÀÀÀ» ó¸®ÇÏ´Â ÀÏÀ» Çϸç WinMain ÇÔ¼ö¿Í´Â º°µµ·Î WndProcÀ̶ó´Â À̸§À¸·Î Á¸ÀçÇÑ´Ù. À©µµ¿ì ÇÁ·Î½ÃÀú(Window Procedure)¶ó´Â ¶æÀÌÁö¸¸ Åë»ó ÀÐÀ» ¶§´Â "À©µåÇÁ·Ï"À̶ó°í Àд´Ù. WndProcÀº WinMain¿¡¼ È£ÃâÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó À©µµ¿ìÁî¿¡ ÀÇÇØ È£ÃâµÈ´Ù. WinMain³»ÀÇ ¸Þ½ÃÁö ·çÇÁ´Â ¸Þ½ÃÁö¸¦ ¸Þ½ÃÁö ó¸® ÇÔ¼ö·Î º¸³»Áֱ⸸ ÇÒ »ÓÀ̸ç WndProcÀº ¸Þ½ÃÁö°¡ ÀԷµǸé À©µµ¿ìÁî¿¡ ÀÇÇØ È£ÃâµÇ¾î ¸Þ½ÃÁö¸¦ ó¸®ÇÑ´Ù. ÀÌ·¸°Ô ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ È£ÃâµÇ´Â ÀÀ¿ë ÇÁ·Î±×·¥³»ÀÇ ÇÔ¼ö¸¦ Äݹé(CallBack) ÇÔ¼ö¶ó°í ÇÑ´Ù. WndProcÀÇ Àμö´Â ¸ðµÎ 4°³À̸ç MSG ±¸Á¶Ã¼ÀÇ ¸â¹ö 4°³¿Í µ¿ÀÏÇÏ´Ù. hWnd´Â ¸Þ½ÃÁö¸¦ ¹ÞÀ» À©µµ¿ìÀÇ ÇÚµéÀ̸ç iMessage´Â ¾î¶² Á¾·ùÀÇ ¸Þ½ÃÁöÀΰ¡, Áï ¾î¶² º¯È°¡ ¹ß»ýÇߴ°¡¿¡ °üÇÑ Á¤º¸¸¦ °¡Áø´Ù. iMessage°¡ WM_MOVEÀ̸é À©µµ¿ìÀÇ À§Ä¡°¡ º¯°æµÇ¾úÀ½À» ¾Ë¸®°í WM_DESTROYÀ̸é À©µµ¿ì°¡ ÆÄ±«µÇ¾úÀ½À» ¾Ë¸®´Â °ÍÀÌ´Ù. wParam, lParamÀº iMessageÀÇ ¸Þ½ÃÁö¿¡ µû¸¥ ºÎ°¡ÀûÀÎ Á¤º¸¸¦ °¡Áø´Ù. ¿¹¸¦ µé¾î ¸¶¿ì½º ¹öưÀÌ ´·¯Á³´Ù´Â WM_LBUTTONDOWN ¸Þ½ÃÁö°¡ ÀԷµǾú´Ù¸é ȸéÀÇ ¾îµðÂë¿¡¼ ¸¶¿ì½º ¹öưÀÌ ´·¯Á³´Â°¡, ±×¶§ÀÇ Å°º¸µå »óȲ(Shift, Ctrl, Alt)Àº ¾î¶°ÇѰ¡¿¡ °üÇÑ Á¤º¸°¡ Ãß°¡·Î ÇÊ¿äÇϸç WM_CHAR ¸Þ½ÃÁö, Áï Űº¸µå·ÎºÎÅÍ Å°°¡ ÀԷµǾú´Ù´Â ¸Þ½ÃÁö°¡ ÀԷµǾú´Ù¸é ¾î¶² ۰¡ ÀԷµǾú´Â°¡¿¡ °üÇÑ Ãß°¡ÀûÀÎ Á¤º¸°¡ ÇÊ¿äÇÏ´Ù. ÀÌ·± Ãß°¡ Á¤º¸µéÀÌ wParam, lParamÀ¸·Î Àü´ÞµÈ´Ù. wParam, lParam¿¡ ½ÇÁ¦·Î ¾î¶² °ªÀ» Àü´ÞµÇ´ÂÁö´Â ¸Þ½ÃÁöº°·Î ´Ù¸£´Ù. WndProcÀÇ ±¸Á¶´Â ´ëü·Î ´ÙÀ½°ú °°Àº ÇüŸ¦ °¡Áø´Ù. ¸Þ½ÃÁöÀÇ Á¾·ù¿¡ µû¶ó ´ÙÁß ºÐ±âÇÏ¿© ¸Þ½ÃÁöº°·Î 󸮸¦ ÁøÇàÇÑ´Ù.
switch(iMessage)
{
case Msg1:
ó¸®1;
return 0;
case Msg2:
ó¸®2;
return 0;
case Msg3:
ó¸®3;
return 0;
default:
return DefWindowProc(...);
}
Msg1 ¸Þ½ÃÁö°¡ Àü´ÞµÇ¸é ó¸®1À» ÇÑ ÈÄ ¸®ÅÏÇϰí Msg2 ¸Þ½ÃÁö°¡ Àü´ÞµÇ¸é ó¸®2¸¦ ÇÑ ÈÄ ¸®ÅÏÇÑ´Ù. case¹®Àº ÇÁ·Î±×·¥ÀÌ Ã³¸®ÇÒ ¸Þ½ÃÁöÀÇ ¼ö¸¸Å ¹Ýº¹µÉ °ÍÀÌ´Ù. Á¦ÀÏ ³¡¿¡ ÀÖ´Â DefWindowProc ÇÔ¼ö´Â WndProc¿¡¼ ó¸®ÇÏÁö ¾ÊÀº ³ª¸ÓÁö ¸Þ½ÃÁö¿¡ °üÇÑ Ã³¸®¸¦ ÇØ ÁØ´Ù. ¿¹¸¦ µé¾î ½Ã½ºÅÛ ¸Þ´º¸¦ ´õºí Ŭ¸¯Çϸé ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ´Âµ¥ ÀÌ·± 󸮴 º°µµ·Î ÇØ ÁÖÁö ¾Ê¾Æµµ DefWindowProc ÇÔ¼ö¿¡¼ ÇØ ÁØ´Ù. ±×·¡¼ À©µµ¿ìÀÇ À̵¿À̳ª Å©±âº¯°æ µûÀ§ÀÇ Ã³¸®´Â Á÷Á¢ ÇØ ÁÙ ÇÊ¿ä¾øÀÌ DefWindowProcÀ¸·Î ³Ñ°ÜÁֱ⸸ ÇÏ¸é µÈ´Ù. First ¿¹Á¦ÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ µÇ¾î ÀÖ´Ù.
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
WM_DESTROY ¸Þ½ÃÁö¸¸À» ó¸®Çϰí ÀÖÀ¸¸ç ³ª¸ÓÁö ¸Þ½ÃÁö¿¡ ´ëÇØ¼´Â DefWindowProc¿¡°Ô ¸Ã±ä´Ù. WM_DESTROY ¸Þ½ÃÁö´Â »ç¿ëÀÚ°¡ ½Ã½ºÅÛ ¸Þ´º¸¦ ´õºíŬ¸¯Çϰųª Alt+F4¸¦ ´·¯ ÇÁ·Î±×·¥À» ³¡³»·Á°í ÇÒ ¶§ ¹ß»ýÇÏ´Â ¸Þ½ÃÁöÀÌ´Ù. WndProc¿¡¼ ÀÌ ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé PostQuitMessage ÇÔ¼ö¸¦ È£ÃâÇÏ¿© WM_QUIT ¸Þ½ÃÁö¸¦ º¸³½´Ù. WM_QUIT ¸Þ½ÃÁö°¡ ÀÔ·ÂµÇ¸é ¸Þ½ÃÁö ·çÇÁÀÇ GetMessage ÇÔ¼ö ¸®ÅϰªÀÌ False°¡ µÇ¾î ÇÁ·Î±×·¥ÀÌ Á¾·áµÈ´Ù. WM_DESTROY ÀÌ¿ÜÀÇ ¸Þ½ÃÁö´Â ¸ðµÎ DefWindowProc ÇÔ¼ö·Î Àü´ÞµÇ¸ç ÀÌ ÇÔ¼ö¿¡¼ µðÆúÆ® 󸮸¦ ¼öÇàÇØ ÁØ´Ù. WndProcÀº ¸Þ½ÃÁö¸¦ ó¸®ÇßÀ» °æ¿ì ¹Ýµå½Ã 0À» ¸®ÅÏÇØ ÁÖ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ DefWindowProc ÇÔ¼ö°¡ ¸Þ½ÃÁö¸¦ ó¸®ÇßÀ» °æ¿ì ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÑ °ªÀ» WndProc ÇÔ¼ö°¡ ´Ù½Ã ¸®ÅÏÇØ ÁÖ¾î¾ß ÇÑ´Ù. ´ÙÀ½¿¡ ¸Þ½ÃÁö ó¸® ÇÔ¼öÀÇ ÀüüÀûÀÎ ¼ø¼µµ¸¦ ±×·Á º¸¾Ò´Ù.
|