¶ó.¿¹¿Ü ó¸®

¿©±â±îÁö À̵¿°ú Å©±â º¯°æ 󸮸¦ ÇØ º¸¾Ò´Âµ¥ ±×·° Àú·° Àß µ¿ÀÛÇÏ´Â °Í °°Áö¸¸ Å×½ºÆ®ÇØ º¸¸é ¸¹Àº ¹®Á¦Á¡ÀÌ ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¿ì¼± À̵¿À» ½ÃÀÛÇÒ ¶§ Ä¿¼­¸¦ ĸóÇϱ⠶§¹®¿¡ ĵ¹ö½º ¹Ù±ùÀÇ º¸ÀÌÁö ¾Ê´Â ¿µ¿ªÀ¸·Î ¿Å°Ü¹ö¸± ¼ö ÀÖ´Â ¹®Á¦Á¡ÀÌ ÀÖ´Ù. ĵ¹ö½ºÀÇ ¿À¸¥ÂÊÀ̳ª ¾Æ·¡ÂÊÀ¸·Î »ç¶óÁø µµÇüÀº À©µµ¿ìÀÇ Å©±â¸¦ Ű¿ö ´Ù½Ã º¼ ¼ö ÀÖÁö¸¸ À½¼ö ¿µ¿ªÀ¸·Î »ç¶óÁ® ¹ö¸° µµÇüÀº º¸ÀÌÁöµµ ¾ÊÀ» »Ó¸¸ ¾Æ´Ï¶ó ´Ù½Ã ²¨³»¿Ã ¹æ¹ýÀÌ ¾ø¾î ÀÖÀ¸³ª ¸¶³ªÇÑ µµÇüÀÌ µÈ´Ù. ĵ¹ö½º ¹Ù±ùÀ¸·Î´Â µµÇüÀ» À̵¿½ÃŰÁö ¸øÇϵµ·Ï ÇÒ Çʿ䰡 ÀÖ´Ù.

Å©±â º¯°æÀÇ °æ¿ì´Â ¹®Á¦°¡ ´õ ½É°¢ÇÏ´Ù. °¢ º¯ÀÇ ÁÂÇ¥°¡ º¯°æµÊÀ¸·Î½á Á¤±ÔÈ­ ¿øÄ¢ÀÌ À§¹ÝµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¿ìÇÏÇâÀ¸·Î ±×·ÁÁø Á÷¼±ÀÇ 8¹ø Æ®·¡Ä¿¸¦ Àâ°í 1¹ø Æ®·¡Ä¿º¸´Ù ´õ ¿ÞÂÊ À§·Î ¿Ã·Á ¹ö¸®¸é ÀÌ Á÷¼±Àº Á¤±ÔÈ­µÇ¾î ÀÖÁö ¾ÊÀ¸¹Ç·Î ´Ù½Ã ¼±ÅÃÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. µµÇüÀÇ Å©±â°¡ º¯°æµÉ ¶§´Â »õ·Î ¹Ù²ï µµÇüÀÇ ¿µ¿ªµµ Á¤±ÔÈ­ Á¶°ÇÀ» ¸¸Á·Çϵµ·Ï ÇØ¾ß ÇÑ´Ù. À̵¿°ú Å©±â º¯°æ½ÃÀÇ ¹®Á¦Á¡À» ÇØ°áÇÏ´Â ½ÃÁ¡Àº µµÇüÀÇ ¿µ¿ªÀÌ »õ·Î °áÁ¤µÇ´Â OnLButtonUpÀÌ´Ù.

 

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

{

   RECT crt,irt;

   ....

   if (DragMode==DM_MOVE || DragMode==DM_SIZE) {

      GetClientRect(hWnd,&crt);

      InflateRect(&crt,-10,-10);

      IntersectRect(&irt,&crt,&dObj.rt);

      if (!IsRectEmpty(&irt)) {

         arObj[NowSel]->rt=dObj.rt;

      }

      InvalidateRect(hWnd,NULL,TRUE);

   }

   DragMode=DM_NONE;

   ReleaseCapture();

   return 0;

}

 

ĵ¹ö½ºÀÇ ÀÛ¾÷ ¿µ¿ªÀ» ¾ÈÂÊÀ¸·Î 10Çȼ¿¸¸Å­ Ãà¼Ò½ÃŲ ÈÄ Àӽà °´Ã¼ÀÇ ¿µ¿ªÀÌ ÀÌ ¾È¿¡ ÀÖÀ» ¶§¸¸ À̵¿ ¹× Å©±â Á¶Á¤À» Çã°¡ÇÏ¸ç ±×·¸Áö ¾ÊÀ» °æ¿ì ¼±Åà °´Ã¼ÀÇ rt ´ëÀÔ¹®À» ½ÇÇàÇÏÁö ¾Êµµ·Ï ÇÏ¿© µ¿ÀÛÀ» Ãë¼ÒÇØ ¹ö¸°´Ù. ¿©±â¼­ 10Çȼ¿À̶ó´Â »ó¼ö°ªÀº µµÇüÀ» ÃæºÐÈ÷ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ¿©À¯ºÐÀ¸·Î ¼³Á¤ÇÑ ÀÓÀǰªÀε¥ Á» ´õ Å« °ªÀ» Áְųª ¾Æ´Ï¸é µµÇüÀÇ Å©±â¿¡ ºñ·ÊÀûÀÎ °ªÀ¸·Î ¹Ù²Ü ¼öµµ ÀÖ´Ù.

ÀÌ Äڵ忡 ÀÇÇØ Á¤±ÔÈ­ ¿øÄ¢µµ Ç×»ó ÁöÄÑÁö´Âµ¥ IntersectRect, IsRectEmpty ÇÔ¼ö´Â Á¤±ÔÈ­µÇÁö ¾ÊÀº »ç°¢ÇüÀº ºó ¿µ¿ªÀ¸·Î °£ÁÖÇϱ⠶§¹®ÀÌ´Ù. ÀÌ·± ¿¹¿Ü 󸮸¦ ¼³°èÇÒ ´ç½ÃºÎÅÍ ¹Ì¸® »ý°¢Çϱâ´Â ¹«Ã´ ¾î·Æ°í ´ë°³ÀÇ °æ¿ì Å×½ºÆ®¸¦ ÇÏ´Â Áß¿¡ ¹®Á¦Á¡À» ¹ß°ßÇÏ°Ô µÈ´Ù. ¹°·Ð °æÇèÀÌ ¸¹Àº »ç¶÷Àº ¼³°èÇÒ ¶§ºÎÅÍ ¹®Á¦¸¦ ¿¹ÃøÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ¿¹¿Ü 󸮿¡ »ç°¢Çü °ü·Ã ÇÔ¼ö¸¦ ¿©·¯ °³ »ç¿ëÇߴµ¥ °£´ÜÇÑ ÇÔ¼öµéÀ̶ó C ÄÚµå·Î Ç®¾î¾µ ¼öµµ ÀÖ´Ù.

 

   if (DragMode==DM_MOVE || DragMode==DM_SIZE) {

      SwapResult=NormalizeRect(&dObj.rt);

      GetClientRect(hWnd,&crt);

//    InflateRect(&crt,-10,-10);

      crt.left-=-10;

      crt.top-=-10;

      crt.right+=-10;

      crt.bottom+=-10;

 

//    IntersectRect(&irt,&crt,&dObj.rt);

      irt.left=max(crt.left,dObj.rt.left);

      irt.top=max(crt.top,dObj.rt.top);

      irt.right=min(crt.right,dObj.rt.right);

      irt.bottom=min(crt.bottom,dObj.rt.bottom);

 

//    if (!IsRectEmpty(&irt)) {

      if (!(irt.left >= irt.right || irt.top >= irt.bottom)) {

 

±×·¯³ª ÀÌ·¸°Ô Äڵ带 ÀÛ¼ºÇÏ¸é ¼Ò½º°¡ ±æ¾îÁú »Ó¸¸ ¾Æ´Ï¶ó °¢ ÁÙÀÌ ¾î¶² ÀÛ¾÷À» ÇÏ´ÂÁö ¾ó¸¥ ¾Ë¾Æ º¸±â Èûµé¾î °¡µ¶¼ºÀÌ ¶³¾îÁö´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. SetRect, PtInRect, IsRectEmpty °°Àº °£´ÜÇÑ µ¿ÀÛÀÌ¶óµµ °¡±ÞÀûÀÌ¸é ¿î¿µÃ¼Á¦°¡ Á¦°øÇÏ´Â API ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÄÚµå ÀÛ¼ºµµ ½±°í ÀÌÈÄ Äڵ带 °ü¸®Çϱ⵵ ½±´Ù.

¿¹¿Ü 󸮿¡ ÀÇÇØ ĵ¹ö½º ¹Ù±ùÀ¸·Î ³ª°¡°Å³ª Á¤±ÔÈ­µÇÁö ¾Ê´Â »óŰ¡ µÉ ¶§ µ¿ÀÛÀ» Ãë¼ÒÇÏ´Â ½ÄÀ¸·Î 1Â÷ÀûÀÎ ¿¡·¯ 󸮸¦ Çß´Ù. ÀÌ Ã³¸®¿¡ ÀÇÇØ ÇÁ·Î±×·¥ÀÌ À߸ø µ¿ÀÛÇѴٰųª µµÇüÀÌ »ç¶óÁö´Â Å« ¹®Á¦Á¡Àº ÇØ°áÇßÁö¸¸ ÇÁ·Î±×·¥ÀÇ °ú´Ù ¹æ¾î·Î ÀÎÇØ »ç¿ëÀÚ´Â ´Ù¼Ò ºÒÆíÇÔÀ» ´À³¥ ¼öµµ ÀÖ´Ù. »ç¿ëÀÚ´Â ¿ìÇÏ´ÜÀ» ²ø¾î Á»ó´ÜÀ¸·Î À̵¿½Ãų ¶§ ±ÝÁö½ÃŰ´Â °Íº¸´Ù ÇÁ·Î±×·¥ÀÌ ¾Ë¾Æ¼­ Á¤±ÔÈ­ÇÏ´Â °ÍÀ» ´õ ÁÁ¾ÆÇÒ °ÍÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ ¿ä±¸ Á¶°Ç¿¡ »ç¿ëÀÚ°¡ ¸ÂÃß´Â °Íº¸´Ù´Â »ç¿ëÀÚÀÇ ÆíÁý µ¿ÀÛÀ» ÃÖ´ëÇÑ ÀÎÁ¤ÇÏ¿© ÇÁ·Î±×·¥ÀÌ ÀÚ·áÀÇ ÇüŸ¦ ¹Ù²Ù´Â °ÍÀÌ ÈξÀ ´õ ÁÁÀº Á¤Ã¥ÀÌ´Ù. ÀÌ Á¤Ã¥À» ±¸ÇöÇϱâ À§ÇØ ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÏÀÚ. ¿î¿µÃ¼Á¦°¡ ÀÌ·± ÇÔ¼ö¸¦ Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î Á÷Á¢ ¸¸µé¾î ½á¾ß ÇÑ´Ù.

 

void NormalizeRect(RECT *prt)

{

   int t;

 

   if (prt->left > prt->right) {

      t=prt->left;

      prt->left=prt->right;

      prt->right=t;

   }

   if (prt->top > prt->bottom) {

      t=prt->top;

      prt->top=prt->bottom;

      prt->bottom=t;

   }

}

 

ÀÌ ÇÔ¼ö´Â Àü´ÞµÈ RECT ±¸Á¶Ã¼¸¦ °­Á¦·Î Á¤±ÔÈ­Çϴµ¥ ¹æ¹ýÀº °£´ÜÇÏ´Ù. left¿Í right¸¦ ºñ±³ÇØ º¸°í ¸¸¾à left°¡ rightº¸´Ù ´õ ¿À¸¥ÂÊ¿¡ ÀÖ´Ù¸é µÎ °ªÀ» ±³È¯ÇÏ¿© Á¤±ÔÈ­ÇÏ´Â °ÍÀÌ´Ù. ¼öÁ÷ ¹æÇâµµ ¸¶Âù°¡Áö·Î top°ú bottomÀÇ °ªÀ» ±³È¯ÇÏ¿© Á¤±ÔÈ­ÇÑ´Ù. OnLButtonUp¿¡¼­ ÆíÁýµÈ °á°ú¸¦ °´Ã¼¿¡ ´ëÀÔÇϱâ Àü¿¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Àӽà °´Ã¼ÀÇ ¿µ¿ªÀ» Á¤±ÔÈ­ÇÏ¸é °á°ú¸¦ ´ëÀÔ¹Þ´Â µµÇüµµ Ç×»ó Á¤±ÔÈ­ Á¶°ÇÀ» ¸¸Á·ÇÑ´Ù.

 

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

{

   ....

   if (DragMode==DM_MOVE || DragMode==DM_SIZE) {

      NormalizeRect(&dObj.rt);

 

ÀÌ »óÅ·ΠÅ×½ºÆ®ÇØ º¸¸é Ÿ¿ø, »ç°¢ÇüÀº ¹æÇâÀ» ¹Ù²Ù¾î µå·¡±×ÇØµµ Á¤±ÔÈ­°¡ Àß µÇÁö¸¸ Á÷¼±ÀÇ °æ¿ì Á¤±ÔÈ­µÇ¸é¼­ ¹æÇâÀÌ ¹Ù²î´Â ºÎÀÛ¿ëÀÌ ÀÖ´Ù. °­Á¦ Á¤±ÔÈ­¸¦ ÇßÀ» °æ¿ì Á¤±ÔÈ­ °á°ú¿¡ µû¶ó Á÷¼±ÀÇ Flagµµ °°ÀÌ Á¶Á¤ÇØ¾ß ÇÏ¸ç ±×·¯±â À§Çؼ­´Â Á¤±ÔÈ­½Ã¿¡ ¼öÆò, ¼öÁ÷ ÂÊÀ¸·Î ±³È¯µÈ °ªÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. NormalizeRect ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

int NormalizeRect(RECT *prt)

{

   int t;

   int SwapResult=0;

 

   if (prt->left > prt->right) {

      t=prt->left;

      prt->left=prt->right;

      prt->right=t;

      SwapResult|=1;

   }

   if (prt->top > prt->bottom) {

      t=prt->top;

      prt->top=prt->bottom;

      prt->bottom=t;

      SwapResult|=2;

   }

   return SwapResult;

}

 

SwapResultÀÇ ºñÆ® 0¿¡ ¼öÆò ±³È¯ ¿©ºÎ, ºñÆ® 1¿¡ ¼öÁ÷ ±³È¯ ¿©ºÎ¸¦ ¸®ÅÏÇÑ´Ù. µÎ °³ÀÇ ¸®ÅϰªÀ» ³Ñ±æ ¼ö ¾ø±â ¶§¹®¿¡ Á¤¼ö°ªÀÇ °¢ ºñÆ®¿¡ ±³È¯ ¿©ºÎ¸¦ ±â·ÏÇØ¼­ ³Ñ±â´Â °ÍÀÌ´Ù. µµÇüÀÇ ¿ø·¡ Ç÷¡±×¿Í ¼öÆò, ¼öÁ÷ ±³È¯ ¿©ºÎ¿¡ µû¶ó ¹Ù²î¾î¾ß ÇÒ °ªÀ» Ç¥·Î ±×·Á º¸¸é ´ÙÀ½°ú °°´Ù.

 

¿ø·¡ Ç÷¡±×

¼öÆò ±³È¯½Ã

¼öÁ÷ ±³È¯½Ã

LT

RT

LB

RT

LT

RB

LB

RB

LT

RB

LB

RT

 

ÀÌ Ç¥¸¦ ±×´ë·Î ÄÚµå·Î ±¸ÇöÇÏ¸é ´ÙÀ½°ú °°¾ÆÁø´Ù. ¼öÆò, ¼öÁ÷ °¢°¢¿¡ ´ëÇØ Ç÷¡±×¸¦ Á¶Á¤Çϸé Á¤±ÔÈ­¿¡ ¸Â°Ô ¹æÇâµµ ¹Ù²î°Ô µÈ´Ù.

 

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

{

   int SwapResult;

   ....

   if (DragMode==DM_MOVE || DragMode==DM_SIZE) {

      SwapResult=NormalizeRect(&dObj.rt);

      GetClientRect(hWnd,&crt);

      InflateRect(&crt,-10,-10);

      IntersectRect(&irt,&crt,&dObj.rt);

      if (!IsRectEmpty(&irt)) {

          arObj[NowSel]->rt=dObj.rt;

          if (SwapResult & 1) {

             switch (arObj[NowSel]->Flag) {

             case DS_LT:arObj[NowSel]->Flag=DS_RT;break;

             case DS_RT:arObj[NowSel]->Flag=DS_LT;break;

             case DS_LB:arObj[NowSel]->Flag=DS_RB;break;

             case DS_RB:arObj[NowSel]->Flag=DS_LB;break;

             }

          }

          if (SwapResult & 2) {

             switch (arObj[NowSel]->Flag) {

             case DS_LT:arObj[NowSel]->Flag=DS_LB;break;

             case DS_RT:arObj[NowSel]->Flag=DS_RB;break;

             case DS_LB:arObj[NowSel]->Flag=DS_LT;break;

             case DS_RB:arObj[NowSel]->Flag=DS_RT;break;

             }

          }

      }

      InvalidateRect(hWnd,NULL,TRUE);

   }

 

ÀÌÁ¦ Å×½ºÆ®ÇØ º¸¸é Á÷¼±ÀÌ °­Á¦ Á¤±ÔÈ­µÉ ¶§ ¹æÇâµµ Àß ¹Ù²ð °ÍÀÌ´Ù. ±×·±µ¥ Äڵ尡 ³Ê¹« ±æ¾îÁ®¼­ Á¶±Ý ºÒ¸¸Àε¥ ±³È¯µÈ ¹æÇâ°ú Ç÷¡±×ÀÇ º¯°æµÈ ºÎºÐ°úÀÇ ¿¬°ü °ü°è¸¦ Àß °üÂûÇØ º¸¸é Äڵ带 Á» ´õ ¾ÐÃàÇÒ ¼ö ÀÖ´Ù. DS_LT, DS_RT, DS_LB, DS_RB Ç÷¡±×µéÀÌ ºñÆ® 0¿¡ ¼öÆò ¹æÇâ, ºñÆ® 1¿¡ ¼öÁ÷ ¹æÇâÀ» ±â·ÏÇϵµ·Ï µÇ¾î ÀÖÀ¸¹Ç·Î ±³È¯µÈ ¹æÇâ¿¡ µû¶ó ÀÌ ºñÆ®µé¸¸ ¹ÝÀü½ÃÄÑ ÁÖ¸é µÈ´Ù. Á» ´õ °£´ÜÇÑ ¿¬»ê½ÄÀº ´ÙÀ½°ú °°´Ù.

 

if (SwapResult & 1) arObj[NowSel]->Flag ^= 1;

if (SwapResult & 2) arObj[NowSel]->Flag ^= 2;

 

Å×½ºÆ®ÇØ º¸¸é Á¤È®ÇÏ°Ô µ¿ÀÛÇÔÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÄÚµåÀÇ ±æÀ̵µ ª¾ÆÁ³°í ½ÇÇà ¼Óµµµµ ÈξÀ ´õ »¡¶óÁ³À¸¹Ç·Î ¸ðµç ¸é¿¡¼­ ¾ÐÃàµÈ Äڵ尡 ´õ ÁÁ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ´õ ¾ÐÃàÇÑ´Ù¸é ´ÙÀ½ ÇÑ Áٷεµ ¾ÐÃàÇÒ ¼ö ÀÖ´Ù.

 

arObj[NowSel]->Flag ^= SwapResult;

 

SwapResultÀÇ 1ÀÎ ºñÆ® ºÎºÐ¸¸ ¼±ÅÃÀûÀ¸·Î ¹ÝÀü½ÃŰ´Â °ÍÀÌ¸ç ´Ü ÇϳªÀÇ ºñÆ® ¿¬»ê¹®À¸·Î ÀÌ ¿¬»êÀ» ÇÒ ¼ö ÀÖ´Ù. ÀÌ Äڵ尡 ¾ÕÀÇ µÎ ÁÙÂ¥¸®Äڵ庸´Ù ´õ ºü¸£°í À۾Ƽ­ Á¡¼ö¸¦ ¸Å±ä´Ù¸é °¡Àå ³ô´Ù. ±×·¯³ª ÀÌ·± ÀÌÁø ¿¬»ê ÄÚµå´Â ¾î¼Àºí¸® ÄÚµùÀÇ °æÇèÀÌ ¾ø´Ù¸é ½±°Ô »ý°¢ÇÏ±â ¾î·Æ´Ù. Àú¼öÁØ ÇÁ·Î±×·¡¹Ö °æÇèÀÇ À¯¿ë¼ºÀÌ ÀÌ·± ½ÄÀ¸·Î °¡²û µå·¯³ª´Â °æ¿ì°¡ Àִµ¥ ÀÌ·± °ÍÀ» ³»°øÀÇ Â÷À̶ó°í ÇÑ´Ù.