posted by nsakura 2010. 7. 19. 14:20

위의 예제는 타이머 메세지를 사용했지만.

콜백 함수를 이용하여 사용이 가능한데.

우리가 타이머를 처음 배울때 SetTimer인자중 4번째 인자를 사용하면 되는데.

즉 시간을 지장해놓고 4번째 인자를 설정하면 그 함수가 호출이 된다.

그럼 4번째 인자에 함수를 만들어서 넣으면 되겠네? 라고 생각하면 되는데.

그게 좀 정해진 원형이 있다. 참으로 하쉽다.

다음 원형에 맞춰서 만들어야 된다. [이름은 자기 마음대로 하지만 그냥 주어진대로 쓰는게 프로그램 만들때 편할지도]

VOID CALLBACK TimerProc(HWMD hWnd,UINT uMsg, UINT idEnvent, DWORD dwTime);

첫 번째 인수 타이머를 소유한 윈도우의 핸들

두번째 인수는 WM_TIMER를

idEvent는 타이머의 ID

dwTime은 윈도우즈가 실행된 후의 경과 시간이다.

이 함수의 인수는 잘 사용되지는 않는다고 하자.

그럼 코드를 바꿔보자.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
VOID CALLBACK TimerProc(HWND,UINT,UINT,DWORD); //함수 선언

HINSTANCE g_Inst;

LPCTSTR wndName=TEXT("BACKGROUND");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevINSTANCE,LPSTR lpCmdLine,int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_Inst=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;
 WndClass.lpszClassName=wndName;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(wndName,wndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
 
 ShowWindow(hWnd,nShowCmd);
 
 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }

 return (int)Message.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam,LPARAM lParam){
 HDC hdc;
 switch(iMessage){
 case WM_CREATE:
  SetTimer(hWnd,1,50,TimerProc);
  return 0;
 case WM_LBUTTONDOWN:
  hdc=GetDC(hWnd);
  Ellipse(hdc,LOWORD(lParam)-10,HIWORD(lParam)-10,LOWORD(lParam)+10,HIWORD(lParam)+10);
  ReleaseDC(hWnd,hdc);
  return 0;
 case WM_DESTROY:
  KillTimer(hWnd,1);
  PostQuitMessage(0);
  return 0;

 }
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}


VOID CALLBACK TimerProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTime){   //함수 정의
 HDC hdc;
 hdc=GetDC(hWnd);
 int cnt;
 for(cnt=0; cnt<1000; cnt++){
  SetPixel(hdc,rand()%500,rand()%500,RGB(rand()%256,rand()%256,rand()%256));
 }
 ReleaseDC(hWnd,hdc);
}

그럼 도데체 콜백 함수가 무엇인가?

몇번 이야기를 했지만 다시하번 알아보자.

일반적으로 API함수는 프로그램 내에서 운영체제에게 "저기 이거 좀 필요한데요"라고 말을 하는 식이다.

그런데 콜백 함수는 반대이다. 운영체제가 프로그램내의 함수를 호출하는거다 "야 그거 내놔" 식인거다.

그래서 콜백 함수이다.

'Computer > Win API' 카테고리의 다른 글

WinApi 타이머 확장 2  (0) 2010.07.19
WinApi 타이머 확장  (1) 2010.07.19
WinApi 타이머 [백그라운드 작업]  (0) 2010.07.19
WinApi 두개의 타이머  (0) 2010.07.18
WinApi 타이머 확장 문제.  (0) 2010.07.18