°¡.À̵¿Çϱâ

À̹ø Àý¿¡¼­´Â °´Ã¼¸¦ À̵¿, Å©±â º¯°æÇØ º¸µµ·Ï ÇÏÀÚ. ApiDraw04 ÇÁ·ÎÁ§Æ®ÀÇ »çº»À» ÀÛ¼ºÇÏ¿© ApiDraw05 ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé°í ÀÌ ÇÁ·ÎÁ§Æ®¿¡ °´Ã¼ ÆíÁý Äڵ带 Çϳª¾¿ ¸¸µé¾î º¸ÀÚ. ¸ÕÀú Å×½ºÆ®ÀÇ ÆíÀǸ¦ À§ÇØ Å¸¿øÀ» µðÆúÆ® Åø·Î ¼±ÅÃÇØ µÐ´Ù. Á÷¼±º¸´Ù´Â Ÿ¿øÀÌ À̵¿ ¹× Å©±â º¯°æ Å×½ºÆ®¿¡ ´õ ÀûÇÕÇÏ´Ù. OnCreate¿¡¼­ NowToolÀÇ ÃʱⰪ¸¸ ¹Ù²Ù¸é µÈ´Ù.

 

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

{

   NowTool=DT_ELLIPSE;

   ....

 

À̵¿°ú Å©±â º¯°æ 󸮸¦ À§ÇØ ´ÙÀ½ µÎ °³ÀÇ Àü¿ª º¯¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

DObject dObj;

int SizeCorner;

 

dObj´Â À̵¿ÁßÀÎ µµÇü¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö´Â Àӽà °´Ã¼À̸ç SizeCorner´Â Å©±â º¯°æ½Ã »ç¿ëÀÚ°¡ µå·¡±×ÇÏ°í ÀÖ´Â Æ®·¡Ä¿ ¹øÈ£ÀÌ´Ù. ¸¶¿ì½º ¸Þ½ÃÁö Çڵ鷯¿¡¼­ À̵¿ÁßÀÎ µµÇüÀÇ Å׵θ®¸¸ Á¡¼±À¸·Î ±×·Á¾ß Çϴµ¥ ÀÌ ÀÛ¾÷À» ´ë½ÅÇÒ ÇÔ¼ö¸¦ µû·Î ÀÛ¼ºÇÑ´Ù.

 

void DrawTemp(const DObject *pObj)

{

   HDC hdc;

   HPEN hPen,hOldPen;

   HBRUSH hOldBrush;

 

   hdc=GetDC(hCanvas);

   SetROP2(hdc,R2_XORPEN);

   hPen=CreatePen(PS_DOT,1,RGB(0,0,0));

   hOldPen=(HPEN)SelectObject(hdc,hPen);

   hOldBrush=(HBRUSH)(SelectObject(hdc,GetStockObject(NULL_BRUSH)));

   switch (pObj->Type) {

   case DT_LINE:

      if ((pObj->Flag & 0x3) == DS_LT || (pObj->Flag & 0x3) == DS_RB) {

          MoveToEx(hdc,pObj->rt.left,pObj->rt.top,NULL);

          LineTo(hdc,pObj->rt.right,pObj->rt.bottom);

      } else {

          MoveToEx(hdc,pObj->rt.left,pObj->rt.bottom,NULL);

          LineTo(hdc,pObj->rt.right,pObj->rt.top);

      }

      break;

   case DT_ELLIPSE:

      Ellipse(hdc,pObj->rt.left,pObj->rt.top,pObj->rt.right,pObj->rt.bottom);

      break;

   case DT_RECTANGLE:

      Rectangle(hdc,pObj->rt.left,pObj->rt.top,pObj->rt.right,pObj->rt.bottom);

      break;

   }

   DeleteObject(SelectObject(hdc,hOldPen));

   SelectObject(hdc,hOldBrush);

   ReleaseDC(hCanvas,hdc);

}

 

ÀÌ ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ pObjÀÇ Á¤º¸¿¡ µû¶ó µµÇüÀ» ±×¸®µÇ Á¡¼± Ææ°ú ³Î ºê·¯½Ã·Î ±×·Á À̵¿ÁßÀÎ Àӽà °´Ã¼ÀÓÀ» ³ªÅ¸³»µµ·Ï Çß´Ù. OnPaint¿¡ ÀÖ´Â ±×¸®±â ÄÚµå¿Í À¯»çÇ쵂 ÀÌ ÇÔ¼ö°¡ ±×¸®´Â °´Ã¼´Â ¾îµð±îÁö³ª Àӽà °´Ã¼À̹ǷΠÀÌÈÄ µµÇüÀÇ ¼Ó¼ºÀ̳ª ´õºí ¹öÆÛ¸µ µîÀÇ Ã³¸®¿¡¼­ Á¦¿ÜµÈ´Ù. Àӽà °´Ã¼¸¦ ±×¸®´Â Äڵ带 ±»ÀÌ ÇÔ¼ö·Î µû·Î ¸¸µç ÀÌÀ¯´Â ¸¶¿ì½º Çڵ鷯¿¡¼­ ¶È°°Àº µ¿ÀÛÀ» ¿©·¯ ¹ø ÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù. °´Ã¼¸¦ À̵¿½ÃÅ°±â À§Çؼ­´Â ±×¸®±â ¸ðµå¸¦ XOR·Î ¹Ù²ã¼­ Áö¿ì°í ´Ù½Ã ±×¸®±â¸¦ ¹Ýº¹ÇØ¾ß ÇϹǷΠÇÔ¼ö·Î ºÐ¸®ÇØ ³õ°í ÇÊ¿äÇÒ ¶§¸¶´Ù È£ÃâÇÏ´Â °ÍÀÌ ÈξÀ ´õ À¯¸®ÇÏ´Ù.

´ÙÀ½Àº ÀÌ ÇÔ¼ö°¡ Àü´Þ¹Þ´Â Àμö¿¡ ´ëÇØ °í·ÁÇØ º¸ÀÚ. À̵¿ÁßÀÎ Àӽà °´Ã¼¸¦ ±×¸®±â À§ÇØ ²À ÇÊ¿äÇÑ Á¤º¸´Â »ç½Ç »ç°¢ ¿µ¿ª¹Û¿¡ ¾ø´Ù. Á÷¼±À̳ª Ÿ¿øµµ ¿ÜÁ¢ »ç°¢ÇüÀ» ±×·Á À̵¿ÇÒ À§Ä¡¸¦ Ç¥ÇöÇÒ ¼ö ÀÖÁö¸¸ µµÇüÀÇ ¿ø·¡ ¸ð¾çÀ» ±×¸®´Â °ÍÀÌ ´õ ÁÁÀ» °ÍÀÌ´Ù. ±×·¡¼­ DrawTemp´Â À̵¿ÇÒ Àӽà °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ Àü´Þ¹Þ°í ÀÌ Àӽà °´Ã¼ÀÇ Á¤º¸´ë·Î ¸ð¾çÀ» ±×¸°´Ù. ÀÌÈÄ DObject ±¸Á¶Ã¼°¡ °î¼±À̳ª ´Ù°¢ÇüÀ» Ç¥ÇöÇÒ ¼ö ÀÖµµ·Ï È®ÀåµÇ´õ¶óµµ Àӽà °´Ã¼ÀÇ Æ÷ÀÎÅͷκÎÅÍ ¿øÇÏ´Â Á¤º¸¸¦ ¸ðµÎ ÃßÃâÇØ ¾µ ¼ö ÀÖ´Ù.

´Ü, ÀÌ ÇÔ¼ö´Â Àӽà °´Ã¼¸¦ ±×¸®±â À§ÇØ ¾îµð±îÁö³ª µµÇüÀÇ Á¤º¸¸¦ ÂüÁ¶¸¸ ÇÒ »ÓÀÌÁö µµÇüÀÇ ³»¿ëÀ» º¯°æÇؼ­´Â ¾ÈµÇ¹Ç·Î const Æ÷ÀÎÅ͸¦ ¹Þµµ·Ï Çß´Ù. Àӽà °´Ã¼¸¦ ±×¸®´Â ÇÔ¼ö¸¦ ¸¸µé¾úÀ¸¹Ç·Î ¸¶¿ì½º Çڵ鷯¿¡¼­´Â Ä¿¼­ÀÇ À̵¿¿¡ µû¶ó Àӽà °´Ã¼¸¦ À̵¿½ÃÄÑ ±×¸®¸é¼­ ¹öÆ°À» ³õÀ» ¶§ ÃÖÁ¾ÀûÀ¸·Î °´Ã¼ÀÇ ÁÂÇ¥¸¦ ¼öÁ¤ÇÏ¸é µÈ´Ù. À̵¿ ó¸®ÀÇ ½ÃÀÛÀº ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´©¸¦ ¶§ÀÌ¸ç ¼±Åà ¸ðµåÀÏ ¶§¸¸ À̵¿ÇÒ ¼ö ÀÖ´Ù.

 

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

{

   int TempSel;

 

   if (NowTool==DT_SELECT) {

      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);

          dObj=*arObj[NowSel];

          DrawTemp(&dObj);

          DragMode=DM_MOVE;

      }

   } else {

   ....

}

 

ÄÚµåÀÇ ¼ø¼­¸¦ ¾à°£ ÁÖÀÇÇØ¾ß Çϴµ¥ ¼±ÅÃÅøÀÏ ¶§ ÀÏ´Ü ¼±Åà ó¸®ÇÑ ÈÄ¿¡ À̵¿À» ½ÃÀÛÇÑ´Ù. ±×·¡¾ß ¼±ÅÃÀÌ ¾ø´Â »óÅ¿¡¼­ ¹Ù·Î µµÇüÀ» µå·¡±×ÇÒ ¶§µµ ¼±Åðú µ¿½Ã¿¡ À̵¿ÇÒ ¼ö ÀÖ´Ù. ¼±Åà »óÅ°¡ ¹Ù²î¾úÀ¸¸é UpdateWindow¸¦ È£ÃâÇÏ¿© Æ®·¡Ä¿¸¦ Áï½Ã ±×·Á À̵¿ ´ë»óÀÌ ¾î¶² µµÇüÀÎÁö¸¦ °¡±ÞÀû »¡¸® Ç¥½ÃÇϵµ·Ï Çß´Ù. À̵¿ÀÌ ½ÃÀ۵Ǹé oldx, oldy¿¡ ÃÖÃÊ ¸¶¿ì½º ¹öÆ°À» ´©¸¥ ÁöÁ¡À» ÀúÀåÇØ µÎ°í dObj¿¡ ¼±Åà µµÇüÀÇ »çº»À» ÀÛ¼ºÇÑ´Ù. ±¸Á¶Ã¼³¢¸®À̹ǷΠ´Ü¼ø ´ëÀÔ¿¡ ÀÇÇØ »çº»À» ½±°Ô ¸¸µé ¼ö ÀÖ´Ù. ´Ü, ÀÌÈÄ DObject°¡ Æ÷ÀÎÅ͸¦ °¡Áö°Ô µÈ´Ù¸é À̶§´Â ±íÀº º¹»ç¸¦ Çϰųª ¾Æ´Ï¸é Æ÷ÀÎÅÍ´Â Àбâ Àü¿ëÀ¸·Î¸¸ »ç¿ëÇØ¾ß ÇÑ´Ù.

ÀÛ¼ºµÈ »çº»À¸·Î DrawTemp¸¦ ÀÏ´Ü È£ÃâÇÏ¿© Àӽà °´Ã¼¸¦ ±×·Á ³õ°í À̵¿À» ½ÃÀÛÇÑ´Ù. ±×·¡¾ß ¸¶¿ì½º À̵¿½Ã¿¡ ÀÌ Àӽà °´Ã¼¸¦ Áö¿ì°í »õ À§Ä¡¿¡ ´Ù½Ã Àӽà °´Ã¼¸¦ ±×¸± ¼ö ÀÖ´Ù. DragMode º¯¼ö¿¡ DM_MOVE¸¦ ´ëÀÔÇÏ¿© ÇöÀç µµÇüÀ» À̵¿ÁßÀ̶ó´Â °ÍÀ» ±â·ÏÇÑ´Ù. ÀÌÈÄÀÇ À̵¿ 󸮴 ¸¶¿ì½º°¡ ¿òÁ÷ÀÏ ¶§ÀÎ OnMouseMove¿¡¼­ ó¸®ÇÑ´Ù.

 

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

{

   ....

   if (DragMode==DM_MOVE) {

      DrawTemp(&dObj);

      OffsetRect(&dObj.rt,ex-oldx,ey-oldy);

      oldx=ex;

      oldy=ey;

      DrawTemp(&dObj);

   }

   return 0;

}

 

DragMode°¡ DM_MOVEÀÏ ¶§¸¸ Àӽà °´Ã¼ À̵¿ 󸮸¦ Çϴµ¥ µÎ ¹øÀÇ DrawTemp È£ÃâÀÌ ÀÖ´Ù. ù ¹ø° DrawTemp È£ÃâÀº ÀÌÀü À§Ä¡ÀÇ Àӽà °´Ã¼¸¦ Áö¿ì´Â °ÍÀÌ°í dObjÀÇ rt¸¦ º¯°æÇÑ ÈÄ µÎ ¹ø°·Î ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀº º¯°æµÈ À§Ä¡¿¡ Àӽà °´Ã¼¸¦ ´Ù½Ã Ãâ·ÂÇÏ´Â °ÍÀÌ´Ù. ÀÌ °úÁ¤ÀÌ ¸¶¿ì½º ¹öÆ°À» ³õÀ» ¶§±îÁö ¹Ýº¹µÇ¸ç ¹öÆ°À» ³õÀ¸¸é Àӽà °´Ã¼ÀÇ Á¤º¸¸¦ À̵¿ ´ë»ó °´Ã¼·Î ´Ù½Ã ´ëÀÔÇÑ´Ù.

 

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

{

   ....

   if (DragMode==DM_MOVE) {

      arObj[NowSel]->rt=dObj.rt;

      InvalidateRect(hWnd,NULL,TRUE);

   }

   DragMode=DM_NONE;

   ReleaseCapture();

   return 0;

}

 

À§Ä¡¸¸ À̵¿ÇßÀ¸¹Ç·Î Àӽà °´Ã¼ÀÇ Á¤º¸ Áß ³ª¸ÓÁö´Â ±×´ë·Î µÎ°í rt¸¸ ´Ù½Ã ´ëÀԹ޴µ¥ ÀÌ ¿µ¿ªÀ» °´Ã¼¿¡ ´Ù½Ã ´ëÀÔÇÔÀ¸·Î½á À̵¿ÀÇ ÃÖÁ¾ °á°ú¸¦ ÃëÇÑ °ÍÀÌ´Ù. ¸Þ¸ð¸®»ó¿¡¼­ À̵¿À» ¿Ï·áÇÑ ÈÄ ÀÛ¾÷ ¿µ¿ª Àüü¸¦ ¹«È¿È­Çϸé OnPaint¿¡¼­ º¯°æµÈ À§Ä¡¿¡ µµÇüÀ» ´Ù½Ã ±ò²ûÇÏ°Ô ±×¸± °ÍÀÌ´Ù. º¸´Ù½ÃÇÇ À̵¿À̶õ ¹«Ã´ °£´ÜÇÑ µ¿ÀÛÀÌ´Ù. Àӽà °´Ã¼¸¦ ±×¸®´Â °ÍÀÌ Á¶±Ý ±ÍÂúÀ» »ÓÀÌÁö µµÇüÀÇ rt ¿µ¿ª¸¸ ¼öÁ¤ÇÏ°í ´Ù½Ã ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù.