2-2-¶ó. WndProc

¸Þ½ÃÁö ó¸® ÇÔ¼ö¶õ ¸Þ½ÃÁö°¡ ¹ß»ýÇÒ ¶§ ÇÁ·Î±×·¥ÀÇ ¹ÝÀÀÀ» ó¸®ÇÏ´Â ÀÏÀ» Çϸç 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 ÇÔ¼ö°¡ ´Ù½Ã ¸®ÅÏÇØ ÁÖ¾î¾ß ÇÑ´Ù. ´ÙÀ½¿¡ ¸Þ½ÃÁö ó¸® ÇÔ¼öÀÇ ÀüüÀûÀÎ ¼ø¼­µµ¸¦ ±×·Á º¸¾Ò´Ù.


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