.그리드에 정렬

이제부터 모든 도형의 좌표와 크기는 그리드에 맞게 정렬되어야 한다. 다음 함수는 주어진 좌표를 그리드 간격에 맞게 조정한다.

 

void AdjustToGrid(int &x, int &y)

{

   if (bGrid) {

      x=x/GridX*GridX;

      y=y/GridY*GridY;

   }

}

 

주어진 값을 그리드의 배수 위치가 되도록 조정했으므로 좌표를 입력하면 근접한 그리드 위치로 내림될 것이다. 함수에서 bGrid 변수값을 참조하므로 좌표를 조정하는 모든 곳에서는 옵션의 설정 상태와 상관없이 좌표를 적용하기 전에 함수만 호출하면 된다. 대부분 마우스 핸들러에서 좌표를 다루고 있다.

 

LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   int TempSel;

   int nHit;

 

   if (NowTool==DT_SELECT) {

      nHit=TrackerHitTest(LOWORD(lParam),HIWORD(lParam));

      if (nHit != 0) {

          oldx=LOWORD(lParam);

          oldy=HIWORD(lParam);

          AdjustToGrid(oldx,oldy);

          dObj=*arObj[NowSel];

          SizeCorner=nHit;

          DrawTemp(&dObj);

          DragMode=DM_SIZE;

      } else {

          TempSel=FindObject(LOWORD(lParam),HIWORD(lParam));

          if (NowSel != TempSel) {

             NowSel=TempSel;

             InvalidateRect(hWnd,NULL,TRUE);

             UpdateWindow(hWnd);

          }

         if (NowSel != -1) {

             oldx=LOWORD(lParam);

             oldy=HIWORD(lParam);

             AdjustToGrid(oldx,oldy);

             dObj=*arObj[NowSel];

             DrawTemp(&dObj);

             DragMode=DM_MOVE;

          }

      }

   } else {

      sx=LOWORD(lParam);

      sy=HIWORD(lParam);

      AdjustToGrid(sx,sy);

      oldx=sx;

      oldy=sy;

      DragMode=DM_DRAW;

   }

   SetCapture(hWnd);

   return 0;

}

 

LRESULT OnMouseMove(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   int ex,ey;

   HDC hdc;

 

   ex=(int)(short)LOWORD(lParam);

   ey=(int)(short)HIWORD(lParam);

   AdjustToGrid(ex,ey);

   ....

 

드래그를 시작하기 전에, 드래그 중에 함수를 호출하여 그리드에 맞게 좌표를 조정하면 된다. 키보드 이동 코드도 그리드의 영향을 받도록 상수 8 변수로 바꾼다.

 

LRESULT OnKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   if (bControl) {

      dx=1;

      dy=1;

   } else {

      dx=GridX;

      dy=GridY;

   }

   ....

 

여기까지 작성한 테스트해 보면 도형의 배치 이동이 그리드 단위로 이루어져 훨씬 다루기 쉬울 것이다. 그리드의 핵심은 a=a/b*b라는 아주 간단한 수식이다.