¶ó.µµÇü Á¤·Ä

ĵ¹ö½º¿¡ ±×·ÁÁø µµÇüµéÀº ¼öÁ÷ÀûÀÎ ¼ø¼­¸¦ °¡Áö°í ÀÖ¾î ¸ÕÀú ±×·ÁÁø µµÇüÀÌ ³ªÁß¿¡ ±×·ÁÁø µµÇü¿¡ ÀÇÇØ °¡·ÁÁø´Ù. µµÇü°£ÀÇ ¾Æ·¡ À§°¡ Á¸ÀçÇÏ´Â ÀÌÀ¯´Â OnPaint¿¡¼­ ¹è¿­À» ¼ø¹æÇâÀ¸·Î ¼øÈ¸Çϸ鼭 ¹è¿­ÀÇ ¾ÕÂÊ¿¡ ÀÖ´Â µµÇüÀ» ¸ÕÀú ±×¸®°í µÚÂÊÀÇ µµÇüÀ» ³ªÁß¿¡ ±×¸®±â ¶§¹®ÀÌ´Ù. ÀÌ ¼ø¼­¸¦ º¯°æÇÏ´Â ±â´ÉÀ» Á¤·ÄÀ̶ó Çϴµ¥ µµÇüÀÇ ¼ø¼­¸¦ Á¶Á¤ÇÏ¿© ¼öÁ÷ÀûÀÎ ¹èÄ¡ »óŸ¦ ¹Ù²Ù´Â ±â´ÉÀÌ´Ù. ¹è¿­»óÀÇ ¼ø¼­¸¸ ¹Ù²Ù°í ´Ù½Ã ±×¸®¸é È­¸é»óÀÇ ¼ø¼­µµ ¹Ù²î°Ô µÈ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ¹è¿­»óÀÇ µµÇüÀ» À̵¿½ÃÄÑ ¼ø¼­¸¦ º¯°æÇÑ´Ù.

 

void MoveObjectInArray(int src,int dest)

{

   DObject *tObject=arObj[src];

   size_t len;

 

   len=abs(src-dest)*sizeof(DObject *);

   if (src > dest) {

      memmove(arObj+dest+1,arObj+dest,len);

   } else {

      memmove(arObj+src,arObj+src+1,len);

   }

   arObj[dest]=tObject;

}

 

À̵¿ ¹æÇâ¿¡ µû¶ó memmove·Î Æ÷ÀÎÅ͸¦ À̵¿½ÃÄÑ ºó ÀÚ¸®¸¦ ¸¸µé°í ºó ÀÚ¸®¿¡ tObject¸¦ ´ëÀÔÇß´Ù. arObj ¹è¿­¿¡ ±â·ÏµÈ °ÍÀº DObject ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍÀ̹ǷΠÀÌ Æ÷ÀÎÅ͸¸ À̵¿½ÃŰ¸é µÈ´Ù. Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â °÷¿¡ ÀÖ´Â µ¿Àû ÇÒ´çµÈ ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ±³È¯ÇÒ ÇÊ¿ä´Â ¾ø´Ù. À̰ÍÀÌ ¹Ù·Î Æ÷ÀÎÅ͸¦ ¾µ ¶§ÀÇ ÀÌÁ¡Àε¥ ±¸Á¶Ã¼°¡ ¾Æ¹«¸® Ä¿µµ Æ÷ÀÎÅ͸¸ Á¶ÀÛÇÏ¸é µÈ´Ù. ÆË¾÷ ¸Þ´º¿¡ µµÇüÀ» Á¤·ÄÇÏ´Â Ç׸ñµéÀÌ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ĵ¹ö½ºÀÇ OnCommand¿¡¼­ ÀÌ ¸Þ´º Ç׸ñµéÀÇ ¸í·É´ë·Î µµÇüÀ» ±³Ã¼ÇÑ´Ù.

 

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

{

   switch(LOWORD(wParam)) {

   ....

   case IDM_POPUP_FRONT:

      if (NowSel != -1 && NowSel < arNum-1) {

          MoveObjectInArray(NowSel,NowSel+1);

          NowSel=NowSel+1;

          InvalidateRect(hWnd,NULL,TRUE);

      }

      break;

   case IDM_POPUP_BACK:

      if (NowSel != -1 && NowSel > 0) {

          MoveObjectInArray(NowSel,NowSel-1);

          NowSel=NowSel-1;

          InvalidateRect(hWnd,NULL,TRUE);

      }

      break;

   case IDM_POPUP_MOSTFRONT:

      if (NowSel != -1 && NowSel < arNum-1) {

          MoveObjectInArray(NowSel,arNum-1);

          NowSel=arNum-1;

          InvalidateRect(hWnd,NULL,TRUE);

      }

      break;

   case IDM_POPUP_MOSTBACK:

      if (NowSel != -1 && NowSel > 0) {

          MoveObjectInArray(NowSel,0);

          NowSel=0;

          InvalidateRect(hWnd,NULL,TRUE);

      }

      break;

   }

   return 0;

}

 

¸ðµç Á¤·Ä ¸í·ÉÀº ÀÏ´Ü ¼±ÅÃµÈ µµÇüÀÌ ÀÖÀ» ¶§¸¸ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç ¶ÇÇÑ Á¤·Ä ¸í·Éº°·Î ¼±Åà µµÇüÀÇ ¼ø¼­°ªÀÌ Á¶°Ç¿¡ ¸Â¾Æ¾ß ÇÑ´Ù. °¡·É µµÇüÀ» ¼öÁ÷ À§ÂÊÀ¸·Î À̵¿½Ã۱â À§Çؼ­´Â ¹è¿­»óÀÇ µÚ·Î À̵¿ÇØ¾ß Çϴµ¥ ÀÌ µµÇüÀÌ ÀÌ¹Ì ¹è¿­ÀÇ Á¦ÀÏ ¸¶Áö¸·¿¡ ÀÖ´Ù¸é ´õ ÀÌ»ó µÚ·Î º¸³¾ ¼ö ¾øÀ» °ÍÀÌ´Ù. ¸¶Âù°¡Áö·Î ¼öÁ÷ ¾Æ·¡ÂÊÀ¸·Î À̵¿Çϱâ À§Çؼ­´Â ¹è¿­ÀÇ ¾ÕÂÊÀ¸·Î À̵¿ÇØ¾ß Çϴµ¥ ÀÌ¹Ì Á¦ÀÏ ¾Õ¿¡ ÀÖ´Ù¸é ÀÌ ¿ª½Ã Á¤·ÄÇÒ ¼ö ¾ø´Ù.

Á¶°Ç¿¡ ¸ÂÀ» °æ¿ì À̵¿ÇÏ·Á´Â À§Ä¡·Î MoveObjectInArray ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù. ÀÌ ÇÔ¼ö¿¡ ÀÇÇØ arObj ¹è¿­ÀÇ Æ÷ÀÎÅ͵éÀÌ ¼ø¼­´ë·Î À̵¿ÇÒ °ÍÀÌ´Ù. ¹è¿­ »ó¿¡¼­ µµÇüÀ» À̵¿½Ã۰í À̵¿ÇÑ ÈÄÀÇ µµÇüÀ» ¼±Åà »óÅ·Π¸¸µç ÈÄ È­¸éÀ» ´Ù½Ã ±×¸®±â¸¸ Çϸé È­¸é¿¡µµ Á¤·Ä °á°ú°¡ Àû¿ëµÈ´Ù.

¸ÞÀÎ ¸Þ´º¿¡µµ µ¿ÀÏÇÑ ¸í·ÉµéÀÌ Àִµ¥ ÀÌÁßÀ¸·Î Äڵ带 ÀÛ¼ºÇÒ ÇÊ¿ä¾øÀÌ Äµ¹ö½º¿¡°Ô ¸í·ÉÀ» Àü´ÞÇÏ¸é µÈ´Ù. Á¤·Ä¿¡ °ü·ÃµÈ ¸ðµç 󸮴 ĵ¹ö½º°¡ ÇÏ°í ¸ÞÀÎ À©µµ¿ì´Â ¸í·ÉÀÇ Á߰踸 ÇÒ »ÓÀÌ´Ù.

 

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

{

   switch(LOWORD(wParam)) {

   ....

   case IDM_SHAPE_FRONT:

      SendMessage(hCanvas,WM_COMMAND,MAKEWPARAM(IDM_POPUP_FRONT,0),0);

      break;

   case IDM_SHAPE_BACK:

      SendMessage(hCanvas,WM_COMMAND,MAKEWPARAM(IDM_POPUP_BACK,0),0);

      break;

   case IDM_SHAPE_MOSTFRONT:

      SendMessage(hCanvas,WM_COMMAND,MAKEWPARAM(IDM_POPUP_MOSTFRONT,0),0);

      break;

   case IDM_SHAPE_MOSTBACK:

      SendMessage(hCanvas,WM_COMMAND,MAKEWPARAM(IDM_POPUP_MOSTBACK,0),0);

      break;

 

¿©±â±îÁö Äڵ带 ÀÛ¼ºÇϸé Á¤·Ä ±â´ÉÀº ¿Ï¼ºµÇ¾ú´Ù. ³²Àº ÀÛ¾÷Àº ¼±ÅÃµÈ µµÇüÀÇ À§Ä¡¿¡ µû¶ó Á¤·Ä °ü·Ã ¸Þ´º Ç׸ñÀ» °ü¸®ÇÏ´Â °ÍÀÌ´Ù. Á¤·ÄÇÒ ¼ö ¾ø´Â µµÇü¿¡ ´ëÇØ¼­´Â ¾Æ¿¹ ¸Þ´º Ç׸ñÀ» »ç¿ë ±ÝÁö½ÃŰ´Â °ÍÀÌ ÁÁ´Ù. ÆË¾÷ ¸Þ´º´Â ¸Þ´º¸¦ ¿­±â Àü¿¡ Á¶°ÇÀ» Á¡°ËÇØ º¸°í »ç¿ëÇÒ ¼ö ¾ø´Â Ç׸ñ¸¸ »ç¿ë ±ÝÁö½ÃŰ¸é µÈ´Ù.

 

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

{

   ....

   if (NowSel == -1 || NowSel >= arNum-1) {

      EnableMenuItem(hPopup, IDM_POPUP_FRONT, MF_BYCOMMAND | MF_GRAYED);

      EnableMenuItem(hPopup, IDM_POPUP_MOSTFRONT, MF_BYCOMMAND | MF_GRAYED);

   }

   if (NowSel == -1 || NowSel <= 0) {

      EnableMenuItem(hPopup, IDM_POPUP_BACK, MF_BYCOMMAND | MF_GRAYED);

      EnableMenuItem(hPopup, IDM_POPUP_MOSTBACK, MF_BYCOMMAND | MF_GRAYED);

   }

 

   TrackPopupMenu(hPopup, TPM_LEFTALIGN, LOWORD(lParam), HIWORD(lParam),

      0, hWnd, NULL);

   DestroyMenu(hMenu);

   return 0;

}

 

¼±ÅÃµÈ µµÇüÀÌ ¹è¿­ÀÇ Á¦ÀÏ ³¡¿¡ ÀÖ´Ù¸é ÀÌ µµÇüÀº È­¸é»óÀÇ Á¦ÀÏ À§¿¡ ÀÖÀ¸¹Ç·Î ´õ ÀÌ»ó À§·Î À̵¿ÇÒ ¼ö ¾ø´Ù. ¸ÞÀÎ ¸Þ´ºÀÇ °ü¸® Äڵ嵵 ºñ½ÁÇ쵂 ÆË¾÷°ú´Â ´Þ¸® ¸Å¹ø ¸Þ´º¸¦ ¸¸µå´Â °ÍÀÌ ¾Æ´Ï¶ó ¸ÞÀÎ À©µµ¿ìÀÇ »ó´Ü¿¡ ºÎÂøµÇ¾î Àֱ⠶§¹®¿¡ »ç¿ë ±ÝÁöµÈ Ç׸ñÀ» ¸í½ÃÀûÀ¸·Î Çã°¡ÇÏ´Â Äڵ嵵 ÇÊ¿äÇÏ´Ù´Â °ÍÀÌ ´Ù¸£´Ù.

 

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

{

   ....

   if (NowSel != -1 && NowSel < arNum-1) {

      EnableMenuItem((HMENU)wParam, IDM_SHAPE_FRONT, MF_BYCOMMAND | MF_ENABLED);

      EnableMenuItem((HMENU)wParam, IDM_SHAPE_MOSTFRONT, MF_BYCOMMAND | MF_ENABLED);

   } else {

      EnableMenuItem((HMENU)wParam, IDM_SHAPE_FRONT, MF_BYCOMMAND | MF_GRAYED);

      EnableMenuItem((HMENU)wParam, IDM_SHAPE_MOSTFRONT, MF_BYCOMMAND | MF_GRAYED);

   }

   if (NowSel != -1 && NowSel > 0) {

      EnableMenuItem((HMENU)wParam, IDM_SHAPE_BACK, MF_BYCOMMAND | MF_ENABLED);

      EnableMenuItem((HMENU)wParam, IDM_SHAPE_MOSTBACK, MF_BYCOMMAND | MF_ENABLED);

   } else {

      EnableMenuItem((HMENU)wParam, IDM_SHAPE_BACK, MF_BYCOMMAND | MF_GRAYED);

      EnableMenuItem((HMENU)wParam, IDM_SHAPE_MOSTBACK, MF_BYCOMMAND | MF_GRAYED);

   }

   return 0;

}

 

¸ÞÀÎ ¸Þ´º´Â óÀ½ Çѹø ¸¸µé¾îÁö°í °è¼Ó »ç¿ëÇϹǷΠÇѹø »ç¿ë ±ÝÁö ½ÃŲ ¸Þ´º Ç׸ñÀº º°´Ù¸¥ Á¶Ä¡¸¦ ÃëÇÏÁö ¾Ê´Â ÇÑ »óŰ¡ º¯°æµÇÁö ¾Ê±â ¶§¹®¿¡ Á¶°ÇÀÌ ¸ÂÀ» °æ¿ì »ç¿ë Çã°¡µµ ÇØ¾ß ÇÑ´Ù.