4-3-¶ó. Äݹé ÇÔ¼ö

ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â µ¿¾È Áö¼ÓÀûÀ¸·Î ¼öÇàÇØ¾ß ÇÒ ÀÛ¾÷ÀÌ ÀÖ´Ù°í ÇØ º¸ÀÚ. ¿¹¸¦ µé¾î ·Î°í ¾Ö´Ï¸ÞÀ̼ÇÀ̳ª ¹é±×¶ó¿îµå À½¾Ç ¿¬ÁÖ µîÀ» µé ¼ö Àִµ¥ µµ½º¿¡¼­¶ó¸é ´ÙÀ½°ú °°ÀÌ Äڵ带 ÀÛ¼ºÇÒ °ÍÀÌ´Ù.

for(;;) {
	Áö¼ÓÀûÀÎ ÀÛ¾÷
	±âŸ ÀÛ¾÷
}

¹«ÇÑ ·çÇÁ°¡ Àüü ÇÁ·Î±×·¥ Äڵ带 °¨½Î°í ÀÖ°í ÀÌ ·çÇÁ ¾È¿¡¼­ Áö¼ÓÀûÀ¸·Î ÇؾßÇÒ ÀÛ¾÷°ú ±×¿Ü ÀÛ¾÷À» ¼öÇàÇÏ°í ÀÖ´Ù. µµ½º¿¡¼­´Â ÀÌ·±½ÄÀ¸·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀÌ °¡´ÉÇÏ¸ç ½ÇÁ¦·Î ÀÌ·¸°Ô ÇÑ´Ù. ±×·¯³ª À©µµ¿ìÁî¿Í °°Àº ¸ÖƼ ŽºÅ· ȯ°æ¿¡¼­´Â ÀÌ·± ¹æ½ÄÀ» »ç¿ëÇؼ­´Â ¾ÈµÈ´Ù. ¿Ö³ÄÇϸé ÇÑ ÇÁ·Î±×·¥ÀÌ Á¦¾î±ÇÀ» µ¶Á¡ÇÏ°í À־´Â ¾ÈµÇ¸ç ´Ù¸¥ ÇÁ·Î±×·¥µµ ½ÇÇà½Ã°£À» °¡Á®¾ß Çϱ⠶§¹®ÀÌ´Ù. »ç¿ëÀÚ´Â ¼ö½Ã·Î ÀÛ¾÷ ÀüȯÀ» ÇÒ ¼ö ÀÖ¾î¾ß Çϴµ¥ ÇÑ ÇÁ·Î±×·¥ÀÌ CPU¸¦ µ¶Â÷ÁöÇÏ°í ÀÖÀ¸¸é ¾ÈµÈ´Ù. ±×·¡¼­ CPU¸¦ µ¶Á¡ÇÏ´Â ÀÌ·± ¹«ÇÑ·çÇÁ¸¦ ÀÛ¼ºÇؼ­´Â ¾ÈµÇ¸ç ¹Ýµå½Ã ¸Þ½ÃÁö°¡ Àü´ÞµÇ¾úÀ» ¶§¿¡ ÇÑÇØ ÇÊ¿äÇÑ ÀÛ¾÷À» Çϵµ·Ï ÇØ¾ß ÇÑ´Ù. ÀÌ·² ¶§ »ç¿ëÇÏ´Â ¸Þ½ÃÁö°¡ ¹Ù·Î ŸÀÌ¸Ó ¸Þ½ÃÁöÀε¥ Àá½Ã ÈÄ¿¡ ¿¹Á¦¸¦ ¸¸µé¾î º¼ °ÍÀÌ´Ù.

¿¹Á¦¸¦ ¸¸µé±â Àü¿¡ Àá±ñ SetTimerÀÇ ³×¹ø° Àμö¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ³×¹ø° Àμö´Â TIMERPROC lpTimerFunc¶ó°í µÇ¾î Àִµ¥ ÀÌ Àμö´Â ŸÀÌ¸Ó ÇÁ·Î½ÃÀú ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ °¡¸®Å²´Ù. ÀÌ Àμö°¡ NULL·Î µÇ¾î ÀÖÀ» °æ¿ì ù¹ø° Àμö·Î ÁöÁ¤µÈ hWnd·Î WM_TIMER ¸Þ½ÃÁö°¡ Àü´ÞµÇÁö¸¸ ÀÌ Àμö¿¡ ŸÀÌ¸Ó ÇÔ¼ö°¡ ÁöÁ¤µÇ¾úÀ» °æ¿ì´Â ¸Å ½Ã°£¸¶´Ù ÀÌ ÇÔ¼ö°¡ ´ë½Å È£ÃâµÈ´Ù. Áï ŸÀÌ¸Ó ÇÔ¼ö°¡ ÁöÁ¤µÇ¸é ¸Þ½ÃÁö ´ë½Å ÇÔ¼ö¸¦ È£ÃâÇØ ÁØ´Ù. ŸÀÌ¸Ó ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¿øÇüÀ¸·Î ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù.

VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime );

4°³ÀÇ Àμö¸¦ °¡Áö´Âµ¥ hWnd´Â ŸÀ̸Ӹ¦ ¼ÒÀ¯ÇÑ À©µµ¿ìÀÇ ÇÚµéÀ̸ç uMsg´Â WM_TIMER, idEvent´Â ŸÀÌ¸Ó ID, dwTimeÀº À©µµ¿ìÁî°¡ ½ÇÇàµÈ ÈÄÀÇ °æ°ú½Ã°£ÀÌ´Ù. ÀÌ ÇÔ¼öÀÇ Àμö´Â Àß »ç¿ëµÇÁö ¾ÊÀ¸¹Ç·Î ±¸Ã¼ÀûÀ¸·Î ¾Ë ÇÊ¿ä´Â ¾ø´Ù. ¾Æ¹¸µç Áß¿äÇÑ »ç½ÇÀº ÀÌ·± ¿øÇüÀ» °¡Áö´Â ÇÔ¼ö¸¦ ¸¸µç ÈÄ SetTimer ÇÔ¼öÀÇ ³×¹ø° Àμö¿¡ ÀÌ ÇÔ¼ö¸íÀ» Àû¾îÁÖ¸é ÁöÁ¤ÇÑ ½Ã°£ °£°ÝÀ¸·Î ÀÌ ÇÔ¼ö°¡ È£ÃâµÈ´Ù´Â Á¡ÀÌ´Ù.

±×·³ ÀÌÁ¦ Äݹé ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© È­¸éÀÇ ÀÓÀÇ À§Ä¡¿¡ Áö¼ÓÀûÀ¸·Î Á¡À» Âï´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. RandGrp ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé°í ´ÙÀ½°ú °°ÀÌ Äڵ带 ÀÛ¼ºÇÑ´Ù.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="RandGrp";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
		  ,LPSTR lpszCmdParam,int nCmdShow)
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst=hInstance;
	
	WndClass.cbClsExtra=0;
	WndClass.cbWndExtra=0;
	WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
	WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	WndClass.hInstance=hInstance;
	WndClass.lpfnWndProc=(WNDPROC)WndProc;
	WndClass.lpszClassName=lpszClass;
	WndClass.lpszMenuName=NULL;
	WndClass.style=CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&WndClass);

	hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL,(HMENU)NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);
	
	while(GetMessage(&Message,0,0,0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

void CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
	HDC hdc;
	int i;
	hdc=GetDC(hWnd);
	for (i=0;i<100;i++) 
		SetPixel(hdc,rand()%500, rand()%400,
		RGB(rand()%256,rand()%256,rand()%256,));
	ReleaseDC(hWnd, hdc);
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage) {
	case WM_CREATE:
		SetTimer(hWnd, 1, 100, (TIMERPROC)TimerProc);
		return 0;
	case WM_DESTROY:
		KillTimer(hWnd, 1);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WndProc¿¡¼­´Â ÇÁ·Î±×·¥ ½ÃÀÛ½Ã(WM_CREATE)¿¡ ŸÀ̸Ӹ¦ ¼³Ä¡ÇÏ´Â ÀÏ°ú ÇÁ·Î±×·¥ Á¾·á Á÷Àü(WM_DESTROY)¿¡ ŸÀ̸Ӹ¦ ÇØÁ¦ÇÏ´Â ÀÛ¾÷¸¸ ÇÑ´Ù. SetTimer ÇÔ¼ö¿¡¼­ °£°ÝÀº 0.1ÃÊ·Î ÁöÁ¤µÇ¾ú°í ³×¹ø° Àμö´Â TimerProc¶õ ÇÔ¼ö·Î ÁöÁ¤µÇ¾î ÀÖÀ¸¹Ç·Î 0.1ÃÊ °£°ÝÀ¸·Î TimerProc¶ó´Â ÇÔ¼ö°¡ È£ÃâµÉ °ÍÀÌ´Ù. TimerProc ÇÔ¼ö´Â WndProc ¹Ù·Î ¾Õ¿¡ ÀÛ¼ºµÇ¾î ÀÖÀ¸¸ç 300°³ÀÇ Á¡À» ³­¼ö·Î ¾òÀº ÀÓÀÇ ÁÂÇ¥¿¡ ÀÓÀÇÀÇ »ö»óÀ¸·Î Ãâ·ÂÇÏ´Â ÀÏÀ» ÇÑ´Ù. ÀÓÀÇÀÇ »ö»óÀ» ¸¸µé ¶§´Â RGB ¸ÅÅ©·Î ÇÔ¼ö¸¦ »ç¿ëÇϴµ¥ ÀÌ ÇÔ¼ö´Â 6Àå¿¡¼­ ÀÚ¼¼È÷ ¾Ë¾Æº¼ °ÍÀÌ´Ù. °á±¹ 1ÃÊ¿¡ 3000°³ÀÇ Á¡ÀÌ ¹«ÀÛÀ§·Î Ãâ·ÂµÇ´Â ¼ÀÀÌ´Ù. ½ÇÇàÁßÀÇ ¸ð½ÀÀº ´ÙÀ½°ú °°´Ù.

ÀÌ ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö´Â ½±°Ô ÀÌÇØ°¡ °¥ °ÍÀÌ´Ù. ±×·±µ¥ ¿Ö ÀÌ·± ÀÛ¾÷À» Çϴµ¥ ´ÙÀ½°ú °°ÀÌ ÇÏ¸é ¾ÈµÉ±î?

case WM_PAINT:
	hdc=BeginPaint(hWnd, &ps);
	for (;;) {
		SetPixel(hdc,rand()%500, rand()%400,
			RGB(rand()%256,rand()%256,rand()%256,));
	}
	EndPaint(hWnd, &ps);
	return 0;

WM_PAINT¿¡¼­ ¹«Çѹø Á¡À» ÂïÀ¸¸é °á°ú´Â °°Áö ¾ÊÀ»±î? ¸¸¾à ÀÌ·± Àǹ®À» °¡Áö°í ÀÖ´Ù¸é Á÷Á¢ Äڵ带 ÀÛ¼ºÇØ ³Ö¾î º¸°í ½ÇÇàÇØ º¸¸é ¿Ö ¾ÈµÇ´ÂÁö¸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. Á¡ÀÌ ¹«ÀÛÀ§·Î ÂïÈ÷±â´Â ÇϹǷΠ¸ñÀûÀº ´Þ¼ºµÇ°ÚÁö¸¸ ±× ¿Ü ¾î¶°ÇÑ µ¿ÀÛµµ ÇÒ ¼ö ¾ø´Ù. ŸÀÌƲ ¹Ù¸¦ µå·¡±×ÇÏ¿© À§Ä¡¸¦ ¿Å±æ ¼öµµ ¾øÀ¸¸ç Å©±â º¯°æµµ µÇÁö ¾Ê°í ½Ã½ºÅÛ ¸Þ´º¸¦ ´­·¯µµ ¸Þ´º°¡ ³ªÅ¸³ªÁö ¾Ê´Â´Ù. ´õ±¸³ª ½É°¢ÇÑ °ÍÀº Á¾·á ¹öÆ°À» ´­·¯µµ Á¾·áÁ¶Â÷µµ µÇÁö ¾Ê´Â´Ù´Â Á¡ÀÌ´Ù. ¿Ö³ÄÇϸé WM_PAINT ¸Þ½ÃÁö ó¸® ±¸°£¿¡¼­ ¹«ÇÑ·çÇÁ¿¡ ºüÁ® µé¾ú±â ¶§¹®¿¡ ¾î¶² ´Ù¸¥ ¸Þ½ÃÁöµµ ¹ÞÀ» ¼ö ¾ø´Â »óÅ°¡ µÇ¾ú±â ¶§¹®ÀÌ´Ù.

´ÙÇàÈ÷ Win95´Â ¼±Á¡Çü ¸ÖƼ ŽºÅ· ȯ°æÀ̱⠶§¹®¿¡ ´Ù¸¥ ÀÛ¾÷À¸·Î ÀüȯÇÒ ¼ö ÀÖÀ¸¸ç ÃÖÈÄÀÇ ¼ö´ÜÀ¸·Î Ctrl-Alt-Del Å°¸¦ ´­·¯ ÀÌ ÇÁ·Î±×·¥À» °­Á¦ Á¾·á½Ãų ¼ö ÀÖ´Ù. ¸¸¾à À©µµ¿ìÁî 3.1¿¡¼­ ÀÌ·± Äڵ带 ÀÛ¼ºÇß´Ù¸é ÀÌ´Â °ð Çѹ濡 ½Ã½ºÅÛÀ» ´Ù¿î½ÃÄÑ ¹ö¸®´Â Äڵ尡 µÈ´Ù. ±×·¡¼­ ÀÌ·± Áö¼ÓÀûÀ¸·Î ÇØ¾ß ÇÒ ÀÛ¾÷Àº ŸÀ̸Ӹ¦ ¼³Ä¡ÇÑ ÈÄ Å¸ÀÌ¸Ó ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¶§¸¶´Ù Âñ²û Âñ²û ³ª´©¾î ÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù.

À§ ¿¹Á¦´Â Äݹé ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¹®Á¦¸¦ ÇØ°áÇߴµ¥ WM_TIMER ¸Þ½ÃÁö¸¦ »ç¿ëÇصµ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù. Â÷ÀÌÁ¡À̶ó¸é WM_TIMER ¸Þ½ÃÁö´Â ´Ù¸¥ ¸Þ½ÃÁö°¡ ÀÖÀ» °æ¿ì ½ÇÇà ¼ø¼­¿¡ ¹Ð·Á ´Ê°Ô È£ÃâµÇ´Â °æ¿ì°¡ ÀÖÁö¸¸ Äݹé ÇÔ¼ö¸¦ »ç¿ëÇϸé Á¤È®ÇÑ ½Ã°£¿¡ È£ÃâµÈ´Ù´Â Á¡ÀÌ´Ù. ±×·¡¼­ Á¤È®µµ¸¦ ¿äÇÏ´Â ÀÛ¾÷Àº ŸÀÌ¸Ó ¸Þ½ÃÁöº¸´Ù´Â Äݹé ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ´õ ÁÁ´Ù.

±×·¸´Ù¸é Äݹé ÇÔ¼ö(Callback Function)¶õ ¹«¾ùÀÎÁö ±× Àǹ̸¦ Á» ´õ Á¤È®ÇÏ°Ô ¾Ë¾Æº¸ÀÚ. ÀϹÝÀûÀ¸·Î API ÇÔ¼öµéÀº ¿î¿µÃ¼Á¦°¡ Á¦°øÇϸç ÇÁ·Î±×·¥¿¡¼­´Â ÀÌ ÇÔ¼öµéÀ» È£ÃâÇؼ­ ¿î¿µÃ¼Á¦ÀÇ ¼­ºñ½º¸¦ ¹Þ´Â´Ù. ¿¹¸¦ µé¾î µµ½ºÀÇ ½Ã½ºÅÛ ÄÝ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© µð½ºÅ© ÀÔÃâ·ÂÀ» ¹Þ´Â´Ùµç°¡ À©µµ¿ìÁîÀÇ TextOut ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¹®ÀÚ¿­À» Ãâ·ÂÇϵµ·Ï ÇÏ´Â °æ¿ì°¡ ÀÌ¿¡ ÇØ´çÇÑ´Ù. ¹Ý¸é Äݹé ÇÔ¼ö´Â ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Á¦°øÇÏ¸ç ¿î¿µÃ¼Á¦°¡ ÇÊ¿äÇÒ ¶§ È£ÃâÇÏ´Â ÇÔ¼öÀÌ´Ù. È£ÃâµÇ´Â ¹æÇâÀÌ °Å²Ù·Î µÇ¾ú±â ¶§¹®¿¡ ÄݹéÀ̶ó°í ºÎ¸£´Â °ÍÀÌ´Ù. À§ ¿¹Á¦¿¡¼­ TimerProc ÇÔ¼ö´Â SetTimer¿¡¼­ ÁöÁ¤ÇÑ ½Ã°£¸¶´Ù ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ È£ÃâµÈ´Ù. Äݹé ÇÔ¼ö¸¦ ¹®ÀåÈ­ÇÏ¿© Á¤Àdz»¸°´Ù¸é "¿î¿µÃ¼Á¦¿¡ ÀÇÇØ È£ÃâµÇ´Â ÇÁ·Î±×·¥ ³»ºÎÀÇ ÇÔ¼ö"¶ó°í ÇÒ ¼ö ÀÖ´Ù.

À©µµ¿ìÁî¿¡¼­´Â ÀÌ·± Äݹé ÇÔ¼ö°¡ ºó¹øÇÏ°Ô »ç¿ëµÇ°í ÀÖÀ¸¹Ç·Î °³³äÀ» Àß ¾Ë¾ÆµÎµµ·Ï ÇÏÀÚ. ŸÀ̸ÓÀÇ Äݹé ÇÔ¼ö°¡ ´ëÇ¥ÀûÀ̸ç ÀÌ ¿Ü¿¡µµ Áß¿äÇÑ ¿­°Å ÇÔ¼öµé°ú ¸î¸î ±×·¡ÇÈ ÇÔ¼ö µîÀÇ Äݹé ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ±×º¸´Ùµµ °¡Àå °¡±î¿î Äݹé ÇÔ¼öÀÇ ¿¹´Â ¸Þ½ÃÁö ó¸® ÇÔ¼öÀÎ WndProcÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ¸Þ½ÃÁö°¡ ¹ß»ýÇÒ ¶§¸¶´Ù À©µµ¿ìÁî°¡ È£ÃâÇØ ÁÖ¸ç ÀÀ¿ë ÇÁ·Î±×·¥ ³»ºÎ¿¡ ÀÖÁö¸¸ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ Á÷Á¢ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏÁö´Â ¾Ê´Â´Ù. ¿ÀÁ÷ ¿î¿µÃ¼Á¦¸¸ÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.


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