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 ¹®¿¡¼ ´Ù½Ã Çѹø ´õ Á¤¹Ð Á¡°ËÀ» Çϵµ·Ï Çß´Ù.