¿©±â±îÁö Äڵ带 ÀÛ¼ºÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é ApiDrawÀÇ ¼±Åà Äڵ忡 ¾à°£ÀÇ ¹®Á¦°¡ ÀÖÀ½À» ¹ß°ßÇÒ ¼ö ÀÖ´Ù. µµÇüÀ» ±×¸± ¶§ ÈçÈ÷ ¸¶¿ì½º¸¦ Á»ó´Ü¿¡¼ ¿ìÇÏ´ÜÀ¸·Î µå·¡±×Çϴµ¥ ÀÌ °æ¿ì´Â µµÇüÀÇ ¿µ¿ªÀÌ Á¤±ÔȵǾî ÀÖÀ¸¹Ç·Î ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. ±×·¯³ª µå·¡±× ¹æÇâÀ» ¹Ù²Ù¸é ÀÌ µµÇüÀº ¼±ÅõÇÁö ¾Ê´Â´Ù. ¿Ö ±×·±Áö ±×¸²À¸·Î ¼³¸íÇØ º¸ÀÚ.
ApiDrawÀÇ ¸¶¿ì½º Çڵ鷯µéÀº ÃÖÃÊ Å¬¸¯ÇÑ ÁöÁ¡À» Á»ó´ÜÀ¸·Î ÇÏ°í ¸¶¿ì½º ¹öưÀ» ³õÀº ÁöÁ¡À» ¿ìÇÏ´ÜÀ¸·Î ±â·ÏÇϴµ¥ Á»ó´Ü¿¡¼ ¿ìÇÏ´ÜÀ¸·Î µå·¡±×ÇÑ °æ¿ì´Â ÀÌ »ç°¢ÇüÀÇ ¸ð¾çÀÌ Á¤»óÀûÀÌÁö¸¸ ¹Ý´ë·Î ¿ìÇÏ´Ü¿¡¼ Á»ó´ÜÀ¸·Î µå·¡±×¸¦ ÇÑ °æ¿ì´Â left°¡ rightº¸´Ù ´õ ¿À¸¥ÂÊ¿¡ ÀÖ°í topÀÌ bottomº¸´Ù ´õ ¾Æ·¡¿¡ ÀÖ´Â ºñÁ¤»óÀûÀÎ »ç°¢ÇüÀÌ ¸¸µé¾îÁø´Ù. ÀÌ·± °æ¿ì¶óµµ Rectangle, Ellipse ÇÔ¼öµéÀº ÁÂÇ¥¸¦ Á¶Á¤ÇÑ ÈÄ ±×¸®µµ·Ï µÇ¾î ÀÖ¾î µµÇüÀº Á¦´ë·Î Ãâ·ÂµÈ´Ù. ±×·¯³ª »ç°¢ ¿µ¿ª¾È¿¡ Á¡ÀÌ Æ÷ÇԵǾî ÀÖ´ÂÁö¸¦ Á¶»çÇÏ´Â PtInRect ÇÔ¼ö´Â ±×·¸Áö ¸øÇØ Á¤±ÔÈµÈ »ç°¢Çü¸¸À» Àμö·Î ¿ä±¸ÇÑ´Ù. ÀÌ ÇÔ¼öÀÇ ³»ºÎ ÄÚµå´Â ¾Æ¸¶ ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.
if (prt->left < pt.x && prt->right > pt.x && prt->top < pt.y && prt->bottom > pt.y)
return TRUE;
else
return FALSE;
pt.x°¡ left¿Í right »çÀÌ¿¡ ÀÖ°í pt.y°¡ top°ú bottom »çÀÌ¿¡ ÀÖÀ» ¶§¸¸ ÀÌ Á¡ÀÌ »ç°¢ ¿µ¿ª ³»ºÎ¿¡ ÀÖ´Ù°í ÆÇ´ÜÇÑ´Ù. ÀÌ Á¶°ÇÀ» ¸¸Á·ÇÏ·Á¸é left°¡ rightº¸´Ù ¿ÞÂÊ¿¡ ÀÖ°í topÀÌ bottomº¸´Ù´Â ´õ À§ÂÊ¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ±×·±µ¥ µå·¡±× ¹æÇâÀ» ¹Ù²Ù¾î ¹ö¸®¸é ÀÌ Á¶°ÇÀ» Àý´ë·Î ¸¸Á·ÇÒ ¼ö ¾ø´Ù. leftº¸´Ù ´õ Å« x°¡ leftº¸´Ù ´õ ÀÛÀº rightº¸´Ù °áÄÚ ´õ ÀÛÀ» ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.
PtInRect ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ »ç°¢ÇüÀÌ Á¤±ÔȵǾî ÀÖ´Ù°í °¡Á¤Çϱ⠶§¹®¿¡ ÀÌ ÇÔ¼ö¸¦ °è¼Ó »ç¿ëÇÏ·Á¸é Á¤±ÔÈ Á¶°ÇÀ» ¸¸Á·½ÃÄÑ¾ß ÇÑ´Ù. µµÇüÀÇ ¿µ¿ªÀÌ °áÁ¤µÇ´Â ½ÃÁ¡Àº AppendObject ÇÔ¼ö¿¡¼À̹ǷΠÀÌ ÇÔ¼ö¿¡¼ Àü´ÞµÈ ÁÂÇ¥¸¦ ¹Ù·Î ´ëÀÔÇÏÁö ¸»°í Á¤±ÔÈÇÑ ÈÄ ´ëÀÔÇϸé ÀÏ´Ü ¹®Á¦°¡ ÇØ°áµÈ´Ù.
BOOL AppendObject(DTool Type,int x1,int y1,int x2,int y2)
{
....
arObj[arNum]=(DObject *)malloc(sizeof(DObject));
arObj[arNum]->Type=Type;
SetRect(&arObj[arNum]->rt,x1,y1,x2,y2);
arObj[arNum]->rt.left=min(x1,x2);
arObj[arNum]->rt.right=max(x1,x2);
arObj[arNum]->rt.top=min(y1,y2);
arObj[arNum]->rt.bottom=max(y1,y2);
arNum++;
return TRUE;
}
left´Â x1, x2Áß ÀÛÀº °ªÀ» ÃëÇϰí right´Â x1, x2Áß Å« °ªÀ» ÃëÇϸé Ç×»ó left°¡ rightº¸´Ù ¿ÞÂÊ¿¡ ÀÖ°Ô µÉ °ÍÀÌ´Ù. ¼öÁ÷ÂÊÀ¸·Îµµ ¸¶Âù°¡Áö·Î topÀÌ bottomº¸´Ù Ç×»ó ´õ À§ÂÊ¿¡ ÀÖµµ·Ï Á¶Á¤Çß´Ù. ÀÌ·¸°Ô ÇÏ¸é µå·¡±×ÇÑ ¹æÇâ¿¡ »ó°ü¾øÀÌ »ç°¢ÇüÀº Ç×»ó Á¤±ÔȵǾî Á»ó´Ü¿¡¼ ¿ìÇÏ´ÜÀ¸·Î µå·¡±×ÇÑ °Íó·³ ±â·ÏµÈ´Ù. ´Ù¾çÇÑ ÇüÅ·ΠÁ¸ÀçÇÏ´Â µ¥ÀÌÅ͸¦ Á» ´õ ´Ù·ç±â ½¬¿î ÀÏÁ¤ÇÑ ÇüÅ·Πº¯È¯ÇÏ´Â °ÍÀ» Á¤±ÔÈ(Normalization)¶ó Çϴµ¥ ÇѰ¡Áö ¸ð¾çÀÇ »ç°¢Çü¸¸ Á¸ÀçÇϵµ·Ï ÇÔÀ¸·Î½á ´Ù¸¥ ºÎºÐÀÇ Äڵ尡 ÈξÀ ´õ ´Ü¼øÇØÁø´Ù.
ÀÌ ¹æ¹ý ´ë½Å FindObject¿¡¼ µµÇüÀÇ ¿µ¿ªÀ» »ç¿ëÇÒ ¶§ arObjÀÇ rt¿¡ ´ëÇÑ »çº»À» º¹»çÇÑ ÈÄ »çº»À» Á¤±ÔÈÇÏ¿© ºñ±³ÇÒ ¼öµµ ÀÖ´Ù. AppendObjectÀÇ Äڵ带 Àá½Ã ÁÖ¼® ó¸®ÇØ ³õ°í ´ÙÀ½ Å×½ºÆ® Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ.
int FindObject(int x, int y)
{
int idx;
POINT pt;
RECT trt;
pt.x=x;
pt.y=y;
for (idx=arNum-1;idx>=0;idx--) {
trt.left=min(arObj[idx]->rt.left,arObj[idx]->rt.right);
trt.right=max(arObj[idx]->rt.left,arObj[idx]->rt.right);
trt.top=min(arObj[idx]->rt.top,arObj[idx]->rt.bottom);
trt.bottom=max(arObj[idx]->rt.top,arObj[idx]->rt.bottom);
if (PtInRect(&trt,pt)==TRUE) {
return idx;
}
}
return -1;
}
ÀÌ·¸°Ô ÇØµµ ÀÏ´ÜÀº Àß µ¿ÀÛÇϴµ¥ ¾îÂ÷ÇÇ °Ë»öÇÒ ¶§ Á¤±ÔȵǹǷΠ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. µµÇüÀ» ±â·ÏÇÒ ¶§ ¾Æ¿¹ Á¤±Ôȸ¦ ÇØ¼ ±â·ÏÇÒ °ÍÀÎÁö ¾Æ´Ï¸é ºñ±³ÇÒ ¶§¸¸ Àá½Ã Á¤±Ôȸ¦ ÇÒ °ÍÀÎÁö°¡ ´Ù¸¥µ¥ ºñ±³ÇÒ ¶§¸¶´Ù Á¤±Ôȸ¦ ÇÏ·Á¸é ±×¸¸Å ¼ÓµµÀÇ ³¶ºñ°¡ ÀÖÀ¸¹Ç·Î ±â·ÏÇÒ ¶§ Á¤±Ôȸ¦ ÇÏ´Â °ÍÀÌ ´õ ÇÕ¸®ÀûÀÌ´Ù. ±â·ÏÀº ¾î¼´Ù ÇѹøÀÌÁö¸¸ °Ë»öÀº ¼±ÅÃ, Ä¿¼ º¯°æ µî ¼ö½Ã·Î ÇØ¾ß ÇϹǷΠ°¡±ÞÀûÀ̸é Ƚ¼ö°¡ ÀÛÀº ÂÊ¿¡¼ Á¤±Ôȸ¦ ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ApiDraw´Â AppendObject¿¡¼ Á¤±Ôȸ¦ ÇÏ´Â ¹æ½ÄÀ» äÅÃÇϱâ·Î ÇÑ´Ù.
ÀÌ·¸°Ô Äڵ带 ¼öÁ¤ÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é Ÿ¿øÀ̳ª »ç°¢ÇüÀº º° ¹®Á¦¾øÀÌ ±×·ÁÁö±âµµ ÇÏ°í ¼±Åõµ Àß µÇÁö¸¸ Á÷¼±ÀÇ °æ¿ì´Â ¹«Á¶°Ç Á¤±ÔÈµÇ¾î ¹ö¸®±â ¶§¹®¿¡ ¿ìÇÏÇâÀÇ Á÷¼±¸¸ ±×·ÁÁø´Ù. Á÷¼±Àº µå·¡±× ¹æÇâ¿¡ µû¶ó ¿ìÇÏÇâ, ÁÂÇÏÇ⠵Π°¡Áö ¸ð¾çÀÌ ÀÖ¾î Á¤±ÔÈ¿¡ µû¸¥ ºÎÀÛ¿ëÀÌ »ý±ä´Ù. ±×·¡¼ Á÷¼±ÀÇ °æ¿ì´Â »ç¿ëÀÚ°¡ ¸¶¿ì½º¸¦ µå·¡±×ÇÑ ¹æÇâÀ» µû·Î ±â¾ïÇØ µÎ°í ¹æÇâ¿¡ µû¶ó µµÇüÀ» ´Ù¸£°Ô ±×·Á¾ß ÇÑ´Ù.
#define DS_LT 0
#define DS_RT 1
#define DS_LB 2
#define DS_RB 3
....
struct DObject
{
DTool Type;
RECT rt;
unsigned short Flag;
};
DS_* ¸ÅÅ©·Î´Â µå·¡±×¸¦ ½ÃÀÛÇÑ ½ÃÀÛÁ¡ÀÌ¸ç °¢ µµÇü¿¡ ÀÌ Á¤º¸¸¦ ±â¾ïÇÏ´Â Flag¶ó´Â ¸â¹ö¸¦ Ãß°¡ÇÑ´Ù. AppendObject¿¡¼ Àü´ÞµÈ ÁÂÇ¥ÀÇ ´ë¼Ò¸¦ Æò°¡ÇÏ¿© µå·¡±×ÇÑ ¹æÇâÀ» ±â·ÏÇϵµ·Ï ÇÑ´Ù.
BOOL AppendObject(DTool Type,int x1,int y1,int x2,int y2)
{
....
arObj[arNum]->rt.left=min(x1,x2);
arObj[arNum]->rt.right=max(x1,x2);
arObj[arNum]->rt.top=min(y1,y2);
arObj[arNum]->rt.bottom=max(y1,y2);
if (x1<x2) {
if (y1<y2) {
arObj[arNum]->Flag=DS_LT;
} else {
arObj[arNum]->Flag=DS_LB;
}
} else {
if (y1<y2) {
arObj[arNum]->Flag=DS_RT;
} else {
arObj[arNum]->Flag=DS_RB;
}
}
arNum++;
return TRUE;
}
ÀÌ·¸°Ô ÇÏ¸é »ç°¢ ¿µ¿ªµµ Á¤±ÔÈµÇ°í µå·¡±×¸¦ ½ÃÀÛÇÑ ÁöÁ¡µµ ¾Ë ¼ö ÀÖ´Ù. OnPaint¿¡¼ Á÷¼±À» ±×¸± ¶§´Â Flag¸¦ ÂüÁ¶Çؼ ¹æÇâÀ» °áÁ¤ÇÑ´Ù.
case DT_LINE:
if ((arObj[idx]->Flag & 0x3) == DS_LT || (arObj[idx]->Flag & 0x3) == DS_RB) {
MoveToEx(hdc,arObj[idx]->rt.left,arObj[idx]->rt.top,NULL);
LineTo(hdc,arObj[idx]->rt.right,arObj[idx]->rt.bottom);
} else {
MoveToEx(hdc,arObj[idx]->rt.left,arObj[idx]->rt.bottom,NULL);
LineTo(hdc,arObj[idx]->rt.right,arObj[idx]->rt.top);
}
break;
DS_LT, DS_RBÀÏ ¶§´Â ¿ìÇÏÇâÀÇ Á÷¼±À» ±×¸®°í DS_LB, DS_RTÀÏ ¶§´Â ¿ì»óÇâÀÇ Á÷¼±À» ±×·È´Ù. Â÷ÈÄ Á÷¼±³¡¿¡ È»ìÇ¥ Àå½ÄÀ» ´Þ°Å³ª ÇÒ ¶§ ÀÌ Á¤º¸°¡ À¯¿ëÇÏ°Ô »ç¿ëµÉ °ÍÀÌ´Ù. Flag ¸â¹ö´Â ÃÑ 16ºñÆ® ±æÀ̸¦ °¡Áö¸ç µå·¡±× ½ÃÀÛÁ¡Àº ±× Áß ÇÏÀ§ 2ºñÆ®¸¸À» »ç¿ëÇϹǷΠ³ª¸ÓÁö 14ºñÆ®´Â µµÇüÀÇ ¶Ç ´Ù¸¥ ¼Ó¼ºÀ» ±â·ÏÇÏ´Â ¿ëµµ·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¡¼ Flag·ÎºÎÅÍ ¹æÇâÀ» ÀÐÀ» ¶§ & 03(ÀÌÁø¼ö·Î 11) ¿¬»êÇÏ¿© ÇÏÀ§ 2ºñÆ®¸¸ Á¡°ËÇÏ¿© Â÷ÈÄ¿¡ »óÀ§ ºñÆ®°¡ ´Ù¸¥ ¿ëµµ·Î »ç¿ëµÇ´õ¶óµµ ¿µÇâÀ» ¹ÞÁö ¾Êµµ·Ï Çß´Ù. AppendObject¿¡¼ Flag¿¡ ´Ù¸¥ °ªµµ °°ÀÌ ±â·ÏÇÏ·Á¸é ÀÌÈĺÎÅÍ ÀÌ °ª¿¡ ¿øÇÏ´Â °ªÀ» ORÇØ¾ß ÇÑ´Ù.