ĵ¹ö½º¿¡ ±×·ÁÁø µµÇüµéÀº ¼öÁ÷ÀûÀÎ ¼ø¼¸¦ °¡Áö°í ÀÖ¾î ¸ÕÀú ±×·ÁÁø µµÇüÀÌ ³ªÁß¿¡ ±×·ÁÁø µµÇü¿¡ ÀÇÇØ °¡·ÁÁø´Ù. µµÇü°£ÀÇ ¾Æ·¡ À§°¡ Á¸ÀçÇÏ´Â ÀÌÀ¯´Â 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;
}
¸ÞÀÎ ¸Þ´º´Â óÀ½ Çѹø ¸¸µé¾îÁö°í °è¼Ó »ç¿ëÇϹǷΠÇѹø »ç¿ë ±ÝÁö ½ÃŲ ¸Þ´º Ç׸ñÀº º°´Ù¸¥ Á¶Ä¡¸¦ ÃëÇÏÁö ¾Ê´Â ÇÑ »óŰ¡ º¯°æµÇÁö ¾Ê±â ¶§¹®¿¡ Á¶°ÇÀÌ ¸ÂÀ» °æ¿ì »ç¿ë Çã°¡µµ ÇØ¾ß ÇÑ´Ù.