´Ù.¼±ÅÃÀÇ Á¤È®µµ Çâ»ó

ApiDraw´Â µµÇüÀÇ Á¾·ù¿¡ »ó°ü¾øÀÌ 8°³ÀÇ Æ®·¡Ä¿¸¦ ±×¸®´Âµ¥ Á÷¼±ÀÇ °æ¿ì´Â ÀÌ Æ®·¡Ä¿°¡ ´Ù¼Ò ¾î¿ï¸®Áö ¾Ê´Â´Ù. Á÷¼±ÀÇ ³¡ÀÌ ¾Æ´Ñ ¸ð¼­¸®¸¦ ²ø¾î¼­ Á÷¼±ÀÇ Å©±â³ª ¸ð¾çÀ» º¯°æÇÒ ¼ö Àִµ¥ ÀÌ·± µ¿ÀÛÀÌ »ó´çÈ÷ ºÎÀÚ¿¬½º·¯¿ö º¸ÀδÙ. ±×·¡¼­ Á÷¼±ÀÇ °æ¿ì´Â ¾ç ³¡¿¡ µÎ °³ÀÇ Æ®·¡Ä¿¸¸ ±×¸®µµ·Ï ¼öÁ¤ÇØ º¸ÀÚ. Æ®·¡Ä¿ÀÇ ¿µ¿ªÀ» ±¸ÇÏ´Â GetTrackerRect ÇÔ¼ö¸¦ ¼öÁ¤ÇÏ¸é µÈ´Ù.

 

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

{

   ....

   if (arObj[idx]->Type == DT_LINE) {

      if ((arObj[idx]->Flag & 03) == DS_LT || (arObj[idx]->Flag & 03) == DS_RB) {

          if (nTrack != 1 && nTrack != 8) {

             SetRect(trt,0,0,0,0);

          }

      }

      if ((arObj[idx]->Flag & 03) == DS_RT || (arObj[idx]->Flag & 03) == DS_LB) {

          if (nTrack != 3 && nTrack != 6) {

             SetRect(trt,0,0,0,0);

          }

      }

   }

}

 

Á÷¼±ÀÎ °æ¿ì´Â ¹æÇâ¿¡ µû¶ó µÎ °³ÀÇ Æ®·¡Ä¿¸¸ ³²±â°í ³ª¸ÓÁö Æ®·¡Ä¿ÀÇ ¿µ¿ªÀº ¸ðµÎ 0ÀÌ µÇµµ·Ï Çß´Ù. Æ®·¡Ä¿ÀÇ Å©±â°¡ 0À̹ǷΠÀÌ Æ®·¡Ä¿´Â ±×·Á ºÁ¾ß È­¸é¿¡ º¸ÀÌÁö ¾ÊÀ¸¸ç È÷Æ® Å×½ºÆ®µµ Ç×»ó ½ÇÆÐÇÑ´Ù. µû¶ó¼­ OnPaint³ª TrackerHitTest ÇÔ¼öÀÇ ÄÚµå´Â ¼öÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.

´ÙÀ½Àº ¼±ÅÃÀÇ Á¤È®µµ¸¦ Á¶±Ý ³ô¿© º¸ÀÚ. »ç°¢À̳ª ºñÆ®¸ÊÀº Á÷»ç°¢Çü ¸ð¾çÀ» Çϰí ÀÖÀ¸¹Ç·Î µµÇüÀÌ Â÷ÁöÇϰí ÀÖ´Â ¿µ¿ª¾ÈÀÇ ¾Æ¹« °÷À̳ª Ŭ¸¯Çصµ ¼±ÅõǴ °ÍÀÌ ¿ÇÁö¸¸ Ÿ¿øÀ̳ª Á÷¼±Àº ±×·¸Áö ¾Ê´Ù. Ÿ¿øÀÇ ¹Ù±ùÂÊÀÌ¶óµµ ¿ÜÁ¢ »ç°¢ÇüÀ» Ŭ¸¯ÇÏ¸é ¼±ÅõǴµ¥ Ÿ¿ø¸¸ ÀÖÀ» ¶§´Â ÀÌ·± ¼±ÅÃÀÌ ÀÌ»óÇÏ°Ô º¸ÀÌÁö ¾ÊÁö¸¸ Ÿ¿ø µÚÂÊÀÇ ´Ù¸¥ µµÇüÀ» ¼±ÅÃÇϰíÀÚ ÇÒ ¶§´Â ´Ù¼Ò ºÒÆíÇÒ ¼öµµ ÀÖ´Ù. Á¤È®ÇÏ°Ô Å¸¿ø ¾ÈÂÊ¿¡ ÀÖÀ» ¶§¸¸ ¼±ÅÃÇϵµ·Ï FindObject ÇÔ¼ö¸¦ ¼öÁ¤ÇØ º¸ÀÚ.

 

struct ddapack {

   int x,y;

   int offset;

};

void CALLBACK lineproc(int x,int y,LPARAM lParam)

{

   ddapack *pack=(ddapack *)lParam;

   int offset;

 

   offset=(int)hypot(x-pack->x,y-pack->y);

   pack->offset=min(pack->offset,offset);

}

 

int FindObject(int x, int y)

{

   int idx;

   POINT pt;

   HRGN hRgn;

   BOOL bIn;

   ddapack pack;

   RECT temprt;

 

   pt.x=x;

   pt.y=y;

   for (idx=arNum-1;idx>=0;idx--) {

      temprt=arObj[idx]->rt;

      InflateRect(&temprt,3,3);

      if (PtInRect(&temprt,pt)==TRUE) {

          switch (arObj[idx]->Type) {

          case DT_LINE:

             pack.x=x;

             pack.y=y;

             pack.offset=100;

             if ((arObj[idx]->Flag & 03) == DS_LT || (arObj[idx]->Flag & 03) == DS_RB) {

                LineDDA(arObj[idx]->rt.left, arObj[idx]->rt.top,arObj[idx]->rt.right,

                   arObj[idx]->rt.bottom,lineproc,(LPARAM)&pack);

             } else {

                LineDDA(arObj[idx]->rt.right, arObj[idx]->rt.top,arObj[idx]->rt.left,

                   arObj[idx]->rt.bottom,lineproc,(LPARAM)&pack);

             }

             if (pack.offset <= 4) {

                return idx;

             }

             break;

          case DT_ELLIPSE:

             hRgn=CreateEllipticRgn(arObj[idx]->rt.left, arObj[idx]->rt.top,

                arObj[idx]->rt.right,arObj[idx]->rt.bottom);

             bIn=PtInRegion(hRgn,x,y);

             DeleteObject(hRgn);

             if (bIn) return idx;

             break;

          default:

             if (PtInRect(&arObj[idx]->rt,pt)==TRUE) {

                return idx;

             }

             break;

          }

      }

   }

   return -1;

}

 

Ÿ¿øÀÎ °æ¿ì´Â Ÿ¿ø ¿µ¿ª°ú ÀÏÄ¡ÇÏ´Â ¸®ÀüÀ» »ý¼ºÇÑ ÈÄ PtInRegion ÇÔ¼ö·Î Ŭ¸¯ÇÑ ÁöÁ¡ÀÌ Å¸¿øÀÇ ¾ÈÂÊÀÎÁö ¾Æ´ÑÁö¸¦ Á¡°ËÇß´Ù. ¸®ÀüÀº º¹ÀâÇÑ ¸ð¾ç¿¡ ´ëÇØ¼­µµ È÷Æ® Å×½ºÆ®¸¦ Á¤È®ÇÏ°Ô ¼öÇàÇÑ´Ù. Á÷¼±ÀÇ °æ¿ì´Â Á» ´Ù¸¥ ¹æ½ÄÀ» µµÀÔÇߴµ¥ Á÷¼±°ú Ŭ¸¯ÇÑ Á¡ÀÇ ÁÂÇ¥°£ÀÇ ±ÙÁ¢ °Å¸®¸¦ ±¸ÇØ ÀÌ °Å¸®°¡ 4ÀÌÇÏÀÏ ¶§ ¼±ÅÃÇÑ °ÍÀ¸·Î ÀÎÁ¤ÇÑ´Ù. Á¤È®ÇÏ°Ô Á÷¼± À§¸¦ Ŭ¸¯Çϱ⠾î·Á¿ì¹Ç·Î ¾à°£ÀÇ ¿©À¯ºÐÀ» µÎ¾î Á÷¼±°ú °¡±î¿î °Å¸®¸¦ ÂïÀ» ¶§µµ ¼±ÅÃÇÏ´Â °ÍÀÌ ´õ Æí¸®ÇÏ´Ù.

Á÷¼±°ú Ŭ¸¯ÇÑ ÁÂÇ¥¿ÍÀÇ °Å¸®¸¦ ±¸ÇÏ´Â ¹æ¹ýÀº ¿©·¯ °¡Áö°¡ Àִµ¥ ÀÌ ¿¹Á¦´Â LineDDA ÇÔ¼ö·Î Á÷¼±À» ±¸¼ºÇÏ´Â ¸ðµç Á¡°úÀÇ °Å¸®¸¦ ±¸ÇÑ ÈÄ ±× Áß °¡Àå °¡±î¿î °Å¸®¸¦ ÃëÇÏ´Â ¹æ¹ýÀ» ¼±ÅÃÇß´Ù. ÀÌ ¹æ¹ýº¸´Ù ¼öÇÐÀûÀ¸·Î Á» ´õ °£´ÜÇÏ°í ½¬¿î ¹æ¹ýµµ ÀÖÁö¸¸ LineDDA ÇÔ¼ö¸¦ ÀÌ·± ½ÄÀ¸·Î »ç¿ëÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀ» º¸¿©ÁÖ±â À§ÇØ ÀϺη¯ API ÇÔ¼ö¸¦ »ç¿ëÇØ º¸¾Ò´Ù.

Á÷¼±°ú Ÿ¿øÀÇ °æ¿ì ¼±Åà Á¡°Ë¿¡ ´Ù¼Ò ½Ã°£ÀÌ ¼Ò¸ðµÇ¹Ç·Î ¸ðµç Á÷¼±°ú Ÿ¿ø¿¡ ´ëÇØ ÀÌ Äڵ带 ½ÇÇàÇÏÁö ¾Ê°í ÀÏ´Ü PtInRect·Î ¿µ¿ª ¾ÈÀÎÁö¸¦ ¸ÕÀú Á¡°ËÇÑ ÈÄ ¼¼ºÎÀûÀÎ Á¡°Ë ·çƾÀ» ½ÇÇàÇϵµ·Ï Çß´Ù. ±×·¡¼­ ¿µ¿ªÀÇ ¾ÈÂÊÀÌ ¾Æ´Ñ µµÇü¿¡ ´ëÇØ¼­´Â ¸®ÀüÀ» ¸¸µé°Å³ª Äݹé ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ºÒÇÊ¿äÇÑ Ã³¸®¸¦ ÇÏÁö ¾Ê´Â´Ù. ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ¸¸é ¹®¼­¿¡ Á÷¼±ÀÌ ¾ÆÁÖ ¸¹À» °æ¿ì ¼±Åÿ¡ ½Ã°£ÀÌ ³Ê¹« ¿À·¡ °É¸± °ÍÀÌ´Ù.

±×·¡¼­ °¢ µµÇü¿¡ ´ëÇØ ¸®Àü Á¡°ËÀ» Çϱâ Àü¿¡ ´ëÃæÀÇ °Ë»ç¸¦ ¸ÕÀú Çϴµ¥ µµÇüÀÇ »ç°¢ ¿µ¿ªÀ» 3Çȼ¿¾¿ ¹Ù±ùÀ¸·Î È®ÀåÇÏ¿© ÀÌ ¿µ¿ª ¾È¿¡ ÀÖÀ» ¶§¸¸ ¸®Àü Á¡°ËÀ» Çϵµ·Ï Çß´Ù. 3Çȼ¿¾¿ È®ÀåÇÑ ÈÄ Á¡°ËÇÏ´Â ÀÌÀ¯´Â ¼öÆò, ¼öÁ÷¼±ÀÇ °æ¿ì Æø°ú ³ôÀ̰¡ 0À̱⠶§¹®¿¡ ¾î¶² Á¡µµ ÀÌ ¾ÈÂÊ¿¡ Á¸ÀçÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ÀÌ Á¡°ËÀº ¾îµð±îÁö³ª ´ëÃæÀÇ Á¡°ËÀÏ »ÓÀ̸ç ÀÌ Á¶°ÇÀÌ ¸¸Á·ÇÒ ¶§ ¾Æ·¡ÂÊÀÇ switch ¹®¿¡¼­ ´Ù½Ã Çѹø ´õ Á¤¹Ð Á¡°ËÀ» Çϵµ·Ï Çß´Ù.