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 값 가져다가 그냥 쓰면됩니다.
}

+ Recent posts