ApiDraw02 ¿¹Á¦´Â È¸é º¹±¸¸¦ ÇÏÁö ¾Ê´Â´Ù. ¸¶¿ì½º µ¿ÀÛÀ¸·ÎºÎÅÍ µµÇüÀ» ±×¸®±â´Â ÇÏÁö¸¸ ÀÌ Á¤º¸¸¦ µû·Î ÀúÀåÇÏÁö ¾Ê±â ¶§¹®¿¡ ´Ù¸¥ À©µµ¿ì¿¡ ÀÇÇØ µµÇüÀÌ Áö¿öÁ®µµ ´Ù½Ã ±×¸± ¹æ¹ýÀÌ ¾ø´Ù. ȸéÀ» º¹±¸Çϱâ À§Çؼ´Â ±×·ÁÁø µµÇü¿¡ ´ëÇÑ Á¤º¸¸¦ ±â¾ïÇØ µÎ°í WM_PAINT¿¡¼ ÀÌ Á¤º¸¸¦ ¹ÙÅÁÀ¸·Î ´Ù½Ã ±×¸®±â¸¦ ÇØ¾ß ÇÑ´Ù.
ÀÌ ÇÁ·Î±×·¥ÀÌ »ý¼ºÇÏ´Â Á¤º¸´Â µµÇüµéÀÇ ÁýÇÕÀ̹ǷΠµ¿ÀÏÇÑ Å¸ÀÔÀÇ º¯¼ö ÁýÇÕÀ» ´Ù·ê ¼ö ÀÖ´Â ÀÚ·á ±¸Á¶¸¦ ¼±ÅÃÇØ¾ß ÇÑ´Ù. »ý¼º °¡´ÉÇÑ µµÇüÀÇ ÃÖ´ë °³¼ö°¡ Á¤ÇØÁ® ÀÖÁö ¾ÊÀ¸¹Ç·Î ÀÓÀÇÀÇ °³¼ö¿¡ ´ëÇÑ Á¤º¸¸¦ ´Ù·ê ¼ö ÀÖ¾î¾ß Çϴµ¥ ÀÌ·± ¿ëµµ·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ÀÚ·á ±¸Á¶¿¡´Â µ¿Àû ¹è¿°ú ¿¬°á ¸®½ºÆ®°¡ ÀÖ´Ù. µÑ Áß ¾î¶² °ÍÀ» »ç¿ëÇϵçÁö »ó°ü¾øÁö¸¸ ÀÌ ÇÁ·Î±×·¥ÀÇ °æ¿ì´Â »ðÀÔ, »èÁ¦º¸´Ù´Â Àб⠵¿ÀÛÀÌ ÈξÀ ´õ ºó¹øÇÏ°í »õ·Î¿î µµÇüÀº Á¦ÀÏ ³¡¿¡ Ãß°¡µÇ¹Ç·Î µ¿Àû ¹è¿ÀÌ À¯¸®ÇÏ´Ù.
µ¿Àû ¹è¿¿¡ ´ëÇÑ ¼Ò½º´Â ¸¹ÀÌ °ø°³µÇ¾î ÀÖ°í »ç¿ëÇÏ±â Æí¸®ÇÑ C++°´Ã¼·Îµµ ÀÛ¼ºµÇ¾î ÀÖÁö¸¸ ¿©±â¼´Â Á÷Á¢ Äڵ带 ÀÛ¼ºÇØ º¸±â·Î ÇÑ´Ù. °´Ã¼´Â »ç¿ëÇÏ±â Æí¸®ÇÏÁö¸¸ ³»ºÎ¸¦ ¼û±â±â ¶§¹®¿¡ ÇнÀÇÒ ¶§´Â ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù. °ø°³µÈ µ¿Àû ¹è¿ ÇÔ¼ö ÁýÇÕµµ ¸¹ÀÌ Àִµ¥ °¡Á®´Ù ¾µ ¼öµµ ÀÖÁö¸¸ ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ¸Â°Ô ÃÖÀûÈµÈ Äڵ带 ÀÛ¼ºÇÏ´Â °ÍÀÌ ¼º´É»ó À¯¸®ÇϹǷΠÀÌ ½Ç½À¿¡¼´Â óÀ½ºÎÅÍ µ¿Àû ¹è¿À» Á÷Á¢ ¸¸µé±â·Î ÇÑ´Ù. ApiDraw02 ¿¹Á¦ÀÇ µð·ºÅ丮¸¦ Åëä·Î º¹»çÇØ¼ µð·ºÅ丮 À̸§¸¸ ApiDraw03À¸·Î ¹Ù²Û ÈÄ ±×¸®±â Á¤º¸¸¦ ÀúÀåÇØ º¸ÀÚ. ´ÙÀ½ ŸÀÔ°ú º¯¼ö¸¦ Ãß°¡ÇÑ´Ù.
struct DObject
{
DTool Type;
RECT rt;
};
DObject **arObj;
int arSize;
int arNum;
int arGrowBy;
DObject ±¸Á¶Ã¼°¡ µµÇü Çϳª¿¡ Á¤º¸¸¦ °¡Áø´Ù. TypeÀº µµÇüÀÇ Á¾·ù¸¦ Ç¥½ÃÇÏ´Â ¿°ÅÇü ¸â¹öÀÌ¸ç ±×¸®±â µµ±¸ÀÇ ¿°Å°ªÀ» ±×´ë·Î ÀúÀåÇÑ´Ù. rt ¸â¹ö´Â µµÇüÀÌ Â÷ÁöÇϰí ÀÖ´Â ¿µ¿ªÀε¥ ÇöÀç ÀÌ ÇÁ·Î±×·¥ÀÌ ±×¸± ¼ö ÀÖ´Â Á÷¼±, Ÿ¿ø, »ç°¢ÇüÀº ¸ðµÎ µÎ °³ÀÇ Á¡À¸·Î ±¸¼ºµÇ¹Ç·Î »ç°¢Çü Çϳª·Î Ç¥ÇöÇÒ ¼ö ÀÖ´Ù. °´Ã¼ÀÇ ¼Ó¼ºÀ̳ª Á¾·ù°¡ ´Ã¾î³ª¸é ÀÌ ±¸Á¶Ã¼ÀÇ ¸â¹ö°¡ ´Ã¾î³ª°Ô µÉ °ÍÀÌ´Ù.
arObj´Â DObject ±¸Á¶Ã¼¸¦ ÀúÀåÇÏ´Â µ¿Àû ¹è¿ÀÇ Æ÷ÀÎÅÍÀÌ´Ù. DObject ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ´Â ¹è¿À̸ç ÀÌ ¹è¿ÀÌ ½ÇÇàÁß¿¡ µ¿ÀûÀ¸·Î ÇÒ´çµÇ¾î¾ß ÇϹǷΠÀÌÁß Æ÷ÀÎÅÍ·Î ¼±¾ðµÇ¾î ÀÖ´Ù. arSize´Â ÀÌ ¹è¿ÀÌ ÇÒ´çµÈ Å©±âÀ̸ç arNumÀº ¹è¿¿¡ ÀúÀåµÈ µµÇüÀÇ °³¼öÀ̰í arGrowBy´Â ¹è¿ÀÌ ÀçÇÒ´çµÉ ¶§ÀÇ ¿©À¯ºÐÀÌ´Ù. ¼¼ °³ÀÇ µµÇüÀÌ ±×·ÁÁ® ÀÖ´Â »óŶó¸é arObj´Â ´ÙÀ½°ú °°Àº ¸ð¾çÀÌ µÉ °ÍÀÌ´Ù.
ÀÌ º¯¼öµéÀº OnCreate¿¡¼ ÃʱâÈÇÑ´Ù.
LRESULT OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
NowTool=DT_LINE;
DragMode=DM_NONE;
arSize=100;
arNum=0;
arGrowBy=50;
arObj=(DObject **)malloc(sizeof(DObject *)*arSize);
return 0;
}
¹è¿ÀÇ Ãʱâ Å©±â´Â ÀÏ´Ü 100À¸·Î ¼³Á¤ÇÏ¿© 100°³ÀÇ µµÇü Á¤º¸¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â °ø°£À» ¸¶·ÃÇß´Ù. ¹°·Ð ÀÌ Å©±â´Â ¾îµð±îÁö³ª Ãʱâ Å©±âÀÏ »ÓÀÌ¸ç µµÇüÀÌ 100°³¸¦ ³ÑÀ¸¸é arGrowBy°ªÀÎ 50°³ ´ÜÀ§·Î ¹è¿ÀÌ °è¼Ó È®ÀåµÈ´Ù. ÃÖÃÊ µµÇüÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾ÊÀ¸¹Ç·Î arNumÀº 0À¸·Î ÃʱâÈÇß´Ù. OnDestroy¿¡¼ ÀÌ ¹è¿À» ÇØÁ¦ÇÑ´Ù.
LRESULT OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int idx;
for (idx=0;idx<arNum;idx++) {
free(arObj[idx]);
}
free(arObj);
return 0;
}
arObj´Â ±¸Á¶Ã¼ÀÇ ¹è¿ÀÌ ¾Æ´Ï¶ó ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ ¹è¿À̹ǷΠ°¢ ¿ä¼Ò°¡ °¡¸®Å°´Â ¹øÁöÀÇ ±¸Á¶Ã¼¸¦ ¸ÕÀú ÇØÁ¦ÇÏ°í ¹è¿ ÀÚü¸¦ ÇØÁ¦ÇØ¾ß ÇÑ´Ù. ¸¸¾à ±¸Á¶Ã¼¸¦ µû·Î ÇØÁ¦ÇÏÁö ¾Ê°í arObj¸¸ ÇØÁ¦ÇØ ¹ö¸®¸é ¸Þ¸ð¸® ´©¼ö°¡ ¹ß»ýÇÒ °ÍÀ̸ç ÇÒ´çµÈ ±¸Á¶Ã¼¿¡´Â ´õ ÀÌ»ó Á¢±ÙÇÒ ¼ö ¾ø°Ô µÈ´Ù. °´Ã¼°¡ Ãß°¡µÉ ¶§ °´Ã¼¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÌ ¹è¿¿¡ ÀÛ¼ºÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ¹è¿ ³¡¿¡ »õ·Î »ý¼ºµÈ °´Ã¼¸¦ Ãß°¡ÇÑ´Ù. »õ·Î¿î ÇÔ¼ö¸¦ ÀÛ¼ºÇßÀ¸¸é Ç×»ó ¼Ò½º ¼±µÎ¿¡ ¿øÇüµµ °°ÀÌ ¼±¾ðÇϵµ·Ï ÇÏÀÚ.
// ÀÏ¹Ý ÇÔ¼ö
BOOL AppendObject(DTool Type,int x1,int y1,int x2,int y2)
{
if (Type == DT_LINE) {
if (x1 == x2 && y1 == y2) {
return FALSE;
}
} else {
if (x1 == x2 || y1 == y2) {
return FALSE;
}
}
if (arNum >= arSize) {
arSize+=arGrowBy;
arObj=(DObject **)realloc(arObj,sizeof(DObject *)*arSize);
}
arObj[arNum]=(DObject *)malloc(sizeof(DObject));
arObj[arNum]->Type=Type;
SetRect(&arObj[arNum]->rt,x1,y1,x2,y2);
arNum++;
return TRUE;
}
BOOL AppendObject(DTool Type,RECT *prt)
{
return AppendObject(Type,prt->left,prt->top,prt->right,prt->bottom);
}
AppendObject´Â °´Ã¼ÀÇ Å¸ÀÔ°ú ÁÂÇ¥¸¦ Àμö·Î Àü´Þ¹ÞÀ¸¸ç ÀÌ Á¤º¸·ÎºÎÅÍ DObject ±¸Á¶Ã¼ Çϳª¸¦ ÇÒ´çÇÏ¿© ±× Æ÷ÀÎÅ͸¦ ¹è¿¿¡ Ãß°¡ÇÑ´Ù. ¹è¿ °ø°£ÀÌ ºÎÁ·ÇÒ °æ¿ì ¾à°£ÀÇ ¿©À¯ºÐ±îÁö ´õÇØ ÀçÇÒ´çÇÏ¿© ´Ã¸®´Â 󸮵µ Çϰí ÀÖÀ¸¹Ç·Î ¾ó¸¶µçÁö ¸¹Àº °´Ã¼¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù. °´Ã¼ÀÇ ÁÂÇ¥´Â LTRB¸¦ Á÷Á¢ Àü´Þ¹ÞÀ» ¼öµµ ÀÖ°í ¾Æ´Ï¸é RECTÇü ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅͷεµ ¹ÞÀ» ¼ö ÀÖµµ·Ï µÎ °¡Áö ÇüÅÂÀÇ ÇÔ¼ö¸¦ Á¤ÀÇÇß´Ù.
ÇÔ¼ö ¼±µÎ¿¡ ÀÖ´Â Á¶°Ç¹®Àº ºó µµÇüÀ» »ðÀÔÇÏÁö ¾Êµµ·Ï ÇÏ´Â ÀÏÁ¾ÀÇ ¿¹¿Üó¸®Àε¥ º¸ÀÌÁöµµ ¾Ê´Â µµÇüÀ» ¹è¿¿¡ Ãß°¡ÇÒ ÇÊ¿ä´Â ¾ø±â ¶§¹®ÀÌ´Ù. Á÷¼±Àº ¼öÆò, ¼öÁ÷ Áß Çϳª°¡ ´Ù¸£¸é µÇÁö¸¸ Ÿ¿ø°ú »ç°¢ÇüÀº µÑ ´Ù ´Þ¶ó¾ß ÇÑ´Ù. ³ôÀ̳ª ÆøÀÌ 0À̸é Á¸ÀçÇÒ ¼ö ¾ø´Â °´Ã¼À̹ǷΠÀÌ·± °´Ã¼¸¦ ¹è¿¿¡ »ðÀÔÇØ¼´Â ¾ÈµÈ´Ù. »ðÀÔÇØµµ ¾îÂ÷ÇÇ º¸ÀÌÁö ¾ÊÀ¸¹Ç·Î ¸»½éÀÌ µÇÁö´Â ¾Ê°ÚÁö¸¸ ±¦È÷ ¸Þ¸ð¸®¸¸ Ãà³»°í ½ÇÇà ¼Óµµ¸¸ ´À·ÁÁø´Ù. µµÇüÀÌ ¹è¿¿¡ ½ÇÁ¦·Î Ãß°¡µÇ´Â ½ÃÁ¡Àº ±×¸®±â¸¦ ¸¶Ä¡°í ¸¶¿ì½º ¹öưÀ» ³õÀ» ¶§ÀÌ´Ù.
LRESULT OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
if (DragMode==DM_DRAW) {
AppendObject(NowTool,sx,sy,oldx,oldy);
InvalidateRect(hWnd,NULL,TRUE);
}
DragMode=DM_NONE;
ReleaseCapture();
return 0;
}
±×¸®±â°¡ ³¡³ª¸é È®Á¤µÈ ÁÂÇ¥´ë·Î µµÇüÀ» ¹è¿¿¡ Ãß°¡Çϰí ÀÛ¾÷ ¿µ¿ªÀ» ¹«È¿ÈÇÏ¿© Ãß°¡µÈ µµÇüÀ» ȸ鿡 ±×¸®µµ·Ï Çß´Ù. ÀÌÁ¦ ±×·ÁÁö´Â µµÇü¿¡ ´ëÇÑ ¸ðµç Á¤º¸°¡ arObj ¹è¿¿¡ ¿ÏÀüÇÏ°Ô ÀÛ¼ºµÇ¹Ç·Î OnPaint¿¡¼ ÀúÀåµÈ µµÇüÀ» ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù.
LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int idx;
hdc=BeginPaint(hWnd, &ps);
for (idx=0;idx<arNum;idx++) {
switch (arObj[idx]->Type) {
case DT_LINE:
MoveToEx(hdc,arObj[idx]->rt.left,arObj[idx]->rt.top,NULL);
LineTo(hdc,arObj[idx]->rt.right,arObj[idx]->rt.bottom);
break;
case DT_ELLIPSE:
Ellipse(hdc,arObj[idx]->rt.left,arObj[idx]->rt.top,
arObj[idx]->rt.right,arObj[idx]->rt.bottom);
break;
case DT_RECTANGLE:
Rectangle(hdc,arObj[idx]->rt.left,arObj[idx]->rt.top,
arObj[idx]->rt.right,arObj[idx]->rt.bottom);
break;
}
}
EndPaint(hWnd, &ps);
return 0;
}
arObj ¹è¿ÀÇ Ã³À½ºÎÅÍ µµÇüÀÇ °³¼öÀÎ arNum±îÁö ¼øÈ¸ÇÏ¸é¼ °¢ µµÇüÀÇ Å¸ÀÔ¿¡ µû¶ó Àû´çÇÑ ÀÛµµ ÇÔ¼ö·Î µµÇüÀ» ±×¸®¸é µÈ´Ù. OnPaint¿¡¼ ȸéÀ» º¹±¸Çϰí ÀÖÀ¸¹Ç·Î ȸéÀÌ °¡·ÁÁö°Å³ª ÃÖ¼ÒȵǾú´Ù°¡ º¹±¸ µÇ´õ¶óµµ Çѹø ±×·Á ³õÀº µµÇüÀº Ç×»ó ±× ÀÚ¸®¿¡ ÀÖÀ» °ÍÀÌ´Ù. À©µµ¿ìÁî ÇÁ·Î±×·¥Àº ÀÌ·± ½ÄÀ¸·Î Ç×»ó ȸéÀ» ´Ù½Ã ±×¸± ¼ö ÀÖ´Â ¿Ïº®ÇÑ Á¤º¸¸¦ ÀúÀåÇØ¾ß ÇÑ´Ù.