¶ó.±×¸®±â Á¤º¸ÀÇ ÀúÀå

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¿¡¼­ È­¸éÀ» º¹±¸ÇÏ°í ÀÖÀ¸¹Ç·Î È­¸éÀÌ °¡·ÁÁö°Å³ª ÃÖ¼ÒÈ­µÇ¾ú´Ù°¡ º¹±¸ µÇ´õ¶óµµ Çѹø ±×·Á ³õÀº µµÇüÀº Ç×»ó ±× ÀÚ¸®¿¡ ÀÖÀ» °ÍÀÌ´Ù. À©µµ¿ìÁî ÇÁ·Î±×·¥Àº ÀÌ·± ½ÄÀ¸·Î Ç×»ó È­¸éÀ» ´Ù½Ã ±×¸± ¼ö ÀÖ´Â ¿Ïº®ÇÑ Á¤º¸¸¦ ÀúÀåÇØ¾ß ÇÑ´Ù.