위의 예제는 타이머 메세지를 사용했지만.
콜백 함수를 이용하여 사용이 가능한데.
우리가 타이머를 처음 배울때 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 |