³ª.Æ®·¡Ä¿ ±×¸®±â

OnPaint¿¡¼­ ¼±ÅÃµÈ µµÇüÀÇ »óÅ´ ´Ù¸¥ µµÇü°ú Á¶±Ý ´Ù¸£°Ô ±×·Á¾ß Çϴµ¥ Åë»ó ¼±ÅÃµÈ µµÇü ÁÖº¯¿¡´Â 8°³ÀÇ Æ®·¡Ä¿¸¦ ±×¸°´Ù. Æ®·¡Ä¿´Â µµÇüÀÌ ¼±ÅõǾú´Ù´Â °ÍÀ» º¸¿©Áܰú µ¿½Ã¿¡ Å©±â º¯°æÀ» À§ÇÑ µå·¡±× ÇÚµé·Îµµ »ç¿ëµÈ´Ù. ´ÙÀ½ ¸ÅÅ©·Î »ó¼ö´Â Æ®·¡Ä¿ÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù. °üÇàÀûÀ¸·Î ¸ÅÅ©·Î Á¤Àǹ®Àº #include ¹® ´ÙÀ½¿¡ Á¤ÀÇÇÏ´Â °ÍÀÌ ÁÁ´Ù.

 

// ¸ÅÅ©·Î Á¤ÀÇ

#define TRSIZE 4

 

Æ®·¡Ä¿´Â º¸Åë Á¤»ç°¢ÇüÀ¸·Î ±×¸®´Âµ¥ TRSIZE´Â Á¤»ç°¢ÇüÀÇ ÇÑ º¯ ±æÀÌÀÇ Àý¹ÝÀ» Á¤ÀÇÇÑ´Ù. Æ®·¡Ä¿°¡ ³Ê¹« ÀÛÀ¸¸é ºÒÆíÇÏ¸ç ³Ê¹« Å©¸é ¸ÚÀÌ ¾ø¾î ÀûÀýÇÑ Å©±â¸¦ Àß ¼±ÅÃÇØ¾ß Çϴµ¥ Å©±â º¯°æÀ» ½±°Ô ÇÒ ¼ö ÀÖµµ·Ï ¸ÅÅ©·Î »ó¼ö·Î Á¤ÀÇÇß´Ù. ´ÙÀ½ µÎ ÇÔ¼ö´Â ¼±ÅÃµÈ µµÇüÀÇ Æ®·¡Ä¿¸¦ È­¸é¿¡ ±×¸°´Ù.

 

void DrawTracker(HDC hdc,int idx)

{

   RECT rt;

   int i;

 

   if (idx == -1) return;

   for (i=1;i<=8;i++) {

      GetTrackerRect(idx,i,&rt);

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

   }

}

 

void GetTrackerRect(int idx,int nTrack,RECT *trt)

{

   int tx,ty;

   RECT *ort=&arObj[idx]->rt;

   switch (nTrack) {

   case 1:

      tx=ort->left;

      ty=ort->top;

      break;

   case 2:

      tx=ort->left+(ort->right-ort->left)/2;

      ty=ort->top;

      break;

   case 3:

      tx=ort->right;

      ty=ort->top;

      break;

   case 4:

      tx=ort->left;

      ty=ort->top+(ort->bottom-ort->top)/2;

      break;

   case 5:

      tx=ort->right;

      ty=ort->top+(ort->bottom-ort->top)/2;

      break;

   case 6:

      tx=ort->left;

      ty=ort->bottom;

      break;

   case 7:

      tx=ort->left+(ort->right-ort->left)/2;

      ty=ort->bottom;

      break;

   case 8:

      tx=ort->right;

      ty=ort->bottom;

      break;

   }

   SetRect(trt,tx-TRSIZE,ty-TRSIZE,tx+TRSIZE,ty+TRSIZE);

}

 

µµÇü ÇϳªÀÇ ÁÖº¯¿¡´Â 8°³ÀÇ Æ®·¡Ä¿°¡ ±×·ÁÁö´Âµ¥ Á¿¡¼­ ¿ì·Î À§¿¡¼­ ¾Æ·¡·Î Æ®·¡Ä¿ÀÇ ¹øÈ£¸¦ ´ÙÀ½°ú °°ÀÌ ºÎ¿©ÇØ µÎ¾ú´Ù. ÀÌ ¹øÈ£´Â ÇÁ·Î±×·¥ ³»ºÎ¿¡¼­ Æ®·¡Ä¿¸¦ ĪÇϱâ À§ÇÑ ÀÏÁ¾ÀÇ ID·Î »ç¿ëµÈ´Ù. ¹øÈ£¸¦ ¾²´Â ´ë½Å #defineÀ̳ª ¿­°ÅÇüÀ¸·Î TR_LEFT, TR_RIGHTTOP, TR_RIGHT µîÀÇ »ó¼ö¸¦ Á¤ÀÇÇÏ¿© »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª ÀÌ °æ¿ì´Â ¼ø¼­´ë·Î ¹øÈ£¸¦ ºÙ¿´À¸¹Ç·Î ±»ÀÌ À̸§À» ÁÖÁö ¾Ê´õ¶óµµ °ü¸®ÇÏ±â ¾î·ÆÁö ¾ÊÀ¸¸ç ·çÇÁ¸¦ µ¹¸± ¶§ ¿ÀÈ÷·Á ´õ Æí¸®ÇÏ´Ù.

GetTrackerRect ÇÔ¼ö´Â µµÇüÀÇ ¹øÈ£¿Í Æ®·¡Ä¿ ¹øÈ£(nTrack)¸¦ ÀÔ·ÂÀ¸·Î ¹Þ¾Æµé¿© ÀÌ Æ®·¡Ä¿ÀÇ ¿µ¿ªÀ» ¼¼ ¹øÂ° Ãâ·Â Àμö trt¿¡ ´ëÀÔÇÑ´Ù. µµÇüÀÇ ¿µ¿ªÀ» ort Áö¿ª º¯¼ö¿¡ ±¸ÇØ ³õ°í nTrack¿¡ µû¶ó ortÀÇ ÇÑ ²ÀÁöÁ¡ ¶Ç´Â ÇÑ º¯ÀÇ Áß¾ÓÁ¡ÀÇ ÁÂÇ¥¸¦ tx, ty¿¡ ¸ÕÀú ±¸Çϰí tx, ty¸¦ Áß½ÉÀ¸·Î ÇÏ´Â TRSIZE*2 Å©±âÀÇ Á¤»ç°¢Çü ÁÂÇ¥¸¦ ±¸ÇÏ¸é µÈ´Ù. tx, ty¿¡¼­ +TRSIZE, -TRSIZEÇÑ ¿µ¿ªÀ» Æ®·¡Ä¿ ¿µ¿ªÀ¸·Î Á¤ÀÇÇϹǷΠTRSIZE°¡ Æ®·¡Ä¿ Å©±âÀÇ Àý¹ÝÀÌ µÇ´Â °ÍÀÌ´Ù.

ÀÌ ÇÔ¼ö°¡ Æ®·¡Ä¿ÀÇ ÁÂÇ¥¸¦ ±¸ÇÏ´Â ÀÛ¾÷À» Àü´ãÇϰí ÀÖÀ¸¹Ç·Î DrawTracker ÇÔ¼ö´Â ÁÖ¾îÁø µµÇü¿¡ ´ëÇØ 1~8±îÁö ·çÇÁ¸¦ µ¹¸ç °¢ Æ®·¡Ä¿ ÁÂÇ¥¸¦ ±¸Çϰí Rectangle ÇÔ¼ö·Î »ç°¢Çü¸¸ ±×¸®¸é µÈ´Ù. ¸¸¾à Æ®·¡Ä¿¸¦ µ¿±×¶þ°Ô ±×¸®°í ½ÍÀ¸¸é Ellipse·Î ±×¸®¸é µÇ°í Ææ, ºê·¯½Ã¸¦ »ç¿ëÇϸé Ä÷¯Ç®ÇÏ°Ô ±×¸± ¼öµµ ÀÖ°í Á» ´õ Å©°Ô ±×¸®°í ½ÍÀ¸¸é TRSIZE ¸ÅÅ©·Î »ó¼ö¸¦ Á¶Á¤ÇÑ´Ù. OnPaint´Â ¼±Åà ¿µ¿ªÀÌ ÀÖÀ» ¶§ DrawTracker ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù.

 

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

{

   ....

   if (NowSel != -1) {

      DrawTracker(hdc,NowSel);

   }

   EndPaint(hWnd, &ps);

   return 0;

}

 

Æ®·¡Ä¿¸¦ ±×¸®´Â °ü·Ã ÇÔ¼öµéÀÇ ¿ªÇÒ ºÐ´ãÀÌ Àß µÇ¾î ÀÖ´Ù. GetTrackerRect ÇÔ¼ö´Â ÀÌÈÄ Æ®·¡Ä¿ À§¿¡¼­ Ä¿¼­ ¸ð¾çÀ» º¯°æÇÏ´Â OnSetCursor ÇÔ¼ö¿¡¼­µµ »ç¿ëµÇ¸ç µµÇü Å©±â¸¦ º¯°æÇÒ ¶§µµ »ç¿ëµÈ´Ù. ¿©·¯ ¹ø »ç¿ëµÉ ÇÔ¼öÀ̹ǷΠOnPaint³ª DrawTracker¿¡¼­ ÀÛ¾÷À» Á÷Á¢ ó¸®ÇÏÁö ¾Ê°í º°µµÀÇ ÇÔ¼ö·Î ºÐ¸®ÇØ µÐ °ÍÀÌ´Ù. ÀÌ·± ÇÔ¼öÀÇ ºÐ¸®´Â óÀ½ºÎÅÍ »ý°¢Çϱâ´Â ¾î·ÆÁö¸¸ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÏ´Ù º¸¸é ºÐ¸®ÇÏ´Â °ÍÀÌ ´õ ÁÁ´Ù´Â °ÍÀ» ½±°Ô ¹ß°ßÇÒ ¼ö ÀÖ´Ù. ¿©±â±îÁö Äڵ带 ÀÛ¼ºÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é ¼±Åà »óŰ¡ È­¸é¿¡ Àß Ç¥½ÃµÉ °ÍÀÌ´Ù.

ÀÌ ÇÁ·Î±×·¥Àº ¼±ÅÃÀ» ´Ù¸¥ µµÇü ±×¸®±â¿Í ´ëµîÇÑ ¸ðµå·Î °£ÁÖÇϱ⠶§¹®¿¡ ¼±ÅÃÀ» ÇÏ·Á¸é ¹Ýµå½Ã ¼±ÅÃ Åø·Î ¹Ù²ã¾ß ÇÏ´Â ºÒÆíÇÔÀÌ ÀÖ´Ù. µµÇüÀ» ±×¸®´Â Áß¿¡¶óµµ ºó ¿µ¿ªÀ» Ŭ¸¯ÇÏ¸é ¼±ÅÃ Åø·Î ÀÚµ¿ ÀüȯÇϵµ·Ï ÇØ º¸ÀÚ. AppendObject ÇÔ¼ö´Â µµÇüÀÌ Ãß°¡µÇ¾ú´ÂÁö ±×³É Ŭ¸¯¸¸ µÇ¾ú´ÂÁö¸¦ ¸®ÅϰªÀ¸·Î ¾Ë·Á ÁØ´Ù. µµÇüÀÌ Ãß°¡µÇ¾ú´Ù¸é ¹æ±Ý ±×¸° µµÇüÀ» ¼±ÅÃµÈ µµÇüÀ¸·Î ¸¸µé°í ±×·¸Áö ¾Ê´Ù¸é ºó ¿©¹éÀ» Ŭ¸¯ÇÑ °ÍÀ¸·Î °£ÁÖÇÏ¿© ¼±ÅÃ Åø·Î ÀÚµ¿ ÀüȯÇϵµ·Ï ÇØ º¸ÀÚ.

 

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

{

   if (DragMode==DM_DRAW) {

      if (AppendObject(NowTool,sx,sy,oldx,oldy)==TRUE) {

          NowSel=arNum-1;

      } else {

          NowTool=DT_SELECT;

          NowSel=-1;

      }

      InvalidateRect(hWnd,NULL,TRUE);

   }

   DragMode=DM_NONE;

   ReleaseCapture();

   return 0;

}

 

AppendObject´Â »õ·Î Ãß°¡µÈ µµÇüÀ» Ç×»ó ¹è¿­ ³¡¿¡ Ãß°¡ÇϹǷΠ»õ·Î Ãß°¡µÈ µµÇüÀÇ Ã·ÀÚ´Â arNum-1·Î ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ µµÇüÀÌ ¼º°øÀûÀ¸·Î Ãß°¡µÇ¾úÀ¸¸é arNum-1À» ¼±Åà »óÅ·Π¸¸µç´Ù. µµÇü Ãß°¡¿¡ ½ÇÆÐÇßÀ¸¸é ¼±ÅÃÀº ÇØÁ¦µÇ°í ¼±Åà ¸ðµå·Î ÀÚµ¿ ÀüȯÇÑ´Ù. µµÇüÀ» ±×¸®´Ù°¡ ¼±ÅÃÅø·Î ÀüȯÇÏ°í ½ÍÀ¸¸é ¸Þ´º¿¡¼­ ¼±Åà µµ±¸·Î ÀüȯÇÒ ÇÊ¿ä¾øÀÌ ¹Ù´ÚÀ» ÇÑ ¹ø ÅоîÁÖµíÀÌ ºó ¿µ¿ªÀ» Ŭ¸¯Çϱ⸸ ÇÏ¸é µÈ´Ù.

ÀÌ·± ¹æ¹ý ¿Ü¿¡ µµÇü Çϳª¸¦ ±×¸° ÈÄ ÀÚµ¿À¸·Î ¼±ÅÃÅø·Î ÀüȯÇϵµ·Ï ÇÒ ¼öµµ Àִµ¥ ÀÌ·¸°Ô µÇ¸é µµÇü Ãß°¡ ÈÄ À̵¿À̳ª Å©±â º¯°æÀ» ¹Ù·Î ÇÒ ¼ö ÀÖ¾î Æí¸®Çϱâ´Â ÇÏÁö¸¸ °°Àº ¸ð¾çÀÇ µµÇüÀ» ¹Ýº¹ÀûÀ¸·Î ±×¸± ¶§´Â ¸Å¹ø ÅøÀ» ¼±ÅÃÇØ¾ß ÇϹǷΠ¿ÀÈ÷·Á ºÒÆíÇÑ ¸éµµ ÀÖ´Ù. ¼±ÅÃÅø Àüȯ Á¤Ã¥(Policy)Àº °°Àº µµÇüÀÇ ¹Ýº¹ Ãß°¡ ºóµµ¿¡ µû¶ó °áÁ¤ÇØ¾ß ÇÑ´Ù. °¡Àå ÁÁÀº ¹æ¹ýÀº ¼±ÅÃÅø·Î ÀÚµ¿ ÀüȯÇÏ´Â ¿©·¯ °¡Áö ¹æ¹ýÀ» Á¦°øÇÏ°í »ç¿ëÀÚ°¡ Çʿ信 µû¶ó ¿É¼ÇÀ» ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.