원래 Callback 함수에 대해 글을 쓰려했는데, 공부 스타일이 예제를 먼저 보고 이해하는게 좋을 것 같아 Callback 예제 함수를 소개하고자 합니다.
간단한 Callback 개념은 여기를 참고해주세요.
Callback 함수를 아래와 같이 정의 합니다.
// 선언
static BOOL CALLBACK MonitorEnumProc( HMONITOR hmonitor, HDC hdc, LPRECT lprect, LPARAM lparam );
// 정의
BOOL CALLBACK CMFCApplicationDlg::MonitorEnumProc( HMONITOR hmonitor, HDC hdc, LPRECT lprect, LPARAM lparam )
{
// todo .. : 작업 입력
return TRUE;
}
그리고 아래와 같이 EnumDisplayMonitors함수에 콜백함수를 인자로 전달하여 호출합니다.
::EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, NULL );
제 PC의 모니터는 2대 이므로 EnumDisplayMonitors를 호출하면 MonitorEnumProc 함수가 2회 호출 됩니다.
GetMonitorInfo를 사용하면 콜백된 모니터의 핸들에서 정보를 얻을 수 있습니다.
MonitorEnumProc에 아래와 같이 정의하시면 됩니다.
BOOL CALLBACK CMFCApplicationDlg::MonitorEnumProc( HMONITOR hmonitor, HDC hdc, LPRECT lprect, LPARAM lparam )
{
MONITORINFO mi;
mi.cbSize = sizeof( mi );
GetMonitorInfo( hmonitor, &mi );
TRACE( _T("left(%d), top(%d), right(%d), bottom(%d)\n"),
mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right, mi.rcMonitor.bottom );
return TRUE;
}
만약 MonitorEnumProc가 FALSE을 반환 하면 다음 콜백이 호출되지 않습니다.