°¡.¼±ÅÃÇϱâ

ApiDraw04 ÇÁ·ÎÁ§Æ®¿¡¼­´Â ±âº»ÀûÀÎ µµÇüÀÇ ÆíÁý ±â´ÉÀ» ÀÛ¼ºÇØ º»´Ù. ApiDraw´Â ±×¸²À» ±×¸®±â¸¸ ÇÏ´Â ÆäÀÎÆà ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¶ó ±×·ÁÁø µµÇüÀ» ÀÚÀ¯·Ó°Ô À̵¿, Å©±â º¯°æ, Ãß°¡, »èÁ¦ÇÒ ¼ö ÀÖ´Â º¤ÅÍ µå·ÎÀ× ÅøÀÌ´Ù. µå·ÎÀ× Åø°ú ÆäÀÎÆà ÅøÀÇ Â÷ÀÌÁ¡Àº ÀÌ¹Ì ±×·ÁÁø ±×¸²À» ÆíÁýÇÒ ¼ö Àִ°¡ ¾Æ´Ñ°¡Àε¥ ±×¸²ÆÇÀº ±×·ÁÁø µµÇüÀ» ´Ù¸¥ ±×¸²¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê°í ¿Å±â±â ¾î·Æ´Ù. ÀÌ¹Ì ±×·ÁÁ® ÀÖ´Â µµÇüÀ» ÆíÁýÇÏ·Á¸é ¸ÕÀú ´ë»ó µµÇüÀ» ¼±ÅÃÇÏ´Â ±â´ÉºÎÅÍ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¼±ÅÃÀ» ÇÏ´Â ½ÃÁ¡Àº ÀǽÉÀÇ ¿©Áö¾øÀÌ ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´©¸¦ ¶§ÀÌ°í OnPaint¿¡¼­´Â µµÇüÀÌ ¼±ÅõǾî ÀÖ´Ù´Â °ÍÀ» Ç¥½ÃÇØ¾ß ÇÑ´Ù. ÇÏ°íÀÚ ÇÏ´Â ÀÛ¾÷ÀÇ ÄÚµå´Â ¾Æ¸¶µµ ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

 

LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   // Ŭ¸¯ÇÑ À§Ä¡ÀÇ µµÇüÀ» ¼±ÅÃÇÑ´Ù.

}

 

LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   // ¼±ÅÃµÈ µµÇüÀÇ »óŸ¦ ±×¸°´Ù.

}

 

OnLButtonDownÀº ¼±ÅûӸ¸ ¾Æ´Ï¶ó µµÇüÀ» ±×¸± ¶§µµ »ç¿ëµÇ¹Ç·Î ÇöÀç ¸ðµå°¡ ¼±Åà »óÅÂÀÎÁö ¾Æ´Ï¸é ±×¸®±â »óÅÂÀÎÁö¸¦ ±¸ºÐÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¼±ÅÃÀ» ÇÏ´Â ¸ðµå´Â µµÇüÀ» ±×¸®´Â ¸ðµå¿Í ´Ù¸£¸ç ¸¶¿ì½º¸¦ Ŭ¸¯ÇÒ ¶§ÀÎ OnLButtonDownÀº ÀÌ ¸ðµå¿¡ µû¶ó ´Ù¸¥ µ¿ÀÛÀ» ÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ·± ¸ðµå¸¦ ±â¾ïÇÏ´Â º¯¼ö´Â NowToolÀ̸ç WM_COMMAND¿¡¼­ IDM_SHAPE_SELECT ¼±Åýà NowToolÀ» ¼±Åà ¸ðµå·Î º¯°æÇÑ´Ù.

 

LRESULT Main_OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   switch(LOWORD(wParam)) {

   case IDM_FILE_EXIT:

      DestroyWindow(hWnd);

      break;

   case IDM_SHAPE_SELECT:

      NowTool=DT_SELECT;

      break;

   ....

 

OnLButtonDownÀº NowTool º¯¼ö°ªÀ» º¸°í Á÷¼±À» ±×¸± °ÍÀÎÁö, Ÿ¿øÀ» ±×¸± °ÍÀÎÁö ¾Æ´Ï¸é ¼±ÅÃÀ» ÇÒ °ÍÀÎÁö¸¦ °áÁ¤ÇÒ °ÍÀÌ´Ù. ¼±ÅÃÀ» ÇÏ´Â ½ÃÁ¡(OnLButtonDown)°ú ¼±ÅÃÀ» º¸¿© ÁÖ´Â ½ÃÁ¡(OnPaint)ÀÌ ´Ù¸£¹Ç·Î ¼±ÅÃµÈ µµÇüÀÌ ¾î¶² °ÍÀÎÁö¸¦ º°µµ·Î ±â¾ïÇØ¾ß ÇÑ´Ù. À©µµ¿ìÁî ÇÁ·Î±×·¥Àº ¾Æ¹«¸® »ç¼ÒÇÑ °ÍÀÌ¶óµµ ¸ðµç °ÍÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. µµÇüÀ» ÀúÀåÇÏ´Â ÀÚ·á ±¸Á¶°¡ ¹è¿­À̹ǷΠ¼±ÅÃµÈ µµÇüÀÇ Ã·ÀÚ¸¦ ±â¾ïÇÏ¸é µÉ °ÍÀÌ´Ù. ÷ÀÚ¸¸ ±â¾ïÇϸé ÀÌ Ã·ÀڷκÎÅÍ ¼±Åà µµÇüÀÇ Á¾·ù¿Í ¿µ¿ª µîÀ» ¸ðµÎ ±¸ÇÒ ¼ö ÀÖ´Ù. Á¤¼öÇüÀÇ Àü¿ª º¯¼ö NowSelÀ» ¼±¾ðÇÏ°í OnCreate¿¡¼­ -1·Î ÃʱâÈ­ÇÑ´Ù.

 

int NowSel;

 

LRESULT OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   NowSel=-1;

   return 0;

}

 

NowSelÀÌ -1ÀÇ Æ¯ÀÌ°ªÀ» °¡Áø´Ù´Â °ÍÀº ¼±ÅÃµÈ µµÇüÀÌ ¾ø´Ù´Â ¶æÀÌ´Ù. ÀÌ º¯¼ö°¡ ¹è¿­ÀÇ Ã·ÀÚÀ̹ǷΠ-1ÀÌ Á¤»óÀûÀÎ °ª°ú ±¸ºÐµÇ´Â ƯÀÌ°ªÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ »óÅ¿¡¼­ 3¹ø µµÇüÀ» ¼±ÅÃÇϸé NowSelÀº 3ÀÌ µÉ °ÍÀÌ´Ù. ApiDraw´Â µµÇü Çϳª¸¸ ¼±ÅÃÇÒ ¼ö ÀÖÀ¸¹Ç·Î Á¤¼öÇü º¯¼ö Çϳª¸¸À¸·Î ¼±Åà »óŸ¦ ±â¾ïÇÒ ¼ö ÀÖ´Ù. ¸¸¾à º¹¼ö °³ÀÇ µµÇüÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù¸é ¼±ÅÃµÈ µµÇüµéÀÇ Ã·ÀÚ¸¦ ÀúÀåÇÒ Á¤¼öÇü ¹è¿­À̳ª ¿¬°á ¸®½ºÆ®°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ¾Æ´Ï¸é DObject ±¸Á¶Ã¼¿¡ bSelect µîÀÇ ¸â¹ö¸¦ Ãß°¡ÇÏ°í ÀÌ ¸â¹ö¿¡ °³º° µµÇüÀÇ ¼±Åà »óŸ¦ ±â¾ïÇϵµ·Ï ÇÒ ¼öµµ ÀÖ´Ù.

¼±Åà ¸ðµå°¡ Á¤ÀǵǾú°í ¼±Åà »óŸ¦ ±â¾ïÇÒ º¯¼ö°¡ ¸¸µé¾îÁ³À¸¹Ç·Î ÀÌÁ¦ ½ÇÁ¦ ¼±Åà Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ. ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´©¸£¸é Ä¿¼­ ¾Æ·¡ÀÇ µµÇüÀ» ¼±Åà »óÅ·Π¸¸µé¾î¾ß Çϴµ¥ ÀÌ ÀÛ¾÷À» ÇÏ·Á¸é ¸ÕÀú ƯÁ¤ ÁÂÇ¥ ¾Æ·¡¿¡ ÀÖ´Â µµÇüÀÌ ´©±¸Àΰ¡¸¦ Á¶»çÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ÁÖ¾îÁø ÁÂÇ¥·ÎºÎÅÍ µµÇüÀÇ Ã·ÀÚ¸¦ ã´Â´Ù.

 

int FindObject(int x, int y)

{

   int idx;

   POINT pt;

 

   pt.x=x;

   pt.y=y;

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

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

          return idx;

      }

   }

   return -1;

}

 

arObj ¹è¿­À» ¼øȸÇϸ鼭 x, y°¡ µµÇü ³»ºÎ¿¡ Àִ ù ¹ø° µµÇüÀ» ã¾Æ ±× ÷ÀÚ¸¦ ¸®ÅÏÇÏ¸ç ¸¸¾à Á¶°Ç¿¡ ¸Â´Â µµÇüÀÌ ¹ß°ßµÇÁö ¾ÊÀ» °æ¿ì -1À» ¸®ÅÏÇÑ´Ù. ÁÖ¾îÁø ÁÂÇ¥°¡ µµÇü ³»ºÎÀÎÁö¸¦ Á¶»çÇϱâ À§ÇØ PtInRect ÇÔ¼ö¸¦ »ç¿ëÇß´Ù. ÀÌ ÇÔ¼öÀÇ µ¿ÀÛ¿¡¼­ ´«¿©°Ü º¼ °ÍÀº arObj ¹è¿­À» ¼øȸÇÒ ¶§ ³¡¿¡¼­ºÎÅÍ ¾ÕÂÊÀ¸·Î ¼øȸ¸¦ ÇÑ´Ù´Â Á¡ÀÌ´Ù. ÃÖ±Ù¿¡ Ãß°¡µÈ µµÇüÀÌ È­¸éÀÇ À§ÂÊ¿¡ ÀÖÀ¸¹Ç·Î °¡±ÞÀûÀÌ¸é »ç¿ëÀÚ ½Ã¼±ÂÊ¿¡ °¡±î¿î µµÇüÀÌ ¼±ÅõǾî¾ß Çϱ⠶§¹®ÀÌ´Ù. ½ÇÁ¦·Î µµÇüÀ» ¼±ÅÃÇÏ´Â OnLButtonDownÀÇ ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   int TempSel;

 

   if (NowTool==DT_SELECT) {

      TempSel=FindObject(LOWORD(lParam),HIWORD(lParam));

      if (NowSel != TempSel) {

         NowSel=TempSel;

          InvalidateRect(hWnd,NULL,TRUE);

          UpdateWindow(hWnd);

      }

   } else {

      sx=LOWORD(lParam);

      sy=HIWORD(lParam);

      oldx=sx;

      oldy=sy;

      DragMode=DM_DRAW;

   }

   SetCapture(hWnd);

   return 0;

}

 

ÇöÀç ¸ðµå°¡ DT_SELECTÀÏ ¶§ FindObject·Î Ŭ¸¯ÇÑ ÁöÁ¡ÀÇ µµÇüÀ» ã¾Æ º»´Ù. °Ë»öµÈ µµÇüÀÇ Ã·ÀÚ¸¦ NowSel¿¡ ¹Ù·Î ´ëÀÔÇÏÁö ¾Ê°í TempSelÀ̶ó´Â Áß°£ º¯¼ö¿¡ ´ëÀÔÇÑ ÈÄ ºñ±³ÇÏ´Â ÀÌÀ¯´Â ¶È°°Àº µµÇüÀ» µÎ ¹ø ¼±ÅÃÇÒ ¶§ ºÒÇÊ¿äÇÑ È­¸é ±×¸®±â¸¦ ÇÏÁö ¾Êµµ·Ï Çϱâ À§Çؼ­ÀÌ´Ù. FindObject·Î °Ë»öÇÑ °á°ú°¡ ÇöÀç ¼±Åà µµÇüÀÎ NowSel°ú ´Ù¸¦ ¶§¸¸ È­¸éÀ» ´Ù½Ã ±×¸®µµ·Ï Çß´Ù. ¸¸¾à ÀÌ Ã³¸®¸¦ ÇÏÁö ¾ÊÀ¸¸é µµÇü À§¿¡¼­°Ç ºó ¿µ¿ª¿¡¼­°Ç ¸¶¿ì½º¸¦ Ŭ¸¯ÇÒ ¶§¸¶´Ù Àüü È­¸éÀÌ °è¼Ó ´Ù½Ã ±×·ÁÁú °ÍÀÌ´Ù.

È­¸éÀ» ´Ù½Ã ±×¸± ¶§´Â ¹«È¿È­¸¸ ½ÃÅ°¸é µÈ´Ù. OnPaint¿¡¼­ NowSelÀÇ °ªÀ» ÂüÁ¶ÇÏ¿© ¼±Åà µµÇüÀ» ÀûÀýÈ÷ ±×·ÁÁÙ °ÍÀÌ´Ù. È­¸é¿¡ ¾î¶² º¯È­°¡ ¹ß»ýÇÒ ¶§ È­¸éÀ» Á÷Á¢ °Çµå¸± ÇÊ¿ä°¡ ¾øÀ¸¸ç OnPaint°¡ ÂüÁ¶ÇÏ´Â °ª Áß Çϳª¸¦ º¯°æÇÏ°í ¹«È¿È­ÇÑ´Ù. UpdateWindow È£ÃâÀº ¼±Åà »óŸ¦ Áï½Ã ±×¸®µµ·Ï Çϴµ¥ ¼±Åà ÈÄ °ð¹Ù·Î À̵¿Çϰųª Å©±â¸¦ º¯°æÇÒ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. À̵¿ÇÒ ¶§ ¾î¶² µµÇüÀÌ À̵¿ ´ë»óÀÎÁö ºÐ¸íÈ÷ Ç¥½ÃÇØ¾ß ÇϹǷΠ¼±Åà »óÅ°¡ ¹Ù²ð ¶§´Â °ð¹Ù·Î È­¸éÀ» °»½ÅÇϵµ·Ï Çß´Ù.

¿©±â±îÁö Äڵ带 ÀÛ¼ºÇÏ¸é ³»ºÎÀûÀ¸·Î ¼±ÅÃÀº ¿Ïº®ÇÏ°Ô ÀÌ·ç¾îÁö¸ç ¼±Åÿ¡ ÀÇÇØ NowSelÀÌ Àß °ü¸®µÇ°í ÀÖÁö¸¸ ¾ÆÁ÷ ¼±Åà »óÅ°¡ È­¸é¿¡ º¸ÀÌÁö´Â ¾Ê´Â´Ù. È­¸é¿¡ ¼±Åà »óŸ¦ Ãâ·ÂÇϱâ Àü¿¡ ¼±ÅÃÀ» º¯°æÇÏ´Â ÄÚµåµéÀÌ Á¦´ë·Î µ¿ÀÛÇÏ´ÂÁöºÎÅÍ Å×½ºÆ®ÇØ º¸ÀÚ. ¼±ÅÃÀÌ º¯°æµÇ´Â ½ÃÁ¡¿¡ ´ÙÀ½ Å×½ºÆ® Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   int TempSel;

 

   if (NowTool==DT_SELECT) {

      TempSel=FindObject(LOWORD(lParam),HIWORD(lParam));

      if (NowSel != TempSel) {

          NowSel=TempSel;

          InvalidateRect(hWnd,NULL,TRUE);

          UpdateWindow(hWnd);

          TCHAR str[128];

          wsprintf(str,"NowSel=%d",NowSel);

          SetWindowText(GetParent(hWnd),str);

      }

   } else {

 

NowSel º¯¼ö°ªÀ» ¸ÞÀÎ À©µµ¿ìÀÇ Å¸ÀÌƲ ¹Ù¿¡ Ãâ·ÂÇØ ºÃ´Âµ¥ ¾Õ¿¡¼­ ¸¸µç ÄÚµåµéÀÌ ÀÌ»ó¾øÀÌ Àß µ¿ÀÛÇÑ´Ù¸é NowSel º¯¼ö°¡ Á¤È®ÇÑ ¼±Åà »óŸ¦ ±â¾ïÇÒ °ÍÀÌ´Ù. ÀÌ·± ½ÄÀ¸·Î »õ·Î ÀÛ¼ºÇÑ ÄÚµåµéÀº Áß°£ Å×½ºÆ®¸¦ ÇØ º¸°í ´ÙÀ½ ´Ü°è·Î ÁøÇàÇØ¾ß ½Å·Ú¼ºÀÖ´Â Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ±»ÀÌ µð¹ö°Å¸¦ µ¹·Á º¸Áö ¾Ê´õ¶óµµ ŸÀÌƲ¹Ù¿¡ º¯¼ö°ª¸¸ Âï¾îº¸´Â °£´ÜÇÑ ¹æ¹ýÀ¸·Î È®ÀÎ °¡´ÉÇÏ´Ù. Å×½ºÆ® ÄÚµåÀ̹ǷΠÁ¡°ËÀÌ ³¡³­ ÈÄ¿¡´Â ¹°·Ð »èÁ¦ÇØ¾ß ÇÑ´Ù.