2004년 4월 29일
조경민 bro (bro@shinbiro.com )
메세지 크래커
=====================================================
메세지 크래커는 예전에 Win32 API 상에서 윈도우 프로시저에서 발생되어 분기 처리되는
메시지 핸들링 부분을 (switch case WM_CREATE... case WM_CLOSE 등등 부분 )
따로 함수로 이쁘게 뽑아내서 쓰는 일종의 매크로 트릭입니다.
물론 이 방식은 MFC에서 MESSAGE_MAP이라는 매크로로 좀더 일반화 되어 완전 대체되었습니다.
예를 들어서 설명드리죠.
LRESULT CALLBACKI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
MSG msg;
...
switch( msg.message )
{
case WM_MOUSEMOVE :
..
break;
}
}
이런 기존 Win32 코드가 보이시죠? case 문이 길어지고 내용이 길어지면 당연히 메시지 핸들링 코드가
한눈에 안들어오므로 이를
LRESULT CALLBACKI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_MOUSEMOVE :
{
int x = (int)(short)LOWORD(lParam);
int y = (int)(short)HIWORD(lParam),
int flag = (UINT)(wParam);
My_OnMoveMove( hwnd, x, y, flag ); // 이렇게 사용자 정의 함수로 뽑아놓으면 더 보기 좋겠죠?
}
break;
}
}
// 이 부분을 좀더 보기 좋게 메시지 크래커 매크로를 사용해서 쓰는 것입니다. 별내용은 없죠.
LRESULT CALLBACKI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_MOUSEMOVE :
return HANDLE_WM_MOUSEMOVE(hwnd, wParam, lParam,
My_OnMouseMove);
break;
}
}
#define HANDLE_WM_MOUSEMOVE(hwnd, wParam, lParam, fn) \
((fn)((hwnd), (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam), (UINT)(wParam)), 0L)
이 매크로는 그냥 보이는대로 해석이 가능하므로 따로 설명할건 없겠군요.
void OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags)
{
이미 WPARAM과 LPARAM에 있던 x,y,flag 값이 위의 변수로 잘 분리되어서 들어왔으므로
귀찮게 LPARAM에서 쪼개서 쓰고 할 필요없죠. 이미 되어있으니 그냥 x, y 값 가져다가 그냥 쓰면됩니다.
}
조경민 bro (bro@shinbiro.com )
메세지 크래커
=====================================================
메세지 크래커는 예전에 Win32 API 상에서 윈도우 프로시저에서 발생되어 분기 처리되는
메시지 핸들링 부분을 (switch case WM_CREATE... case WM_CLOSE 등등 부분 )
따로 함수로 이쁘게 뽑아내서 쓰는 일종의 매크로 트릭입니다.
물론 이 방식은 MFC에서 MESSAGE_MAP이라는 매크로로 좀더 일반화 되어 완전 대체되었습니다.
예를 들어서 설명드리죠.
LRESULT CALLBACKI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
MSG msg;
...
switch( msg.message )
{
case WM_MOUSEMOVE :
..
break;
}
}
이런 기존 Win32 코드가 보이시죠? case 문이 길어지고 내용이 길어지면 당연히 메시지 핸들링 코드가
한눈에 안들어오므로 이를
LRESULT CALLBACKI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_MOUSEMOVE :
{
int x = (int)(short)LOWORD(lParam);
int y = (int)(short)HIWORD(lParam),
int flag = (UINT)(wParam);
My_OnMoveMove( hwnd, x, y, flag ); // 이렇게 사용자 정의 함수로 뽑아놓으면 더 보기 좋겠죠?
}
break;
}
}
// 이 부분을 좀더 보기 좋게 메시지 크래커 매크로를 사용해서 쓰는 것입니다. 별내용은 없죠.
LRESULT CALLBACKI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_MOUSEMOVE :
return HANDLE_WM_MOUSEMOVE(hwnd, wParam, lParam,
My_OnMouseMove);
break;
}
}
#define HANDLE_WM_MOUSEMOVE(hwnd, wParam, lParam, fn) \
((fn)((hwnd), (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam), (UINT)(wParam)), 0L)
이 매크로는 그냥 보이는대로 해석이 가능하므로 따로 설명할건 없겠군요.
void OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags)
{
이미 WPARAM과 LPARAM에 있던 x,y,flag 값이 위의 변수로 잘 분리되어서 들어왔으므로
귀찮게 LPARAM에서 쪼개서 쓰고 할 필요없죠. 이미 되어있으니 그냥 x, y 값 가져다가 그냥 쓰면됩니다.
}
'KB > MFC/Win32' 카테고리의 다른 글
ShowWeb function (0) | 2004.05.24 |
---|---|
[펌] band object에서 IWebBrowser 인터페이스 받기. (0) | 2004.05.12 |
[DB] ODBC 데이타소스 생성하기 (DSN 생성) (0) | 2004.04.28 |
[winsock] Winsock2 오버랩 완료루틴 소켓 (0) | 2004.04.28 |
[MSDN] Ole Connection String (0) | 2004.04.28 |